【算法】数组和链表的通俗比较
前言
小编认为,只要对数据结构有些了解,就能分清数组和链表。所以这篇分享看似无意义。BUT,小编最近在看《图解算法》,觉得作者对两者的区分的思路挺棒,所以总结下来,分享出来。
两者的图片定义
图1 数组图
图2 索引图
两者的区别
看上图中的方格像什么?抽屉。OK
图3 抽屉
- 查找
如果我想让你在这些“抽屉”中找到5,怎么做?
在数组中,我会给你提示条件:“在索引为a[5]的抽屉里”——→then,你会直接找到上面标有a[5]的抽屉。
在链表中,找5更像一个寻宝游戏。我会告诉你,5的地址信息在8的抽屉里,8是第一个抽屉。——→你会怎么做?显而易见,先打开8的抽屉,然后找到5的地址,然后再去打开5。
小结:数组更容易查找,其查找的时间复杂度为O(1)。值得注意的是,O(1)的意思不是指能在很少的时间内查找到,而是每个数被查找的所用时间是一样的,比如查找8和5的时间是一样的。
链表在查找方面所用时间多些,其时间复杂度为O(n)。即我没办法一下子知道5在哪,需要借助前方的信息。
- 插入和删除
如果我想插入一串数字“9,10,11”,怎么做?
在数组中,我需要先找到一块能放下这三个数的地方,即找到3个连续的空格,没有。所以,没办法插入。
而在链表中,我可以分开放这三个数,只要把后一个数的位置信息放在前一个中就好,比如把10的位置信息放在9中,我找到9,也就知道了10的位置。
删除与插入类似,在数组中,当删除一个数时,后面的数需要往前移;而在链表中不用。
小结:数组的插入和删除不占优势,其时间复杂度为O(n)。缺点如①当空间不够时,需要再找其余空间,所以插入时速度慢②如果6个数字组占用了10个空间,那如果再没有比4小的数字组时,其余4个就浪费了。
链表的插入和删除更方便些,其时间复杂度为O(1)。对于在链表中插入和删除到底是怎么操作的,这又是另一个问题了。
- 在实际编程中,哪个用的多?
数组。因为数组支持随机访问,而链表只能顺序访问,当然这也不是绝对的,只是说平时用数组的多。
总结
(1)
(2)以上图只是小编为了容易理解,自己画的简化图。真正的数组和链表是什么样的呢?
图4 二维数组
图5 双向链表
(3)以上是小编的个人见解,如有出入,还请读者不吝赐教。