3、数据结构与算法之数组与链表

一、内存的工作原理

      把内存想象成一个超市里面的储存柜,储存柜又分成许多等大的小柜子。每个小柜子都有编号来标识,等同于内存地址。

二、数组

1、什么是数组?

      数组的特点就是它的内存是连续的,就像一连几个并排的小柜子。而且数组的第一块内存确定后,以后再怎么更改数组里的数据都不能改变第一个内存的位置。

2、数组的内存使用

      想象我们去超市时,要分别把伞、背包、帽子寄存再不同的小柜子里,我们可以选择一连三个小柜子储存。这就是数组内存的使用情况,数组必须使用连续的内存空间。

3、数组的优缺点

(1)优点:如果我们要把背包取出来,因为这几个小柜子是连在一起的,如果我们记得第一个柜子的位置,那么就很快能找到其他的柜子了。(注意,在这个想象中,我们的柜子是没柜门的,我们查找数据实际是确认柜子的编号)

(2)缺点:如果我们要把水杯放进小柜子里,按照数组的原理,我们要先确认我们租用的三个柜子后面还有没有空柜子。如果没有,则需要把前三件物品取出来,然后找四个相连的柜子,然后再把我们的东西放进去。就算有空柜子在后面,如果我们想把水杯放在第一个柜子,我们要先把柜子三件物品取出来,然后把水杯和后面的物品重新放进去。而我们要取出某一个物品时,则需要把那个物品取出来,把后面的物品都向前移一个位置。

(3)综上所述,数组的优点是:查找快,缺点是:插入与删除数据慢。同样,这三个操作可以用大O表示法表示:O(1),O(n),O(n)。

三、链表

1、什么是链表?

      我们也可以这样储存物品:先把伞放进第一个柜子,然后把背包放进任意第二个柜子,然后用字条记下第二个柜子编号,把纸条放进第一个柜子里,把帽子放进任意第三个柜子,然后同样用纸条记住第三个柜子编号放进第二个柜子里......这就是链表中数据的储存方式。链表中的每个元素都会有下一个元素的内存地址。

2、链表的优缺点

(1)缺点:与数组相反,链表的缺点是查找数据。由于链表中的数据是任意存放的,所以我们不能一眼找到想要的数据。首先我们要看看第一个柜子是不是我们想要的数据,如果不是,我们要根据柜子中写着第二个柜子的编号,移动到第二个柜子,然后又看一下柜子里的东西是不是我们要找的......链表查找数据是必须从第一个数据开始查找,所以这个过程是非常耗时的。

(2)优点:链表的优点是插入与删除数据很快。链表插入数据时,只要把前面的指向到新数据,新数据又指向原来下一位就可以了。删除也一样,只需要把删除数据的上一位指向到删除数据的下一位就可以了。(有人可能问,链表插入也要找到插入的那个位置的前面那个数据,删除也要查找删除的那个数据呀,反而数组插入在尾部只要一步,而链表插入到尾部就要检查前面所有数据,这里不是数组插入会快吗?我是这样理解的,检查数据比移动数据用地时间少的多,就好像你看一眼跟移动物品用的时间的差别一样。这里说数组查找快是与链表的查找作对比,而不是与其他操作作对比。)

(3)综上所述,链表的查找慢,插入和删除快。用大O表示法表示:O(n),O(1),O(1)

四、数据结构与算法

      我们学习算法,是为了解决实际问题。而问题中必定也存在数据的。那么我们应该根据算法的特点来选择不同特性的数据结构(数据容器)。比如果我们的算法是查找数据居多,我们就应该选择数据;如果算法主要对数据集进行增删的操作比较多,那我们应该选择链表。

具体参考:

《图解算法》第二章

——————本篇完!

猜你喜欢

转载自www.cnblogs.com/lqxing1994/p/9208450.html