数据结构和算法之线性结构

原文出处:数据结构和算法之线性结构     关注码农爱刷题,看更多技术文章!!!

       线性结构是一种逻辑结构,是我们编程开发工作应用最广泛的数据结构之一。线性结构是包含n个相同性质数据元素的有限序列。它的基本特征是,在数据元素的非空有限集中:

     (1)存在唯一的“最后的元素”。

     (2)存在唯一的“第一个元素”。

     (3)除最后的元素之外,其它数据元素均有唯一的“直接后继”。

     (4)除第一个元素之外,其它数据元素均有唯一的“直接前驱”。

     在实际的应用中,产生的典型线性结构有以下几种:线性表、栈、队列。

   (1)如果允许在序列任意位置进行操作,这种线性结构称为线性表。

    (2)如果只允许在序列末端进行操作,这种线性结构称为栈。

    (3)如果只允许在序列两端进行操作,这种线性结构称为队列。

      从三者的概念上可以看出,栈和队列是线性表的特定场景实现。

一、线性表

       线性表本质上还是一种抽象的逻辑概念,是线性结构逻辑概念的细分。线性表根据存储结构实现方式不同,可分为顺序表链表

       1. 顺序表

       顺序表是采用顺序存储结构实现的线性表,一组地址连续的存储单元依次存放线性表的数据元素,即以存储位置相邻表示位序相继的两个元素之间的前驱和后继关系,从而使得逻辑上相邻的两个元素在物理位置上也相邻。顺序表具有以下典型特征:

图片

       数组符合顺序表的特征,是典型的、具体的顺序表结构的应用和实现。数组继承了顺序表的特征,会为存储的元素都分配一个下标(索引),此下标是一个自增连续的,访问数组中的元素通过下标进行访问;数组下标从0开始访问,至数组长度-1结束。同时,数组作为一种基础且常见的数据结构,既频繁应用在各类算法之中,也可用于实现各种复杂数据结构。数组访问元素的时间复杂度为O(1),增删元素的时间复杂度为O(n)。

       在C和JAVA语言中,数组大小是固定的,保留了数组随机访问查询效率高的优点,避免了插入删除低的劣势。顺序表和数组虽然查询效率高,但是增删效率低下显然不能满足广泛使用的需求,于是一种能快速在任意位置插入和删除元素的线性表链表应运而出。

       2.链表

       链表是采用链式存储结构实现的线性表,和顺序表采用地址连续的存储单元不同,链表是通过一组任意的存储单元来存储线性表中的数据元素,具有以下特征:

图片

      链表根据指针域指向不同,可分为单向链表、双向链表和循环链表,循环链表又分循环单向链表和循环双向链表,具体定义如下:

图片

      其中单向链表和数组一样,是一种基础且常见的数据结构,常用于实现其他复杂数据结构。它具备链表的基本特征,插入和删除结点的时间复杂度为O(1),查找结点时间复杂度为O(n),寻找直接后继结点的时间复杂度为O(1),其他链表都是在单向链表基础上变化。

二、栈

       正如前文所说,栈是线性表的特殊实现,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。栈的特点是:先进后出,从栈顶放入元素的操作叫入栈(压栈),取出元素叫出栈(弹栈);

       入栈操作如下图: 

图片

      出栈操作如下图: 

图片

      正如线性表可以采用顺序存储结构和链式存储结构实现,栈作为线性表的特例,自然也可以使用前述两种存储结构表示, 使用顺序存储结构的栈称之为顺序栈或栈表,使用链式存储的栈称之为链栈

       栈的入栈出栈操作时间复杂度为O(1),空间复杂栈的空间复杂度取决于栈中存储的数据量。如果栈中存储的数据量与输入数据的大小成正比,那么空间复杂度为O(n),其中n为输入数据的大小。例如,在实现深度优先搜索(DFS)算法时,如果使用栈来保存搜索路径,那么空间复杂度将与输入图的大小相关,可能达到O(n)。然而,如果栈的使用是固定的,不随输入数据的大小变化,那么空间复杂度为O(1)。例如,在实现一些固定的数据结构操作时,如简单的算术运算,空间复杂度可以视为常数,因为无论输入数据多大,所需的空间是固定的。

