【问题标题】:Array versus linked-list数组与链表
【发布时间】:2010-09-15 01:51:56
【问题描述】:

为什么有人要在数组上使用链表?

毫无疑问,编写一个链表比使用一个数组需要更多的工作,人们可能想知道什么是额外工作的合理性。

我认为在链表中插入新元素是微不足道的,但它是数组中的主要工作。使用链表存储一组数据与将其存储在数组中相比,还有其他优势吗?

这个问题不是this question 的重复,因为另一个问题是专门询问特定的Java 类,而这个问题是关于一般数据结构的。

【问题讨论】:

标签: arrays data-structures linked-list language-agnostic


【解决方案1】:

Eric Lippert 最近在post 上讨论了应该保守使用数组的原因之一。

【讨论】:

  • 诚然是一篇好文章,但与链表和数组的讨论无关。
  • 我建议 Eric 的大部分文章都是相关的,因为它讨论了数组的缺点和列表的优点,而不管列表的实现。
【解决方案2】:
  • 在链表中存储不同大小的数据更容易。数组假定每个元素的大小完全相同。
  • 正如您所提到的,链表更容易有机地增长。数组的大小需要提前知道,或者在需要增长时重新创建。
  • 洗牌链表只是改变什么指向什么的问题。洗牌数组更复杂和/或占用更多内存。
  • 只要您的迭代都发生在“foreach”上下文中,您就不会在迭代中失去任何性能。

【讨论】:

  • 不同尺寸的物品如何区别对待?链表要么使用带有下一个字段的固定结构(需要固定大小),要么存储指向汽车中数据的指针(可变大小OK)。这两种方法都与向量一样容易。洗牌也是一样。
  • 我会说洗牌数组不那么复杂。
  • 此答案不正确且具有误导性。 (除了在声明数组时需要知道数组的大小)
  • 由于数据局部性,迭代链表不会变慢吗?
  • @Rick,向量通常会过度分配它们需要的空间,这样它们就不需要在每次大小增加时分配新空间。结果是向量通常占用更少的内存,而不是链表。
【解决方案3】:

这是一个快速的方法:移除物品更快。

【讨论】:

    【解决方案4】:

    除了插入到列表中间更容易 - 从链表中间删除也比数组容易得多。

    但坦率地说,我从未使用过链表。每当我需要快速插入和删除时,我也需要快速查找,所以我使用了 HashSet 或 Dictionary。

    【讨论】:

    • 没错,插入和删除大部分时间都是在搜索之后,所以还需要考虑时间复杂度的总和。
    猜你喜欢
    • 2014-10-25
    • 1970-01-01
    • 2013-08-28
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2017-07-17
    • 2016-11-19
    相关资源
    最近更新 更多