顺序表和链表区别

不同点顺序表链表
存储空间上物理上和逻辑上都连续逻辑上连续,物理上不一定连续
随机访问支持O(1)不支持O(1);  O(n)
插入和删除元素要移动数组;O(n)只需要改变指针指向
插入需要动态开辟扩容没有容量的概念
应用场景元素高效存储和频繁访问任意位置插入和删除频繁
缓存利用率

顺序表底层是数组,数组在物理和逻辑上都连续,而链表不是,链表中的节点可以随机摆放,只需要在逻辑上是连续就行;

顺序表底层是数组,顺序表中的元素相当于是数组里面的数据,可以通过下标来实现随机访问,只需要知道数据的下标就可以以O(1)的时间复杂度找到这个数据;而链表却不是,链表没有下标的概念,想要在链表中找到一个节点,要通过next指针遍历链表,此时的时间复杂度是O(n);

链表在插入和删除元素时,只需要知道要删除的节点,再改变这个要删除节点的前后节点的指向就可;但是数组却不一样,删除或是插入一个数据还要移动数组,以使得下标能对应起来,而移动数组需要通过循环,此时的时间复杂度是O(N);

应用场景:顺序表的优势在于随机访问的时候时间复杂度低,并且缓存利用率高;顺序表的劣势是容量不够的时候需要申请空间,而申请空间用到realloc函数,这个函数拷贝数据,释放就空间,开辟新空间,这样就相对降低了程序的效率;并且在插入和删除元素的时候,顺序表要进行数据的移动,移动数据要一个一个移动,要用到循环,时间复杂度相对高;并且在插入数据之后可能存在空间浪费的问题。链表优势在于插入和删除数据的时候不涉及到realloc函数,并且链表不需要移动数据,因为它在物理结构上不一定连续,这样就相对提高了效率;链表只需要按需申请节点空间,相对提高了空间的利用率。顺序表的缓存利用率较高是因为顺序表的底层数组在内存上是连续开辟的,数据的空间都是连在一起的,在载入缓存时,规定要载入一段而不是一个数据(认为既然要把一个数据载入缓存,那么就认为这个数据附近的数据也要被用到,也要载入缓存),那么顺序表的结构就恰好迎合了这个规则,就有优势;链表却不一样,链表的数据,即每个节点都是malloc开辟的,它们在内存上的存储不一定连续,那么在把一个数据载入缓存的时候,已知这个数据附近的数据也要载入,可是链表的数据内存空间不连续,载入时会把一个数据附近不需要的内容载入缓存区,这些不需要的会把缓存区里面有用的数据挤出去,这样就降低了缓存利用率。

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值