如何在碰撞中从HashTable中检索数据?

时间:2013-03-30 15:19:19

标签: hash hashmap hashtable hashcode hash-collision

根据this,哈希表中搜索的时间复杂度为O(1)。

但是如果发生碰撞,那么显然这应该是O(1)+某事。

我的问题是:

当你说

get(someKey) 

从哈希表中,哈希函数应用于someKey,并直接从该位置检索数据。

但是想象Seperate Chaining用于解决冲突。并且假设someKey和someOtherKey在我们的哈希函数应用之后具有相同的输出。假设它是值“25”。

所以当我说

get(someKey)

我将从位置“25”获取数据。这使它成为O(1)。大。

然而,当我说

get(someOtherKey) 

现在 someOtherKey 链接到 someKey 的位置。

当在 someOtherKey 上应用散列时,我得到25。

如何获得我需要的价值?什么是内部人员?还有其他桌子吗?算法如何流动?是否有其他表用于存储所有碰撞?

谢谢。我希望我的问题很清楚!

1 个答案:

答案 0 :(得分:2)

有许多不同的数据结构可用于处理冲突。这是一个很好的总结。 http://en.wikipedia.org/wiki/Hash_table

哈希函数将搜索范围缩小到数据结构中的单个bucket。然后,存储桶包含另一个用于解决冲突的数据结构。它可以链接到数组,其中键以排序或未排序的顺序维护。链接可以是链接的键列表中的第一个元素,也可以是b树的根节点。重要的是,散列函数很快就会缩小搜索范围。

缩小范围后,其他一些效率较低的搜索可能有助于解决冲突。这完全取决于权衡取舍。您需要一种散列算法,该算法可提供足够大的散列(和存储桶)范围,以最大限度地减少冲突,限制为您可以承受的内存量。如果碰撞很少,则通过链接的碰撞列表进行线性搜索也不错。如果存在多次冲突,那么为数据桶重新调整大小的效率变得更加重要。