字典<>顺序与随机的表现

时间:2011-07-13 17:25:26

标签: .net algorithm hash dictionary

我正在使用Dictionary< long,object>存储数百万条目。这些数字是以序列号的数量添加的。

我记得有些哈希算法在按顺序添加密钥时遇到了问题。

这是.Net的情况吗? 如果是这样,我的选择是什么? (任何整洁的lib?)

添加后数据相当静态。是否值得通过随机化器添加数据?

PS我已经检查过了:

3 个答案:

答案 0 :(得分:1)

查询的性能应该与添加到哈希表的顺序键无关。即使存在碰撞,插入元素也很容易通过链接进行O(1)摊销。

您是否真的测量过性能问题?如果没有,请不要费心做出改变。如果是这样,请考虑编写针对顺序索引优化的类。

答案 1 :(得分:0)

注意:通过“序列”,我的意思是数字序列递增1。

实际上,如果添加到字典中的唯一键是按序列(没有重复或间隙),那么这是最好的情况。在.Net的当前实现中(可能随时更改,因此您不应该依赖于任何此类),long.GetGashCode()对于所有数字序列都会返回一系列数字。并且桶号是以字典的模数容量计算的。这意味着在这种情况下,您可以保证不会发生碰撞。

如果你有多个相同长度的序列,最糟糕的情况是它们全部碰撞,每个用过的桶将为每个序列包含一个项目。但这不太可能。在一般情况下,你会得到一些碰撞,但平均检索时间很可能仍然是O(1)。

(上面有一个小小的谎言。对于32位边界的每个交叉点,序列的哈希码序列将有一个数字的间隙,因为long.GetHashCode()的方式是实现。)

答案 2 :(得分:0)

字典可能会为很多项目带来大量开销,并且它依赖于良好的哈希分布以获得理想的性能。

您可能希望针对其他方法运行一些基准测试,是否可以简单地分配数组并使用密钥作为索引?例如object [long],如果你只有0到1百万的可能值,那么数组需要少于8MB,并且比字典快得多。

如果你不能直接这样做,你可以查找唯一的long to int索引?比如有一个字典可以让你把long转换成一个不断增加的int,当一个新的long进入你之前你还没有看到它在数组中被分配一个位置。

或者可能有更复杂的方法与锯齿状数组,如object [sequenceInt] [uniqueIndexInt]。这实际上取决于您以后如何访问数据