数组和链表
数组和链表
从零到英雄的算法和数据结构
有时您需要在内存中存储元素列表。假设您正在编写一个应用程序来管理您的开支。您将希望将费用作为列表存储在内存中。
你应该使用数组还是链表?让我们先将费用存储在一个数组中,因为它更容易掌握。使用数组意味着您的所有费用都连续(彼此相邻)存储在内存中。
现在假设您要添加第四项费用。但是下一个抽屉被占用了。
这就像和你的朋友出去找个地方坐下,但另一个朋友加入你,却没有地方给他们。你必须搬到一个你都适合的新地方。在这种情况下,您需要向您的计算机索要可容纳四项费用的不同内存块。然后,您需要将所有费用转移到那里。
一旦有更多朋友加入您,这将成为一个循环,但请确保您始终可以添加额外的插槽以防万一。这是一个很好的解决方法,但您应该注意一些缺点:
- 您可能不需要您要求的额外插槽,然后该内存将被浪费。
- 您可能会在费用清单中添加超过 10 项,但无论如何都必须搬家。
所以这是一个很好的解决方法,但它不是一个完美的解决方案。链表解决了这个添加项目的问题。
链表
链表是数据元素的线性集合,其顺序不是由它们在内存中的物理位置给出的。相反,每个元素都指向下一个元素。
使用链表,您的项目可以在内存中的任何位置。
顺序与随机访问
顺序访问 意味着访问第 5 个元素的成本是访问第一个元素的成本的 5 倍,或者至少与集合中的元素位置相关的成本增加。这是因为要访问集合的第 5 个元素,必须先执行一
随机访问 意味着访问集合中的任何元素与集合中的任何其他元素具有相同的成本。找到集合的第 5 个元素仍然只是一个操作。
数组与链表
在数组中,我们知道数组中每个元素的地址。正如我们在上图中看到的,我们有一个包含 5 个内存单元的数组,这个数组包含 3 个元素,因为元素存储在连续的内存位置(数组中的元素被编号,这个编号从 0 开始)我们知道在哪里它开始和结束。
一个元素的位置称为它的索引,所以不要说“8 在位置 1”,正确的术语是“8 在索引 1”。
如果您想读取随机元素,数组非常棒,因为您可以立即查找数组中的任何元素。
在链表中,每个项目存储列表中下一个项目的地址。一堆随机内存地址链接在一起。
就像寻宝一样。你去第一个地址,它说,“下一个项目可以在地址 008 找到”。所以你去地址 008,它说,“下一个项目可以在地址 002 找到”等等。
将项目添加到链表很容易:您将其粘贴在内存中的任何位置,并将地址与下一个前一个项目一起存储。
使用链接列表,您永远不必移动您的项目。您还可以避免另一个问题。
假设你和你的四个朋友去看了一部热门电影。你们五个人正想找个地方坐下,但电影院里挤满了人。没有五个座位一起。
好吧,有时数组会发生这种情况。假设您要为一个阵列查找 40,000 个插槽。您的内存有 40,000 个插槽,但总共没有 40,000 个插槽。您无法为阵列腾出空间!
链表就像是说“让我们分开看电影吧”。如果内存中有空间,则链表就有空间。
如果链表在插入方面要好得多,那么数组有什么用?
数组
当我们尝试访问列表中的项目时,数组比链表更好。
假设您要读取链表中的倒数第二项。你不能只是阅读它,因为你不知道它的地址。
您必须转到第 1 项以获取第 2 项的地址,依此类推,直到您到达倒数第二项。
如果您要一次阅读所有项目,则链接列表非常有用。但是,如果您要继续跳来跳去,那么链表就很糟糕。
数组不同。您知道数组中每个项目的地址,因此您可以立即访问任何项目。
插入列表中间
假设您希望您的费用清单更像一个日历。之前,您将内容添加到列表的末尾。
现在您想按照它们应该完成的顺序添加它们。
如果要在中间插入元素:数组还是链表,哪个更好?使用链表,很容易改变前一个元素指向的内容。
但是对于数组,您必须将所有其余元素向下移动。
如果没有空间,您可能必须将所有内容复制到新位置!如果您想在中间插入元素,列表会更好。
删除
如果你想删除一个元素怎么办?同样,链表更好,因为您只需要更改前一个元素指向的内容。使用数组时,删除元素时所有内容都需要向上移动。
对数组和列表的常见操作的运行时间:
插入和删除是 O(1) 时间,因为您通常会跟踪链表中的第一个和最后一个项目,因此添加或删除只需要 O(1)。
哪个用得更多:数组还是链表?显然,这取决于用例。但是数组有很多用途,因为它们允许随机访问。
练习
假设您正在为超市构建一个应用程序来接受客户订单。您的应用需要存储订单列表。客户不断将订单添加到此列表中,员工从列表中取出订单并制作它们。这是一个订单队列:客户将订单添加到队列的后面,员工将第一个订单从队列中取出并准备好。
你会使用数组还是链表来实现这个队列? (提示:——链表适用于插入/删除,数组适用于随机访问。你打算在这里做什么?)。
下一个
数组和链表也用于实现其他数据结构。
⬅️ ** __记忆是如何工作的 ** __ | 表中的内容 | 或者 下一个 (即将推出)➡️
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明