【算法】数组和链表的通俗比较

来源:互联网 发布:淘宝网买东西先付还是 编辑:程序博客网 时间:2024/05/22 17:10

前言

小编认为,只要对数据结构有些了解,就能分清数组和链表。所以这篇分享看似无意义。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)以上是小编的个人见解,如有出入,还请读者不吝赐教。