[数据结构] - 线性表

什么是线性表
线性表是其组成元素间具有线性关系的一种线性结构,对线性表的基本操作主要有获得元素,设置元素值,遍历,插入,删除,查找,替换,和排序等,在线性表任意位置都可以插入和删除,可以采用顺序存储结构和链式存储结构表示线性表。
存储类别
顺序存储结构
单链表
存储分配方式
用一段连续的存储单元依次存储线性表的数据元素
采用链式存储结构,用一组任意的存储单元存放线性表的元素
时间性能
查找O(1)、插入和删除O(n)
查找O(n)、插入和删除O(1)
空间性能
需要预分配存储空间,分大了浪费,小了容易发生上溢
不需要分配存储空间,只要有就可以分配,元素个数不受限制
通过上面的对比,可以得出一些经验性的结论:
  • 若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除时,宜采用单链表结构。
  • 当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构,这样可以不需要考虑存储空间的大小问题。而如果事先知道线性表的大致长度,用顺序存储结构效率会高很多.

线性表抽象数据类型
线性表(Linear List) 是由 n(n>=0) 个类型相同的数据元素组成的有限序列,(a0,a1,a2,an-1) 其中 ,元素ai 的数据类型可以是整数,浮点,字符串等,n是线性表元素个数,称为线性表长度(Length).若n=0,则为空表,若n>0,则ai(0<i<n-1)有且仅有一个前驱元素ai-1,和一个后继元素ai+1. a0没有前驱元素,an-1没有后继元素。
在线性表逻辑结构中,使用序号约定数据元素在线性表中的位置,即表示元素之间具有的顺序关系。
 
线性表的顺序存储
数组:
数组是实现顺序存储结构的基础,存储具有相同数据类型的元素集合,一位数组占用一块内存,数组的存储单元个数称为数组容量,也是数组长度,每个存储单元地址是连续的,每个元素连续存储,计算i个元素地址所需要的时间是个常量,时间复杂度是O(1),存取任何一个元素的时间复杂度是O(1)的数据结构是随机存取结构,因此数组是随机存取结构
数组通过下表识别元素,元素的下表是其存储单元序号,表示元素在数组中的位置,一位数组使用一个喜爱博爱唯一确定一个元素,二维数组使用两个下表唯一确定一个元素。
数组一旦占用一片存储空间,其地址和容量就是确定的,不能更改,一次,数组只能进行赋值,取值两种随机操作。不能插入,删除。当容量不够时不能就地扩容。
数组取值公式:
设loc(a0)表示第0个存储地址。每个元素占用c个字节 则 aI存储地址 Loc(ai) = Loc(a0) +i * c.
当数组容量不够,解决办法就是申请个容量更大的数组,然后把数据复制进去。
微信公众号 (胡说代码) 输入:数组源码 即可获得源代码
链式:
线性表的链式存储结构是用若干地址分散的存储单元存储数据元素,逻辑上相邻的数据元素在物理位置不一定相邻,因此,必须采用附加信息表上数据元素之间的顺序关系,存储一个数据元素的存储单元称为节点(Node)一个节点至少包含两个部分:
节点(数据域,地址域)
其中,数据域存储元素数据,地址域(也成为链)存储前驱或后继元素地址。
一个节点表示一个元素数据,通过节点中的地址域将节点连接起来,节点间的链接关系体现了线性表数据元素之间的顺序关系,采用链式存储结构的线性表称为线性链表(Linked List)一条线性链表必须使用一个头指针记住元素a0的节点位置。
每个节点只有一个地址域的的线性表称为单链表(Singly Linked list)
单链表节点(data 数据域,next 地址域 指向后置节点)
空单链表的头指针是 head = null ,最后一个节点的地址域也是null
单链表中的存储空间是插入删除中动态申请和释放的,不需要给单链表预先分配存储空间,这样就可以避免顺序表因为空间不足,需要拷贝复制扩大空间,提高了运动效率和存储空间利用率。对单链表插入和删除操作只需要改变少量几个节点,不需要移动元素数据。
在c/c++中使用指针存储地址实现链式存储结构,java中没有指针使用引用来存储,引用是比指针更安全的一种连接方式,有指针的全部功能,而且避免了指针使用不当产生的安全性问题。
单链表:
单链表是由一个一个节点连接成的。
头节点:
单链表的存储结构通常是带头结点的,在单链表最前增加一个特殊的节点,称为头节点,忽略其数据域,单链表的头指针head指向头结点,头节点 next域 指向单链表第0个元素, 空单链表只有一个头节点,head.next == null.遍历起始位置是 p=head.next 头插入和头删除不会改变head.有了头节点 单链表 插入和删除就不需要分开操作
微信公众号 (胡说代码) 输入:单链表源码 即可获得源代码
双链表(Doubly Linked Link)
在单链表中,每个节点只有一个指向后置节点的链,若要查找前驱节点,必须从单链表头指针开始沿着链表方向逐渐检索,操作效率很低,此时需要采用双链表。
双链表节点(data数据域,prev前驱节点,next后继节点)
双链表比单链表增加了一个前驱节点,给链表操作带来了很大的方便,能沿着向前,向后对双链表进行遍历
 
循环双链表(Circular Doubly Linked Link)
如果双链表的最后一个节点的next指向头节点,头结点的prev指向最后一个节点,则构成循环双链表
微信公众号 (胡说代码) 输入:循环双链表源码 即可获得源代码
注:
随机存取存储器概述
随机存取存储器(RAM)是计算机存储器中最为人熟知的一种。之所以RAM被称为“随机存储”,是因为您可以直接访问任一个存储单元,只要您知道该单元所在记忆行和记忆列的地址即可。
与RAM形成鲜明对比的是顺序存取存储器(SAM)。SAM中的数据存储单元按照线性顺序排列,因而只能依顺序访问(类似于盒式录音带)。如果当前位置不能找到所需数据,就必须依次查找下一个存储单元,直至找到所需数据为止。SAM非常适合作缓冲存储器之用,一般情况下,缓存中数据的存储顺序与调用顺序相同(显卡中的质素缓存就是个很好的例子)。而RAM则能以任意的顺序存取数据。
posted @ 2019-05-09 23:01  梁天  阅读(...)  评论(...编辑  收藏