数组与链表(算法图解笔记2)

内存的工作原理

需要将数据储存到内存时,首先请求计算机提供储存空间, 计算机提供存储地址。就像逛超市时要存物品一样, 没有使用的柜子都可以存, 如果物品多就多用几个柜子。
数组与链表(算法图解笔记2)_第1张图片

数组

数组是一种内存处理方式, 数组核心的特征在于数据是连在一起的 。所以遇到要存储的数据超过计算机提供的空间时,需要重新提供更大的空间, 就得将全部数据移到其他地方。 (就像去饭店吃饭,中途又来了几个朋友, 你们必须坐在一起,所以必须换个大桌子)。 有同学会说计算机给某个数组预留充足的空间可以缓解这个问题 。但是预留仍然存在两个问题:
一 额外预留的空间可能用不上, 这就造成了内存的浪费。就像两个人就餐使用了一个大包间,但需要包间的人没法用
二 由于预留不能超额太多,一旦不够用了仍然需要转移。

链表

链表与数组不同的是,链表中元素可以存在任意的位置, 链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。这就像你和室友到食堂吃饭, 但是没有四个连在一起的位置了,你的室友说 ,“我们分开坐吧”。 但是数组必须存储在连续的内存地址, 就像你和女朋友去食堂吃饭,不可以分开坐 。
数组与链表(算法图解笔记2)_第2张图片

数组与链表的特点比较

数组和链表存储方式的不同, 导致了数组和链表的特性差异。

读取数据

在读取数组数据时, 由于内存地址是连续的, 那么每个数据的内存地址都可以计算, 可以随意读取任何元素(这就是数组元素非要在一起的原因)。 但在需要读取链表的一个元素时,你不能直接读取,因为你不知道,它所处的地址,必须先访问第一个元素,从中获取元素第二个的地址,再访问第二个元素并从中获取第三个元素的地址,以此类推,直到访问到需要的元素。显然链表的读取效率较低。

插入数据

在插入数据时, 如果向数组种插入第一数据,那么后面的所有数据都需要重新插入。 如果向链表种插入一个数据,只需要修改前后数据的指引。 删除数据和插入数据同理 。

数组 链表
读取 O(1) O(n)
插入 O(n) O(1)
删除 O(n) O(1)

总结

数组读取数据很快,但插入和删除数据都很慢
链表读取较慢,但插入和删除数据都很快

你可能感兴趣的:(python,链表,算法,数据结构,大数据)