链表相对于数组有什么优点,反之亦然?

2024-04-10

请解释一下链表相对于数组的优点是什么。与链表相比,使用数组有什么优点吗?

问候, 舒阿布


两者都存储元素序列,但使用不同的技术。

An array将元素按连续顺序存储在内存中,即如下所示:

--------------------------------------------------------------------------------------
|  item 1  |  item 2  |  item 3  |  ...  ...  |  item x  | //here comes other stuff
--------------------------------------------------------------------------------------

这意味着,元素在内存中是一个接一个连续的。

A((双)链接)list另一方面,按以下方式存储项目:它为每个元素创建一个自己的“列表项”;这个“列表项”保存实际元素and指向下一个“列表项”的指针/引用/提示/等。如果它是双向链接的,它还包含指向前一个“列表项”的指针/引用/提示/等:

                                  ------------
------------        ----------    |  item 4  |
|  item 1  |        | item 2 |    |  next ---+----...
|  next ---+------->| next   |    ------------
------------        ---+------      ^
                       |            |
                       |            |
                       v            |
                       ----------   |
                       | item 3 |   |
                       | next --+---+
                       ----------

这意味着,元素可以分布在整个内存中,而不是存储在特定的内存位置。

现在我们知道了这一点,我们可以比较一些对元素序列的常用操作:

  • 访问特定索引处的元素:使用array,我们简单地计算offset对于这个索引并在索引处有元素。

    这是非常便宜的。与一个list另一方面,我们不知道a priori索引处的元素存储在哪里(因为所有元素都可以位于内存中的任何位置),因此我们必须逐项遍历列表,直到找到索引处的元素。这是一项昂贵的操作。

  • 在序列末尾添加新元素:使用array这可能会导致以下问题:数组通常具有固定大小,因此如果我们遇到数组已经完全填满的情况(请参阅//here comes other stuff),我们可能无法将新元素放在那里,因为可能已经有其他元素了。所以,也许我们必须复制整个数组。但是,如果数组未填充,我们可以简单地将元素放在那里。

    Using a list,我们必须生成一个新的“列表项”,将元素放入其中并设置next当前最后一个元素指向这个新列表项的指针。通常,我们存储对当前最后一个元素的引用,这样我们就不必搜索整个列表来找到它。因此,插入新元素对于列表来说并不是真正的问题。

  • 在中间某处添加一个新元素:我们首先考虑arrays:这里,我们可能会遇到以下情况:我们有一个包含元素 1 到 1000 的数组:

    1 | 2 | 3 | 4 | 5 | 6 | ... | 999 | 1000 | free | free

    现在,我们要插入4.5之间4 and 5: 这意味着我们必须搬家all元素来自5 to 1000右侧一个位置,以便为4.5:

     1 | 2 | 3 | 4 | free | 5 | 6 | ... | 999 | 1000 | free
    
                      ||
                      vv
    
     1 | 2 | 3 | 4 | 4.5  | 5 | 6 | ... | 999 | 1000 | free
    

    移动所有这些元素是一项非常昂贵的操作。所以最好不要经常这样做。

    现在我们考虑,如何list可以执行此任务:假设我们当前有以下列表:

     1 -> 2 -> 3 -> 4 -> 5 -> ... -> 999 -> 1000
    

    再次,我们要插入4.5之间4 and 5。这可以很容易地完成:我们生成一个新的列表项并更新指针/引用:

     1 -> 2 -> 3 -> 4        5 -> ... -> 999 -> 1000
                    |        ^
                    +-> 4.5 -+
    

    我们只是创建了一个新的列表元素并生成了某种“旁路”来插入它——非常便宜(只要我们有一个指向列表项的指针/引用,新元素就会插入到后面)。

那么,我们总结一下:lists在随机位置插入时非常好(只要您有指向适当列表项的指针)。如果你的操作涉及动态添加大量元素并遍历all无论如何,列表可能是一个不错的选择。

An array在索引访问方面非常好。如果您的应用程序需要经常访问特定位置的元素,您应该使用数组。

值得注意的事情:

  • 解决数组的固定大小问题:如前所述,(原始)数组通常具有固定大小。然而,这个问题现在已经不再重要了,因为几乎所有编程语言都提供了生成数组的机制,这些数组可以根据需要动态增长(并可能收缩)。这种增长和收缩可以这样实现:摊销的用于插入和删除元素(在数组末尾)的 O(1) 运行时间,这样程序员就不必调用grow and shrink明确地。

  • 由于列表为插入提供了如此好的属性,因此它们可以用作搜索树等的基础数据结构。您构造一棵搜索树,其最低层由链表组成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链表相对于数组有什么优点,反之亦然? 的相关文章

  • Mathematica 中的分类树实现

    我想使用以下方法实现简单的分类树 二元分类 数学 我怎样才能实现二叉树数学 有这样做的符号吗 我想说这取决于你想用数据结构做什么 您可以利用 Mathematica 表达式本身就是树的事实 如果只有叶节点相关 则使用嵌套列表 例如 1 2
  • 二叉搜索树是平衡的吗?

    这已经讨论过了here https stackoverflow com questions 742844 how to determine if binary tree is balanced 但我在下面有一个实现 线程中从未讨论过 pub
  • 删除单链表中的节点

    如何删除只有一个指针指向要删除节点的单链表中的节点 起始和结束指针未知 可用信息是指向应删除节点的指针 您可以在不获取前一个节点的情况下删除节点 方法是让它模仿以下节点并删除该节点 void delete Node n if is sent
  • clojure 中的反转哈希映射

    我在 clojure 中有哈希映射 key1 value1 key2 value2 key3 value1 我需要将其转换为哈希映射 value1 key1 key3 value2 key2 有 Clojure 方法可以做到这一点吗 clo
  • 如何从 trie 构造 DAWG?

    我只是构建一个trie http en wikipedia org wiki Trie对于一个词汇表 然后我发现有很多分支共享相同的结构 我想将它们组合在一起 结果是DAWG http en wikipedia org wiki Deter
  • 基于正方形瓷砖直角三角形象限的坐标系中的边界框

    我正在为游戏创建一个基于图块的 2D 地形系统 然而 我还使用游戏中的坐标 需要能够将边界框映射到 图块坐标 中 并点击边界框接触的每个图块 不用担心 有一个 kd 树和所有工作 美好的 使用定点 真实世界 坐标 我可以将每个图块计为 2
  • 谷歌采访:找到多边形的最大和[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 给定一个多
  • Go 中带有 TTL 选项的映射

    我需要构建这样的数据结构 map string SomeType 但它必须将值存储大约 10 分钟 然后从内存中清除 第二个条件是记录数量 它必须是巨大的 该数据结构必须至少添加每秒 2 5K 条记录 那么 Go 中最正确的实现方法是什么
  • 布隆过滤器的实现

    使用布隆过滤器 我们将获得空间优化 cassandra 框架也有 Bloom Filter 的实现 但具体来说 这种空间优化是如何实现的呢 您可以使用以下示例了解它如何节省空间 假设我在 Google Chrome 团队工作 我想向浏览器添
  • 在可移植 C 中模拟打包结构

    我有以下结构 typedef struct Octree uint64 t data uint8 t alignas 8 alloc uint8 t dataalloc uint16 t size datasize node0 Node8
  • Delphi是否存在无锁队列“多个生产者-单个消费者”?

    我发现了几个针对单个生产者 单个消费者的实现 但没有找到多个生产者 单个消费者的实现 Delphi是否存在 多个生产者 单个消费者 的无锁队列 无锁队列全线程库 http otl 17slon com支持多个生产者 您可以将它与线程库分开使
  • 用于检索编辑距离接近的字符串的数据结构

    例如 从一组英语单词开始 是否有一种结构 算法允许使用单词 right 作为查询来快速检索诸如 light 和 tight 之类的字符串 即 我想检索与查询字符串编辑距离较小的字符串 The BK tree http blog notdot
  • 将文件保存为 MYSQL 数据库中的 blob 或文件路径

    我知道这些问题是常见问题之一 但我需要您针对具体案例提供帮助 我正在开发一个应用程序 其中一些用户可以添加订单 一些用户可以执行这些订单 这些订单非常具体 因此只有有限数量的用户可以添加它们 然后 为每个订单生成三个文档 每个文档的大小不超
  • 如何定义基于标签的组织结构?

    原标题 有没有办法在基于标签的组织方法上强制建立关系结构 我有一些实体 它们有一系列属性 一些属性影响实体可以具有的其他属性 许多属性被组织成组 并且有时实体被要求具有来自某些组的一定数量的属性 或者可能具有来自某些组的一定范围的属性 有没
  • 链表迭代器实现 C++

    我已经在 C 中创建了一个链接列表 并想为其实现一个迭代器 以便我可以执行范围循环 for const int i list where Linked List
  • `ImmutableSortedSet` 和 fsharp `Set` 有什么区别?

    BCL引入了一组Immutable Collections http blogs msdn com b bclteam archive 2012 12 18 preview of immutable collections released
  • 为什么 .Net 词典中的条目是按加法顺序排列的?

    我刚刚看到这种行为 我对此感到有点惊讶 如果我向字典中添加 3 或 4 个元素 然后执行 For Each 来获取所有键 它们将以我添加的顺序出现 这让我感到惊讶的原因是字典内部应该是一个哈希表 所以我希望事情能以任何顺序出现 按键的哈希排
  • 如何从数组表示构建不完全二叉树

    如果输入是一个数组 其中null表示没有节点 input 1 2 3 null 5 null 7 请假设我已经检查过输入 对于每个array i 它的父母array i 2 不会是null 递归地 所以根不能是null 如何构建具有这样的逻
  • 为什么在排序输入上插入到树中比随机输入更快?

    现在我一直听说从随机选择的数据构建二叉搜索树比有序数据更快 这仅仅是因为有序数据需要显式重新平衡以将树高度保持在最低限度 最近我实现了一个不可变的treap http en wikipedia org wiki Treap 一种特殊的二叉搜
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1

随机推荐

  • 从源代码编译 Ruby 1.8.7 时出错:math.c:37: 错误:标记“(”之前缺少二元运算符

    这真的很奇怪 josh josh wget ftp ftp ruby lang org pub ruby 1 8 ruby 1 8 7 tar bz2 josh josh tar xvjf ruby 1 8 7 tar bz2 josh j
  • Xcode Autolayout - 约束等于另一个约束

    我终于尝试在 IB 中采用自动布局 但在为某些对象设置约束时遇到问题 我基本上希望 5 个视图在整个超级视图中垂直均匀分布 我有 3 个按钮 由 2 行分隔 我希望间距 D1 D2 D3 和 D4 相等WITHOUT调整任何东西的高度 在I
  • Laravel 4 + AJAX 不工作

    我对 Laravel 4 很陌生 我正在尝试测试 AJAX 请求 In my script js我有这个 function login submit click function e e preventDefault return ajax
  • Ruby 模型的数组属性

    是否可以为数组类创建一个属性 我尝试阅读this https stackoverflow com questions 3438827 ruby model with an array as an attribute但我并没有从中得到太多 我
  • 无法在真实设备上的 iOS 10 上运行 Appium 测试

    自从将我的设备和 xCode 更新到 iOS 10 和 Xcode 8 以来 我一直无法在真实设备上成功设置 Appium 测试 不过 我在模拟器上运行得很好 以下是我的功能设置 DesiredCapabilities cap new De
  • Rails 表单动态添加字段

    我正在尝试设置一组字段以根据需要动态显示 在模型中 我有以下字段 attr accessible instruct1 instruct2 instruct30 我希望表单只显示 instruct1 并带有一个按钮来添加 1 个字段 直到击中
  • 在 Apex 类中引用远程站点设置 URL?

    我有一个 webservice 类 它将位于托管包中并分发给多个客户端 该类当前有一个变量 其中包含它所访问的服务器的硬编码值 问题 每个客户端的服务器都不同 因此硬编码值不起作用 我认为由于每个客户端都必须将其服务器添加到其远程站点设置中
  • 如何比较 MySQL 数据库模式 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在寻找一个可以让我比较 MySQL 数据库模式的工具 哪个是最好的工具来做到这一点 Navicat 能够为您做到这一点 它还将同步两个 mysql
  • AES加密/解密

    以下是一些适用于字符串的代码 Public Function AESEncrypt ByVal PlainText As String ByVal Password As String ByVal salt As String Dim Ha
  • 如何在“git Push”之后在本地和远程撤消“git commit”

    我已经表演过git commit随后是一个git push 如何在本地和远程存储库上恢复该更改 git log commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8 Author Michael
  • 开源 Twitter 克隆(在 Ruby/Python 中)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何用 Ruby 或 Python 编写的生产就绪的开源 Twitter 克隆 我对功能丰富的实现
  • 如何备份 Django 数据库

    我有一个使用 Postgres 数据库的 Django 应用程序 我需要能够备份和恢复数据库 既确保没有数据丢失 又能够在测试期间将数据从生产服务器复制到开发服务器 似乎有几种不同的方法可以做到这一点 只需直接与数据库交互即可 因此 对于
  • CKEditor 如何在取消帖子时删除服务器中的图像文件

    我正在使用nodeJS 后端 react 前端 mongoDB 我安装了 CKEditor5 以便在船上发布许多图像 它可以完美地在我的服务器文件夹上上传图像CKfinder But 如果有人停止发布上传的图像 无用的图像将保留在我的服务器
  • 警告:远程 HEAD 引用不存在的引用,无法结帐

    由于不同原因 这似乎是一个常见的错误 我有一个简单的裸 git 存储库 名为 kiflea git 我像这样克隆它 git clone git kipdola be kiflea git 然后 git 告诉我 warning remote
  • Mockito 3 any() 严格存根参数不匹配

    我正在使用 Mockito 3 1 0 我正在尝试用以下语法模拟我的方法 when mockedObject myMethod any HttpServletRequest class thenReturn 1 myMethod很简单 pu
  • 如何在 Strawberry Perl 中更改@INC?

    我该如何改变 INC永久地 而不改变我的脚本 在 Strawberry Perl 中 我知道 I 但不想每次都调用该开关 要添加路径 请将环境变量 PERL5LIB 设置为这些路径 注意 这将影响您运行的所有 Perl 安装 操作方法 右键
  • Task.FromResult() 与 Task.Run()

    我最近遇到过不少情况async方法同步执行 但无论如何都会返回一个任务 因此可以等待它们 例如 public virtual Task CreateAsync TUser user ThrowIfDisposed if user null
  • File.isFile() 返回错误结果? [复制]

    这个问题在这里已经有答案了 public class Test public static void isFile System out println new File D a log isFile public static void
  • 为什么不能在构造函数中实例化该类的同一对象?

    public class Run public static void main String args A a1 new A class A public A A a new A here as well A a new A 为什么这给出
  • 链表相对于数组有什么优点,反之亦然?

    请解释一下链表相对于数组的优点是什么 与链表相比 使用数组有什么优点吗 问候 舒阿布 两者都存储元素序列 但使用不同的技术 An array将元素按连续顺序存储在内存中 即如下所示 item 1 item 2 item 3 item x h