面试提问:顺序表和链表的主要区别

不同点                            顺序表                                                                        链表
存储空间上                物理空间与逻辑空间一样连续                                         逻辑空间上连续,物理空间上不一定连续
时间复杂度                通过下标访问可以做到O(1)                                            要通过头链表一直访问到直到到达目标节点,所以为O(N)
数据的插入和删除      只能做到尾插和尾删(其他情况要移动链表,效率低下)   可以随意位置插入和删除
容量问题                   容量不够会扩充,会出现空间浪费 ,扩容也会产生消耗     随数据量增加容量数量,不存在容量问题   
缓存利用率                高                                                                                低

为什么顺序表缓存利用率高,而链表缓存利用率低?

结论:

顺序表因为物理空间的连续,一次读取的数据量都是顺序表内的数据(除了顺序表的末尾处),那么当从内存中的数据放入缓存时,这其中的数据都是顺便表的数据(末节点不一定),所以这时缓存内的数据的利用率高

而链表因为物理空间上几乎不肯能连续,因此在一次访问数据中,内存数据放入缓存时,会在缓存中放入程序额外的数据,造成缓存数据污染,因此缓存利用率低

原因讲解:

这里不讨论硬件方面的基本认识,若有这方面不理解的可以观看下图

当程序开启时,程序所对应的数据会被cpu划分一段区域,这个区域被称为叫内存,存放着该区域的数据。之后,当cpu要获取程序数据进行运算的时候,cpu会将其中所要频繁用到的数据放入到距离cpu更进一步的区域缓存中,这样可以让cpu更快的获取频繁的数据。之后cpu再将缓存的数据放入到寄存器中(有一些特定的数据是不会放入寄存器的,会直接从内存或者缓存读取),之后cpu计算完数据后,在将数据返回给内存中。

cpu对于数据的获取是先访问缓存内部是否有对应的数据,若有则从缓存中读取数据进入cpu进行计算(这个过程也被称叫缓存命中),若缓存内未有cpu所需要的数据,那么cpu就会让内存的数据放入到缓存中,再从缓存中访问数据(这个过程也叫缓存不命中)

基于cpu每次所能处理的数据有限(处理的数据量分别是一次读取64位字节的×64架构和一次读取32位的×86架构),其读取数据的方式是内存寻址,会找到所需数据的地址处,一次性从获取地址处到对应读取字节量的数据量。

顺序表因为物理空间的连续,一次读取的数据量都是顺序表内的数据(除了顺序表的末尾处),那么当从内存中的数据放入缓存时,这其中的数据都是顺便表的数据(末节点不一定),所以这时缓存内的数据的利用率高

而链表因为物理空间上几乎不肯能连续,因此在一次访问数据中,内存数据放入缓存时,会在缓存中放入程序额外的数据,造成缓存数据污染,因此缓存利用率低

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值