数据结构(概述、线性表)

数据结构

本文大部分内容整理自程杰老师的《大话数据结构》

#一、数据结构概述#
分类:
①逻辑结构:面向问题的结构,主要是思维上的认知
1.集合结构 唯一的关系是大家都在一个集合内
2.线性结构 一对一
3.树形结构 一对多
4.图形结构 多对多

②物理结构:面向计算机,数据的逻辑结构在计算机中的存储形式
1.顺序存储结构:把数据元素存放在地址连续的存储单元中
这里写图片描述
数据对象:仅存储数据

2.链接存储结构:对数据元素存放在任意存储单元中
这里写图片描述
数据对象:存储数据+后继元素地址信息

#二、线性表(List)#
图示:
这里写图片描述
补充两个概念:
1.前驱元素:Ai-1为Ai的前驱元素
2.后继元素:Ai+1为Ai的后继元素

线性表是逻辑结构上的概念,它在计算机内部是如何存储的呢?这时候就要涉及物理存储结构(顺序存储结构、链表存储结构)

顺序存储结构:用数组来实现顺序存储结构
顺序存储结构有3个要素需要注意:
1.存储空间起始位置
2.线性表的最大存储容量
3.线性表当前长度
这里写图片描述
此处注意:
1.数组长度是固定的,一开始分配空间时就必须指定数组长度
2.线性表长度是可变的,但是“线性表长度≤数组长度”恒成立

查询操作:时间复杂度为O(1),快
①获取第一个元素的地址
②因为地址是连续的,A1地址假设为LOC(A1),A1占据了c个存储单位,那么A2的地址就是LOC(A2)+c,所以可以直接根据该函数算出第i个元素的地址

删除操作:时间复杂度为O(n),慢
①找到要删除的数据元素,删除,后面所有的数据元素往前挪一位

增加操作:时间复杂度为O(n),慢
②找到要增加元素的位置,插入的数据元素,后面所有的数据元素往后挪一位

链接存储结构
顺序存储结构有1个要素需要注意:
1.存储空间起始位置
这里写图片描述
解读:对内存空间无要求,数据对象存储的信息包括
这里写图片描述
只需要知道第一个元素位置,通过它的指针域(里头存储了下一个元素的地址信息),就可以知道第二个元素位置,通过第二个元素的指针域就可以知道第三个元素位置,以此类推,直到遍历完所有元素对象。

查询操作:时间复杂度为O(n),慢
①获取第一个数据元素
②通过第一个数据元素的指针域找到第二个元素
③一次类推进行遍历,直到最后一个元素,如果都找不到,说明数据不存在
④否则查找成功,返回结点数据

删除操作:时间复杂度为O(1),快
①找到要删除的数据元素,将其前驱结点的指针域修改为目标数据元素后置结点的地址

增加操作:时间复杂度为O(1),快
②找到要增加元素的位置,将前置元素的指针域修改为目标数据元素的地址,将目标数据元素的指针域修改为后置元素的地址
图示:
这里写图片描述

此外,再介绍几个概念

①节点(Node):我们一般把数据域+指针域组成的的数据元素的存储映像,成为节点
1.头指针:链表中第一个结点的存储位置
2.头结点:单链表中第一个结点,头结点的数据域可以不存任何信息或存链表长度信息
比较 | 头指针|头节点
-------- | —
概念 | 链表第一个结点的指针,若链表存在头结点,则是指向头结点的指针|放在第一元素结点之前,数据域一般无意义(也可存放链表长度)
作用 | 标识作用,长用头指针冠以链表名字|有了头结点,对第一元素的插入和删除和其他结点就一致了
必要性 | 必要元素,即便链表为空|非必要元素

图示如下:
情况一:存在头节点
这里写图片描述
情况二:无头节点
这里写图片描述
情况三:空链表
这里写图片描述

②循环链表:尾指针指向头结点(没有头结点则指向第一个结点)

③双向链表:结点存在两个指针,一个指向前驱元素地址,一个指向后继元素地址(java中所有的链表都是双向链表)
这里写图片描述

上述讨论是针对线性表在计算机中的存储结构进行讨
下面是针对线性表在逻辑上的增删规定引出的两种逻辑结构

栈——先进后出LIFO
①顺序存储结构
进栈:数组的最后添加元素
弹栈:数组的最后一个元素删除
缺点:需要事先确定栈的大小,会浪费空间
改进方法:两栈共享(感兴趣可以自己搜以下,此处不做解释)

②链式存储结构——链栈

队列——先进先出FIFO
①顺序存储结构
添加:在数组最后添加元素
删除:在数组最前删除元素,后续元素全部往前移
缺点:时间复杂度O(n)

改进删除:在数组最前的元素删除,后续元素不动
优点:时间复杂度O(1)
缺点:前面腾出来的空间无法利用

再改进:数组最后一个位置被占用后,从第一个元素开始继续添加元素→循环队列

②链式存储结构——链队列

猜你喜欢

转载自blog.csdn.net/weixin_42152023/article/details/82657950