Hash 如何在冲突中从哈希表检索数据?

Hash 如何在冲突中从哈希表检索数据?,hash,hashmap,hashtable,hashcode,hash-collision,Hash,Hashmap,Hashtable,Hashcode,Hash Collision,根据,哈希表中搜索的时间复杂度为O(1) 然而,如果有碰撞,那么显然这应该是O(1)+什么 我的问题是: 当你说 get(someKey) 从哈希表中,将哈希函数应用于someKey,并直接从该位置检索数据 但imagine用于冲突解决。想象一下,对someKey和someOtherKey应用哈希函数后,它们有相同的输出。假设它是值“25” 所以当我说 get(someKey) get(someOtherKey) 我将从位置“25”获取数据。这就是O(1)。太好了 但是当我说 get(

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

然而,如果有碰撞,那么显然这应该是O(1)+什么

我的问题是:

当你说

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

但imagine用于冲突解决。想象一下,对someKey和someOtherKey应用哈希函数后,它们有相同的输出。假设它是值“25”

所以当我说

get(someKey)
get(someOtherKey) 
我将从位置“25”获取数据。这就是O(1)。太好了

但是当我说

get(someKey)
get(someOtherKey) 
现在someOtherKey链接到someKey所在的位置

当散列应用于someOtherKey时,我得到25

如何获得所需的值?内部结构是什么?还有别的桌子吗?算法是如何运行的?是否有其他表格用于存储所有冲突?


多谢各位。我希望我的问题是清楚的

有许多不同的数据结构可用于处理碰撞。这里有一个很好的总结

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


一旦范围缩小,其他一些效率较低的搜索将有助于解决冲突。这一切都是为了取舍。您需要一个哈希算法,该算法提供足够大的哈希(和存储桶)范围,以最小化冲突,限制在您能负担的内存量之内。如果碰撞很少见,那么通过碰撞链接列表进行线性搜索也不错。如果存在许多冲突,那么重新调整存储桶阵列大小的效率就变得更加重要。

谢谢。所以哈希表保存的是bucket,而不是直接保存的值?这取决于实现。一些设计可能被构造为直接在bucket中的数据结构中保留一定数量的值,并且仅在bucket满时溢出到二级结构。在bucket中保留一个值,然后为任何辅助值设置一个指向链接列表的指针,这尤其有意义。因此,它实际上是将链表的第一个节点保留在bucket中,这还取决于值的大小。在库中实现的一般情况哈希表对于许多可能的大小和值范围必须是灵活的。如果预先知道数据集(值的数量、值的范围),则可以设计比一般情况更有效的特定结构。只有在边缘情况下,才值得做大量的工作。这里有一个非常好的资源: