顺序表:顺序表其实就是数组(一般作为接口(类似于函数)放在头文件中)
实现静态顺序表: size为有效数组,有效数组在顺序表中必须是连续的
下图其实很挫:因为类型被卡死了,想要改成char型非常麻烦
技巧:用宏来定义 常数,用typedef来定义类型
正常定义:
注意:静态顺序表是很挫的(它不能实现按需索取,这里相当于一个精致包装的数组)
动态顺序表:
结构:
注意:
1. 这些size(有效数据个数),acpicity(空间容量)只是一个”显示“的作用
真正的实现要靠内部[ size++ , malloc , realloc ]等
2. capicity是(空间容量是有多少个该类型的数据的意思)而不是多少字节。
因此一般都要用sizeof( 类型 ) * capicity 来初始化或增容或扩容
3. 顺序表的实现在2024-03-01文件中
4. 注意:顺序表(数组类结构)不用free删除数据,而是直接操纵size--。
是吃了数组(物理连续)下标的红利。这些空间永远容易找到。
命名习惯:
序:sequence(顺序) 顺序表表头删除:
表: list(表格) seqlistpopfront
后:back( 返回 )
前:front(正面) 顺序表表尾插入:
中间插入:insert(插入) seqlistpushback
(前,后) 插入:push(推动)
删除:pop ( 爆掉了 ) | | erase(计算机删除)
初始化:initialization( 初始化 ,简称init )
举例一反三:
我们知道删除操作在这里就是移动覆盖,这就是数组这个物理连续条件的好处
所以,在有数组这一类型的条件下(覆盖删除是一个常见的操作)
注意:在覆盖过程中,有时,一个元素要重复移动多次造成亢余
我们不妨从前往后移动或者从后往前移动(换覆盖的方向)
顺序表的优缺点:
缺点:
插入数据时,因为要移动所以,时间复杂度为O(N)
增容操作(一般增容两倍)还是可能浪费空间
优点:
物理连续的优势:
顺序表在物理上是连续的,物理上连续有了这个条件,排序,二分
查找,指定下标访问等(也叫随机访问)就不是什么难事
支持随机访问的优势:
1.快速访问元素,不用像链表一样还要找的来
顺序表的尾插,尾删非常的快
对比与链表:顺序表的缓存命中率高.
缓存预加载概念:{访问数据时不会只加 (从内存中到缓存中)
载一个数据到缓存,而是从这个数据开始后的一段数据加入到缓存(预判加
载), 缓存的访问速度是比内存快的}
由于顺序表物理空间连续,预加载的效果更好(有效数据更多)
由于链表物理空间不连续,预加载的效果不好(有效数据少,还会造成缓存
污染)
这是计算机体系结构的知识:有兴趣可以看看《深入理解计算机系统》
这本书非常难,可以尝试一下fdf的版本