三、队列

       队列与栈一样,也是一种线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。队列的特点是先进先出,从一端放入元素的操作称为入队,取出元素为出队其操作如下图:

图片

      队列根据存储结构表示不同,也可以分为顺序队列和链式队列,还有双端队列,其中链式队列就是通过单向链表实现的,双端队列可以通过双向链表实现。列入队和出队时间复杂度通常为O(1),空间复杂度为O(1)。

      在具体的编程语言中,大多是采用数组和链表取实现更复杂的数据结构。例如Java,通过动态数组实现了ArrayList,因为是用数组实现,其存储结构就是顺序存储的,因而具有顺序表的特征,插入删除效率低,查询元素效率高,但又不完全等同顺序表,因为它的空间是可以动态扩容的;Stack类则是通过具有线程安全的动态数组Vector实现的,具备栈先进后出的特征同时又具备线程安全性。LinkedList底层则是通过双向链表实现的,具有链表插入删除元素效率高、结点查询效率低的特征。而Java的Queue实现方式有多种,其中之一就是使用双向链表的实现LinkedList类来完成;而Deque接口是Queue接口的一个扩展,提供了在队列两端操作的方法,Deque接口的实现类包括ArrayDeque和LinkedList,因而LinkedList还可以用于双端队列的实现。

码农爱刷题

为计算机编程爱好者和从业人士提供技术总结和分享 !为前行者蓄力,为后来者探路!

9篇原创内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker入门安装及使用

docker概述 docker是一种容器技术,它提供了标准的应用镜像(包含应用和应用多需要的依赖),因此,我们可以非常轻松的在docker中安装应用,安装好的应用相当于一个独立的容器 如下图所示,为docker中…

如何将Git本地代码推送到Gitee云端仓库

如何将Git本地代码推送到Gitee云端仓库 在使用Git进行版本控制时,将本地代码推送到远程仓库是一个基本且重要的操作。本文将详细介绍如何将你的Git本地代码推送到Gitee(码云)云端仓库。Gitee是一个国内非常流行的代码托管平台,类…

Redis 执行 Lua,能保证原子性吗?

前言 小张目前在使用分布式锁 Redisson 实现一个需求。那我在想我能否自己手撸一个能用于分布式环境的锁呢?于是果然尝试。 历经一天后,小张手撸的锁终于写出来了,再次给各位看看,看给位有没有什么优化的建议: // 加…

VSCode 定义代码模板

在使用编写代码的过程中,经常会写一些固定代码段。 以 Java 为例,定义实体类时一般都会编写序列化版本号: Serial private static final long serialVersionUID 1L;这段代码是固定写法,基本不会变,如果每次都手写的…

sqlgun靶场漏洞挖掘

1.xss漏洞 搜索框输入以下代码&#xff0c;验证是否存在xss漏洞 <script>alert(1)</script> OK了&#xff0c;存在xss漏洞 2.SQL注入 经过测试&#xff0c;输入框存在SQL注入漏洞 查询数据库名 查询管理员账号密码 此处密码为MD5加密&#xff0c;解码内容如下 找…

使用Python免费将pdf转为docx

刚刚想将pdf转换为docx文档时&#xff0c;居然要收费 还好我学过编程&#xff0c;这不得露两手 将pdf 转换为 docx 文档 的操作步骤 我这里使用的是Python语言 &#xff08;1&#xff09;在终端上安装 pdf2docx 是一个 Python 库&#xff0c;它可以将 PDF 文件转换为 Word (…

【JS】postMessage与MessageChannel

前言 postMessage 和 MessageChannel 都是用来实现跨文档、跨窗口或跨线程&#xff08;Web Worker&#xff09;的消息传递机制。 postMessage 可以在 iframe、同源或跨源窗口之间传递数据&#xff0c;也可以用于主线程与 Web Worker 之间的通信。 postMessage 是一种单向的…

IP包头分析

IP包头 选择自己的网卡&#xff0c;开始抓包 ping一个字节大点的数据&#xff0c;方便查看包 选择数据包&#xff0c;并过滤icmp协议 查看抓到的包&#xff0c;分析 IP包头范围&#xff1a;20-60 首部长度&#xff1a;定义包头的长度 总长度&#xff1a;表示当前数据的长度…

若依等项目修改包名

