目录
-
- 传统艺能
- 正片开始
传统艺能 小编是双非本科大一菜鸟不赘述,欢迎大佬指点江山(QQ:1319365055)
此前博客点我!点我!请搜索博主 【知晓天空之蓝】
乔乔的gitee代码库(打灰人 )欢迎访问,点我!
非科班转码社区诚邀您入驻
小伙伴们,打码路上一路向北,背后烟火,彼岸之前皆是疾苦
一个人的单打独斗不如一群人的砥砺前行
这是我和梦想合伙人组建的社区,诚邀各位有志之士的加入!!
社区用户好文均加精(“标兵”文章字数2000+加精,“达人”文章字数1500+加精)
直达: 社区链接点我
正片开始 我们知道双向循环带头链表是链表8种结构中的扛把子,那看起来最low的顺序表,可不可以不要呢?
答案是不能,首先我们一个明白两种结构是相辅相成的
顺序表优点:
1.顺序表空间连续,方便用下标随机访问
可是成也萧何败也萧何,他的优点同时关联出他的缺点:
1.因为空间连续,空间不够就需要扩容,因为存在原地扩和异地扩,扩容本身存在一定消耗,而且扩容机制还存在一定空间浪费;
2.头部或者中部插入删除时,因为是连续存放要挪动数据,效率低下。O(N);
链表优点:
1.链表空间不连续,可按需申请释放空间
2.任意位置插入删除效率高。O(N);
链表缺点:
1.链表因为空间不连续,不支持下标的随意访问,有些算法不适合在链表中应用,比如二分查找,排序等。
以上是我们之前知识承载下的总结,如果你还想让别人眼前一亮,那么顺序表还有一个优点:
CPU高速缓存命中率会更高(做了解),涉及到局部性原理,我们知道存储体系长这样:
文章图片
其实平时我们口中的内存指的是电脑的主存,俗称的磁盘或者硬盘就是本地二级存储,软件的实时运行都依赖于内存,内存就是速度快而价格高,而磁盘正好相反。
当然你可能会问为什么不全部换成内存,首先是成本问题,其次内存是带电存储而硬盘是不带电存储,脑补一下写了一个代码,代码还在内存中还没写入硬盘,电脑突然被拔插头或者死机那下次数据就会消失,所以二者是配合着用。
我们电脑还存在一个三级缓存+寄存器(eax,ebx,ebp,esp),比如我们执行一个链表的打印数据在内存里面,会编译链接后生成可执行程序,CPU执行这个程序,CPU要去访问内存。CPU不会直接去访问内存,他嫌弃内存速度太慢,访问三级缓存和寄存器,4、8比特位小数据就放到寄存器,大数据就sei到缓存。
文章图片
【C语言|对比顺序表与链表——纵观与取舍】CPU会先看数据是否在缓存,如果在就叫命中,如果不在就叫不命中,先把数据从内存加载到缓存再访问。加载时又局限于局部,访问一个位置会连续加载出该位置之后的一段空间。假设一次加载20字节,5个字符,如果其中4或3处于缓存就叫做命中。
换作是链表,每次就算没有命中也要加载连续的一段空间进去,会带来一个更恶劣的影响叫缓存污染,无关内容被加载进缓存而把原有内容挤出内存,这就是顺序表CPU高速缓存命中率高的优势。
具体加载的这一段连续空间到底是多少取决于硬件。
推荐阅读
- C语言|十分钟手撕栈与队列——栈与队列实现详解
- 算法练习300题|【leetcode刷题】19.回文链表——Java版
- 数据结构|反转链表-四种方法
- C语言提高(一)
- 笔记|嵌入式网络的基础知识
- Quant|量化分析师的Python日记【Q Quant兵器谱之函数插值】
- C语言|qsort库函数详解
- C语言|库函数《qsort》的模拟实现,原来如此简单
- c语言初学之路|【C语言】模拟实现库函数 strcpy(复制字符串内容) 与 strlen(求字符串长度)