【问题标题】:which collection class is efficient for insertion in C#哪个集合类在 C# 中插入是有效的
【发布时间】:2012-03-01 01:34:00
【问题描述】:

如果我想在这些集合类“字典”、“列表”和“排序列表”中插入数据,执行插入所需的时间更少?你能给我一个代码来解释这个过程吗?

【问题讨论】:

  • DictionaryLinkedList 都应该具有良好的插入特性。你想要“代码”还是解释?
  • 字典和列表有很大的不同。
  • @BenVoigt:字典?对于纯插入,我想不出更糟糕的集合。为什么不List 或其他未排序的容器?
  • @Ben 谢谢你的回答,你能告诉我如何测试这些性能吗?如果你能在代码中给我一个例子
  • 如果您说出应用程序的用途而不是询问哪个插入时间更快,也许会更好。正确使用哪种数据结构还有很多考虑因素,例如插入时间、查找时间、占用的内存等。

标签: c# .net visual-studio-2010 generics collections


【解决方案1】:

向 LinkedList 插入一个值是 O(1) 操作。列表(由数组实现)可能需要额外分配和复制项目。

【讨论】:

  • 如果已经持有对相邻节点的引用,则为 O(1)。链表维护对FirstLast 节点的引用。如果插入必须发生在链表的中间,在不知道插入位置前后相邻的节点的情况下,则需要跳过半个链表才能到达目标节点,不再是O (1) 操作。(但最坏的情况是“O(n/2)”,我们应该简单地写成 O(n)。)
  • @Frédéric 需要查找未引用的成员是一种查找,它对链表来说并不特殊。例如,如果你不知道数组中某个成员的索引,你仍然需要遍历数组来寻找它。
【解决方案2】:

如果您的性能要求很严格,您应该在决定之前衡量您的环境和您的数据

我将提供一些猜测,在您进行自己的测量之前,您不应认为这些猜测是理所当然的:

  • 如果您事先知道元素的数量,只需使用 预分配的List(或数组)。
  • 如果您不这样做:
    • 使用块列表(即LinkedList<List<T>>)来避免List 调整大小。
    • 或者,为简单起见,您可以只使用List 并招致一些 调整大小以接受更多元素时的性能损失。我是 不确定这种惩罚是否可以证明使用DictionaryLinkedList 取而代之的是 - 但如果你测量,你会的;)

所有这一切都是假设您不关心集合中的何处插入了新元素以及以后如何检索它...如果您确实关心,那么您将根据那个来选择您的数据结构,而不仅仅是插入性能。

【讨论】:

    【解决方案3】:

    List<T> 的插入速度最快。
    LinkedList<T> 的插入速度最快在头部

    对于大多数实际应用而言,差异将是微乎其微的;您应该使用适合您需要的任何一种。

    【讨论】:

    • List<T> 具有快速(摊销的O(1)追加,但插入性能很差。
    • @BenVoigt: List<T> 仍然需要定期调整其数组大小。
    • 这就是为什么 append 是 O(1) 摊销,而不是 O(1) 每次插入。
    • 我知道。这就是为什么 LinkedList 的头部插入速度更快。
    • LinkedList 在除末尾之外的任何位置插入的复杂性较低,因为对于List,所有后面的元素都必须移动以腾出空间。并且该成本没有摊销。但这与调整数组大小无关。
    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多