点击这里 打开后如下图&#xff0c;根据需要自行操作即可&#xff0c;若依管理系统亲测修改包名后可以直接启动

unix中如何查询和修改进程的资源限制

一、前言 一个进程在运行时&#xff0c;会用到各种资源&#xff0c;比如cpu的使用时间、内存空间、文件等等。那么&#xff0c;一个进程能够占用多少资源呢&#xff1f;cpu使用的时间有多长&#xff1f;进程空间有多大&#xff1f;能够创建多少个文件&#xff1f;这个就是本文…

Kotlin 中的 `flatMap` 方法详解

在 Kotlin 中&#xff0c;flatMap 是一个非常强大的集合操作函数&#xff0c;它结合了 map 和 flatten 的功能。flatMap 能够将一个集合中的每个元素映射为另一个集合&#xff0c;然后将这些集合连接成一个单一的集合。在很多场景下&#xff0c;它比单独使用 map 和 flatten 更…

解锁数字转型新纪元:Vatee万腾平台,您的智能加速与策略智库

在数字经济时代的大潮中&#xff0c;企业的数字化转型已不再是选择题&#xff0c;而是必答题。面对这一挑战&#xff0c;Vatee万腾平台以其卓越的技术实力和前瞻性的战略视野&#xff0c;成为了众多企业加速数字化转型、实现智能化升级的得力助手和智囊团。 加速转型&#xff…

毕业设计选题:基于ssm+vue+uniapp的校园商铺系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

华为SMU02B1智能通信电源监控单元模块简介

华为SMU02B1是一款智能通信电源监控单元模块&#xff0c;专为5G嵌入式机框设计&#xff0c;它在通信电源管理领域扮演着重要角色。以下是对该产品的详细介绍&#xff1a; 一、产品概述 主要功能&#xff1a;华为SMU02B1能够监控和管理通信电源系统&#xff0c;提供站点监控功能…

需求3:照猫画虎

说起写需求&#xff0c;其实对于我这种小白而言&#xff0c;接到一个需求&#xff0c;最好的方式就是照猫画虎。 因为我从0到1写&#xff0c;以我现在这种水平&#xff0c;根本就不可能完成。所以照猫画虎&#xff0c;模仿着来写是最好的提升方法。 之前在聊天的时候&#xf…

Windows11家庭版修改用户密码策略为永不过期。

今天有个朋友找到我说&#xff0c;他的电脑密码老是过期然后需要修改&#xff0c;让我帮忙改一下密码策略&#xff0c;改为永不过期。 下面就来操作一下吧。 这里有个小小的坑&#xff0c;就是win11的家庭版是没有 gpedit.msc的&#xff0c;也就不能直接cmd打开本地策略便器&…

day20JS-axios数据通信

1. 什么是axios axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端&#xff0c;简单的理解就是ajax的封装&#xff0c;只不过它是Promise的实现版本。 特性&#xff1a; 从浏览器中创建 XMLHttpRequests从 node.js 创建 http 请求支持 Promise API拦截请求和响应转…

Linux下进程间的通信--共享内存

共享内存概述&#xff1a; 共享内存是进程间通信的一种方式&#xff0c;它允许两个或多个进程共享一个给定的存储区。共享内存是最快的一种IPC形式&#xff0c;因为它允许进程直接对内存进行读写操作&#xff0c;而不需要数据在进程之间复制。 共享内存是进程间通信&#xff…

Linux 中的 Screen 命令详解

目录 前言1. 什么是 Screen 命令2. Screen 命令的主要功能3. Screen 命令的安装4. Screen 的基础使用4.1 启动一个新的 Screen 会话4.2 恢复一个断开的 Screen 会话4.3 退出一个 Screen 会话 5. Screen 命令的常用参数5.1 -S&#xff1a;指定会话名称5.2 -r&#xff1a;恢复会话…

使用SpringCloud构建可伸缩的微服务架构

Spring Cloud是一个用于构建分布式系统的开源框架。它基于Spring Boot构建&#xff0c;并提供了一系列的工具和组件&#xff0c;用于简化开发分布式系统的难度。Spring Cloud可以帮助开发人员快速构建可伸缩的微服务架构。 要使用Spring Cloud构建可伸缩的微服务架构&#xff0…