数据结构单链表之链表与数组 | 第二套

2,099 阅读4分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

数组将元素存储在连续的内存位置,从而为存储的元素提供易于计算的地址,这允许更快地访问特定索引处的元素。链表的存储结构不那么严格,元素通常不存储在连续的位置,因此它们需要与提供下一个元素的引用的附加标签一起存储。数据存储方案的这种差异决定了哪种数据结构更适合给定情况。

image.png

数组的数据存储方案

image.png

链表的数据存储方案

主要区别如下: 

  • 大小: 由于数据只能存储在数组中连续的内存块中,由于存在覆盖其他数据的风险,因此无法在运行时更改其大小。但是,在链表中,每个节点都指向下一个节点,因此数据可以存在于分散的(不连续的)地址中;这允许可以在运行时更改的动态大小。
  • 内存分配: 用于编译时的数组和运行时的链表。但是,动态分配的数组也会在运行时分配内存。
  • 内存效率: 对于相同数量的元素,链表使用更多的内存作为对下一个节点的引用也与数据一起存储。但是,链表的大小灵活性可能会使它们总体上使用更少的内存;当大小不确定或数据元素的大小变化很大时,这很有用;在使用数组时,必须分配相当于大小上限的内存(即使不是全部都被使用),而链表可以根据数据量逐步增加它们的大小。
  • 执行时间: 数组中的任何元素都可以通过其索引直接访问;然而,在链表的情况下,必须遍历所有先前的元素才能到达任何元素。此外,数组中更好的缓存位置(由于连续内存分配)可以显着提高性能。因此,某些操作(例如修改某个元素)在数组中速度更快,而其他一些操作(例如在数据中插入/删除元素)在链表中速度更快。

以下是支持链表的要点。

(1)数组的大小是固定的:所以我们必须提前知道元素数量的上限。另外,一般来说,分配的内存与使用量无关,都等于上限,在实际使用中,很少达到上限。

(2) 在元素数组中插入一个新元素是昂贵的,因为必须为新元素创建一个房间,并且必须移动现有元素才能创建一个房间。 

例如,假设我们在一个数组 id[] 中维护一个排序的 ID 列表。 

id[] = [1000, 1010, 1050, 2000, 2040, .....]。 

而如果我们要插入一个新的ID 1005,那么为了保持排序顺序,我们必须将1000之后的所有元素(不包括1000)移动。 

除非使用一些特殊技术,否则删除数组的代价也很高。例如,要删除 id[] 中的 1010,必须移动 1010 之后的所有内容。 

所以链表提供了以下两个优于数组的优点 

  1. 动态大小 
  2. 易于插入/删除 

链表有以下缺点: 

  1. 不允许随机访问。我们必须从第一个节点开始按顺序访问元素。所以我们不能对链表进行二分查找。 
  2. 列表的每个元素都需要额外的指针存储空间。 
  3. 数组具有更好的缓存局部性,可以在性能上产生相当大的差异。
  4. 遍历和改变指针需要很多时间。
  5. 当我们使用指针时会很混乱。

🛬 wuhu ! 起飞 !

我已经写了很长一段时间的技术博客,并且主要通过掘金发表,这是我的一篇数据结构单链表教程。我喜欢通过文章分享技术与快乐。你可以访问我的博客: juejin.cn/user/204034… 以了解更多信息。希望你们会喜欢!😊

🥇 往期优质文章

教你用Java做出一个五子棋小游戏
使用 python 的单人AI 扫雷游戏
数据结构单链表之链表介绍 | 第一套
手把手教你使用 Python 制作贪吃蛇游戏
手把手教你使用 Java AWT 创建一个简易计算器
使用 HTML、CSS 和 JavaScript 的酷黑主题模拟时钟
使用 HTML、CSS、JS 和 API 制作一个很棒的天气 Web 应用程序

📣尾注: 想要获取更多数据结构相关的知识,你可以关注我:海拥,我希望你觉得这篇文章有帮助。

如果你看到这里,感谢你的阅读 :)

💌 欢迎大家在评论区提出意见和建议!💌

如果你真的从这篇文章中学到了一些新东西,喜欢它,收藏它并与你的小伙伴分享。🤗最后,不要忘了❤或📑支持一下哦。