归总说明现行表的特性,并汇总了线性表的一些常见的基本概念。
不错的几个博客位置:
版权声明:本文为优快云博主「大唐不良猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_49188222/article/details/124309378
1. 线性表概念
线性表(list)是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列(a1, a2 ..., an)。其中Ai是表象,n是表长度。线性表中的数据元素之间是有顺序的;线性表中的数据元素个数是有限的;线性表中的数据元素的类型必须相同。线性表具有如下几项性质:
1、a0为线性表的第一个元素,只有一个后继。
2、an为线性表的最后一个元素,只有一个前驱。
3、除a0和an外的其它元素ai,既有前驱,又有后继。
4、线性表能够逐项访问和顺序存取。
这里假设是在int为4字节的系统上,数组存储在一段连续的内存上,例如图中从地址1000开始,每个格子存放一个4字节的int,就可以通过简单的加法计算出要访问的某一项的地址了,因此数组可以做到随机访问(random-access),也就是任意访问数组某一项a[x]时,可以通过(a的地址+x*sizeof(int))计算得到a[x]地址,时间复杂度是O(1)。
相反,链表的内存是不连续的,代价就是要存储多一个next指针,指向下一个结点的地址,通过这个地址找到链表的下一个结点,因此链表支持顺序访问(sequential access),也就是当我要访问链表的第x个结点时,我要从头结点开始按顺序遍历next指针才能找到这个结点,时间复杂度是O(n)。
链表与数组的优缺点比较
1.2 内存管理
线性表在代码中实现其内存管理可以是联系的也可以是跳跃的方式,联系方式通过经典的数组实现,当然我们可以认为数组就是最简单的一种线性表。对于链式存储结构,主要通过指针来进行数据管理,常用的有单向链表、双向链表。
这里还有一个比较重要的点:在遍历数组和链表时时间复杂度都是O(n),但是实际上数组耗时比链表小很多,原因是cpu缓存对连续内存的数组友好,对不连续内存的链表不友好。
计算机的存储器分6个层级结构:(处理速度从快到慢)
寄存器
高速缓存 (cpu缓存,一般有L1,L2,L3三层缓存)
主存储器(内存)
磁盘缓存
固定磁盘
可移动存储介质
根据局部性原理,cpu在读取内存时会读取一片连续空间的内存,将一些经常访问的数据放在cpu缓存,在访问数据的时候,先检查缓存里是否存在,如果存在就直接读取使用,如果不存在再去内存读取。CPU缓存的访问速度和内存的访问速度可能相差几十倍
1. 线性表操作
- 创建线性表 list_create()
- 销毁线性表 list_destroy()
- 清空线性表
- 将元素插入线性表
- 将元素从线性表中删除
- 获取线性表中某个位置的元素
- 获取线性表的长度