根据this,哈希表中搜索的时间复杂度为O(1)。
但是如果发生碰撞,那么显然这应该是O(1)+某事。
我的问题是:
当你说
时get(someKey)
从哈希表中,哈希函数应用于someKey,并直接从该位置检索数据。
但是想象Seperate Chaining用于解决冲突。并且假设someKey和someOtherKey在我们的哈希函数应用之后具有相同的输出。假设它是值“25”。
所以当我说
时get(someKey)
我将从位置“25”获取数据。这使它成为O(1)。大。
然而,当我说
时get(someOtherKey)
现在 someOtherKey 链接到 someKey 的位置。
当在 someOtherKey 上应用散列时,我得到25。
如何获得我需要的价值?什么是内部人员?还有其他桌子吗?算法如何流动?是否有其他表用于存储所有碰撞?
谢谢。我希望我的问题很清楚!
答案 0 :(得分:2)
有许多不同的数据结构可用于处理冲突。这是一个很好的总结。 http://en.wikipedia.org/wiki/Hash_table
哈希函数将搜索范围缩小到数据结构中的单个bucket
。然后,存储桶包含另一个用于解决冲突的数据结构。它可以链接到数组,其中键以排序或未排序的顺序维护。链接可以是链接的键列表中的第一个元素,也可以是b树的根节点。重要的是,散列函数很快就会缩小搜索范围。
缩小范围后,其他一些效率较低的搜索可能有助于解决冲突。这完全取决于权衡取舍。您需要一种散列算法,该算法可提供足够大的散列(和存储桶)范围,以最大限度地减少冲突,限制为您可以承受的内存量。如果碰撞很少,则通过链接的碰撞列表进行线性搜索也不错。如果存在多次冲突,那么为数据桶重新调整大小的效率变得更加重要。