我们知道有两种经典的冲突解决策略:分离链接和开放寻址。
我想知道在.net中为HashTable / Dictionary选择了哪一个。
还是使用过其他策略?
答案 0 :(得分:15)
本文在MSDN上对此进行了描述:An Extensive Examination of Data Structures Using C# 2.0
...称为rehasing的冲突解决技术,即 .NET Framework的Hashtable类使用的技术。在决赛中 我们将看一下使用碰撞的Dictionary类 分辨率技术称为链接。 ....
... Rehasing的工作原理如下:有一组哈希不同 函数,H1 ... Hn,以及从中插入或检索项目时 哈希表,最初使用H1哈希函数。如果这导致 碰撞时,H2会被尝试,如果需要,可以直到Hn。 上一节只显示了一个哈希函数,即 初始哈希函数(H1)。其他哈希函数非常相似 对于此功能,仅通过乘法因子进行区分。在 一般来说,哈希函数Hk定义为:
Hk(key) = [GetHash(key) + k * (1 + (((GetHash(key) >> 5) + 1) % (hashsize – 1)))] % hashsize
Dictionary类在更多方面与Hashtable类不同 不止一个。除了强类型之外,字典也是如此 采用与Hashtable不同的冲突解决策略 类,使用称为链接的技术。回想一下 探测,如果发生碰撞,列表中的另一个插槽 水桶尝试。 (通过重新散列,重新计算哈希值,然后重新计算 尝试使用新的插槽。)然而,使用链接,辅助数据结构 用于保持任何碰撞。具体来说,每个插槽都在 Dictionary具有映射到该存储桶的元素数组。在里面 碰撞事件,碰撞元素被预先附加到 桶的清单。
请记住,只有第一句话是我自己的: - )
答案 1 :(得分:5)
这实际上是一个非常有趣的问题;我刚刚在Dictionary
幕后实现了Hashtable
。我可以在稍后的内容中介绍{{1}}。