Alerr Asked:2022-07-24 13:59:35 +0000 UTC2022-07-24 13:59:35 +0000 UTC 2022-07-24 13:59:35 +0000 UTC 插入、删除和访问元素的最佳数据结构是什么? 772 您需要选择最适合任务的结构:添加、删除和访问元素。而且您还需要能够快速迭代结构的所有键而不产生垃圾。另外,该结构必须包含一个字段(键),即不需要值字段(值)。 在这里,我找到了有关数据结构的信息。 看起来SortedSet最适合这个,但我不确定。提示视图中任务的最佳数据结构。 c# 1 个回答 Voted Best Answer VladD 2022-07-24T21:32:29Z2022-07-24T21:32:29Z 我猜什么最适合你HashSet<T>。 根据您提供的链接,访问一个元素(即基本上通过元素本身检查它是否在集合中)并添加具有 O(1) 的(摊销)渐近复杂度。根据官方文档,删除也有 O(1) 复杂度。 枚举有点复杂,我在文档中没有找到任何保证,但是查看源代码,内部循环只是foreach通过HashSet<T>内部集合进行循环,该集合_entries基本上包含所有元素HashSet<T>,以及可用空间。然而,在当前实现中,如果您添加了大量元素然后删除它们(Remove不调整大小),可用空间的百分比可能很大,所以_entries我们得到实例。O(M)MHashSet<T> 与此相比: List<T>: 删除很慢,因为它平均需要移动集合的一半元素;按值搜索元素还需要平均查看一半的集合;添加(到列表末尾)很快(摊销),枚举非常快(相当于通过数组) SortedSet<T>:访问和加法的渐近行为比 的更差(O(log n)),因为HashSet<T>需要将集合维持在排序状态的成本 Queue<T>和Stack<T>- 就您的目的而言,与List<T> LinkedList<T>它还需要平均查看一半的集合才能访问,但添加/删除和枚举速度很快。 如果您的收藏将包含大量元素,那么所有这些都是有意义的。对于小型集合,性能通常List<T>优于复杂集合(由于对大型集合的操作更简单,但效率较低)。在这种情况下,简单地衡量您的特定用例在不同类型的集合上执行所花费的时间是有意义的。
我猜什么最适合你
HashSet<T>。根据您提供的链接,访问一个元素(即基本上通过元素本身检查它是否在集合中)并添加具有 O(1) 的(摊销)渐近复杂度。根据官方文档,删除也有 O(1) 复杂度。
枚举有点复杂,我在文档中没有找到任何保证,但是查看源代码,内部循环只是
foreach通过HashSet<T>内部集合进行循环,该集合_entries基本上包含所有元素HashSet<T>,以及可用空间。然而,在当前实现中,如果您添加了大量元素然后删除它们(Remove不调整大小),可用空间的百分比可能很大,所以_entries我们得到实例。O(M)MHashSet<T>与此相比:
List<T>: 删除很慢,因为它平均需要移动集合的一半元素;按值搜索元素还需要平均查看一半的集合;添加(到列表末尾)很快(摊销),枚举非常快(相当于通过数组)SortedSet<T>:访问和加法的渐近行为比 的更差(O(log n)),因为HashSet<T>需要将集合维持在排序状态的成本Queue<T>和Stack<T>- 就您的目的而言,与List<T>LinkedList<T>它还需要平均查看一半的集合才能访问,但添加/删除和枚举速度很快。如果您的收藏将包含大量元素,那么所有这些都是有意义的。对于小型集合,性能通常
List<T>优于复杂集合(由于对大型集合的操作更简单,但效率较低)。在这种情况下,简单地衡量您的特定用例在不同类型的集合上执行所花费的时间是有意义的。