【问题标题】:LinkedList memory consumption versus List when working with large arrays处理大型数组时,LinkedList 内存消耗与 List
【发布时间】:2011-02-16 19:20:14
【问题描述】:

谁能告诉我是否允许结构的链表比等效的列表更大(假设列表使用加倍策略来增加其内部数组的大小)。

所以给定一个 40 字节的结构(我知道 16 字节和结构的东西,但我在这里使用一些遗留代码,将结构更改为类并不是一个简单的选择)我的理解就是每次调整列表的内部数组大小时,都需要为新数组分配内存(new_array_size * 40)。因此,对于一个非常大的数组,您最终会得到一个内存不足异常,因为没有足够大的连续空间来创建这个新数组。我知道链表需要为每个元素(节点)提供更多空间,因为它需要保存指向列表中项目的正向和反向指针,但我的问题是这是否意味着要添加一个额外的元素,您只需要一个连续的内存槽(40 + the_space_needed_for_the_pointers)。换句话说,链表不会因为必须分配一个巨大的新连续内存部分来扩展而受到影响。

【问题讨论】:

    标签: .net memory list linked-list


    【解决方案1】:

    是的,这很准确。 LinkedList 不使用数组进行存储,它实际上是一个引用链。当您需要存储大量元素时,大型对象堆中不会出现垃圾,这与 List 不同,并且避免了地址空间碎片导致您的程序提前退出的麻烦。

    注意它不是 List 的替代品,索引是 O(n) 而不是 O(1)。差别很大,除非您总是按顺序迭代列表。当您需要做出此类尖锐的选择时,是时候开始考虑使用 64 位操作系统了。

    【讨论】:

      【解决方案2】:

      由于链表仅引用前向和后向引用,因此您不必受限于连续的内存分配。 @Hans 的回答有优点;但是,我不同意 64 位操作系统是拥有高性能索引的唯一选择。

      你是否仅限于这 2 个选择?

      如果要引用大量结构,可以考虑使用二叉树吗?使用树的好处是索引是链表的一部分 - O(log n)。缺点是保持树平衡的额外工作。平衡是必要的——没有平衡,你最终会得到一个链表的等价物。

      查看这个MSDN article(6 部分),从第 3 部分开始,使用二叉树。基本 BST 有多种变体。

      【讨论】:

      • 感谢您的回复。我已经读过几次 Scott Mitchell 关于数据结构的文章,我相信我会再回来看看它们。我当前的问题实际上并不需要比能够遍历列表更多的东西。
      猜你喜欢
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2020-11-18
      • 2015-04-04
      相关资源
      最近更新 更多