一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情。
目前在不断更新《数据结构算法》
未来会讲到《C++语言》,《Linux系统编程》,《Linux网络编程》,《MySQL数据库》等。
期待系统学习编程的小伙伴可以关注我!
1.线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
2.顺序表
2.1概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可以分为:
- 静态顺序表:使用定长数组存储元素。
- 动态顺序表:使用动态开辟的数组存储
1.1 链表的概念及结构
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。
3. 顺序表和链表的对比总结
顺序表:
- 优点:
- 物理上是连续的,方便用下标随机访问
- CPU高速缓存命中率会更高(等会解释)
- 缺点:
- 顺序表需要物理空间连续,空间不够时需要扩容。扩容本身有一定消耗。其次扩容机制还存在一定的空间浪费。
- 头部或者中部插入删除,挪动数据,效率低。O(N)
链表: 优点:
- 任意位置插入删除数据效率高。O(1)
- 按需申请和释放空间
缺点:不支持下标的随机访问。有些算法不适合在他上面进行。如:二分查找、排序等
为什么顺序表CPU高速缓存命中率会更高?
编译链接后,生成可执行程序,cpu去执行这个程序,cpu要去访问内存。 但cpu效率很高,内存的速度跟不上。为了让它俩配合的更好,cpu不会直接访问内存,而是把数据加载到三级缓存(高速缓存)或者寄存器(放4或8byte的小数据)中 cpu会看数据是否在高速缓存,在就叫命中,直接访问 不在就叫不命中,先把数据从内存中加载到高速缓存,再访问。
第一次访问不命中,会把一段数据都加载进去
第二次访问,这时连续存储的顺序表就更有可能命中,这样就不必再次加载数据,提高了效率。
结论:顺序表CPU高速缓存命中率会更高