Data structures C#集合的实现和操作的复杂性是什么?

Data structures C#集合的实现和操作的复杂性是什么?,data-structures,c#-2.0,Data Structures,C# 2.0,我想缓存10.000+个键/值对(两个字符串),并开始考虑哪种.NET(2.0,绑定到MS Studio 2005:()结构最好。所有项都将一次性添加,然后将对特定键进行几百次查询。 我已经阅读了中引用的MSDN描述,但我仍然错过了关于各种集合上操作的实现/复杂性的一些细节。 例如,在上述问题中,MSDN引用了SortedList基于树的说法,SortedDictionary“具有相似的对象模型”,但复杂性不同。 另一个问题:哈希表和字典的实现方式是否相同? 对于哈希表,它们: 如果Count小

我想缓存10.000+个键/值对(两个字符串),并开始考虑哪种.NET(2.0,绑定到MS Studio 2005:()结构最好。所有项都将一次性添加,然后将对特定键进行几百次查询。
我已经阅读了中引用的MSDN描述,但我仍然错过了关于各种集合上操作的实现/复杂性的一些细节。 例如,在上述问题中,MSDN引用了SortedList基于树的说法,SortedDictionary“具有相似的对象模型”,但复杂性不同。 另一个问题:哈希表和字典的实现方式是否相同?
对于哈希表,它们:

如果Count小于哈希表的容量,则此方法为O(1)操作。如果需要增加容量以容纳新元素,则此方法为O(n)操作,其中n为Count

但当容量增加时(每增加一次),则增加一系列键/值对的二次复杂性。与SortedList相同

未提及OrderedDictionary,其中未提及实现/复杂性


也许有人知道一些关于.NET集合实现的好文章?

容量哈希表不同于
计数

通常情况下,容量——可以存储的最大项数,通常与底层散列桶的数量相关——在“增长”时加倍是必需的,但这取决于实现。
计数
仅指实际存储的项目数,必须小于或等于容量,否则不相关

由于间隔呈指数增长(在
O(n)
,n=Count,resizing之间),大多数散列实现都要求
O(1)
访问权限。引文只是说:“嘿!它是分期付款的,并不总是正确的!”


快乐编码。

如果要添加那么多对,可以/应该使用预先指定容量。然后每次添加和查找都将是O(1)


如果您确实想了解这些类是如何实现的,可以查看或使用System.Collections(不确定后者的合法性)。

哈希表和
字典
的实现方式相同。
字典
哈希表
的通用替代品

当像
List
Dictionary
这样的收藏容量必须增加时,它会以一定的速度增长。对于
List
来说,这个速度是
2.0
,即容量是原来的两倍。我不知道
Dictionary
的确切速度,但它的工作原理是一样的


对于一个
列表
,容量增加的方式意味着一个项目被平均额外复制了1.3倍。由于该值在列表增长时保持不变,因此
添加
方法仍然平均是一个O(1)操作。

字典是一种哈希表;我从不使用原始哈希表,因为它只保存数据“objects”。当容量增加时,不要担心插入是O(N);当哈希表满时,Dictionary总是将容量加倍,因此平均(摊销)复杂度是O(1)

您几乎不应该使用SortedList(它基本上是一个数组),因为每次插入或删除的复杂度都是O(N)(假设数据尚未排序。如果数据已排序,则得到O(1),但如果数据已排序,则仍然不需要使用SortedList,因为普通列表就足够了。)使用SortedList代替SortedList,它为插入、删除和搜索提供O(N log N)。但是,SortedDictionary比Dictionary慢,因此仅当您的数据需要排序时才使用它


你说你想缓存10000个键值对。如果你想在执行任何查询之前进行所有插入,一个有效的方法是创建一个未排序的列表,然后将其保存,并用于查询。与使用SortedDictionary相比,这种方法节省了大量内存,并且为垃圾收集器创建的工作更少。

谢谢,我没有这样做s关于生长因子的信息。感谢您提供的信息。为什么SortedDictionary比Dictionary慢?它是基于树的吗?想法是List/Right。并且List初始化为Capacity=键/值对的数量,正如Joe Cheng在下面暗示的那样。@MkL SortedDictionary和SortedList都不使用哈希代码/哈希算法——这就是为什么它们是
O(lg n)
/
O(n lg n)
/
O(n)
用于访问/插入。(我个人认为选择的名称很糟糕:-)字典使用哈希算法(尽管这不是IDictionary接口的要求)就速度而言,它可能更快,也可能不更快。Big-O谈到了限制。
N
C
的特定值需要考虑到真实世界的性能。SortedDictionary不仅在理论上较慢,我还对其进行了基准测试:谢谢。字典的容量是多少?-哈希表中的存储桶数?如何您获得的id为1.3?如果列表的容量正好增加了一倍,则由于重新分配,每个项目应额外复制一次。但无论如何,添加仍然是O(1)@MkL:dictionary的容量是指它能容纳多少项,即内部用于存储项的数组的大小。bucket本身并不是作为对象存在的,有一个数组用于KeyValue项,还有一个数组用于同一bucket中下一项的索引。数字1.3是项如何组合的结果在任何给定的时间,33%到100%的项目至少复制了一次,其中1/3的项目至少复制了两次,1/3的项目至少复制了三次,依此类推。感谢您的提示:构造函数和查看源代码的机会-这