哈希表中CRUD操作的冲突与复杂性之间有什么联系?

问题描述 投票:0回答:2

在阿迪蒂亚·巴尔加瓦(Aditya Bhargava)的书中,“阅读算法:程序员和其他好奇者的图解指南”我读到,如果避免冲突,可以避免最坏情况下的复杂性。据我了解,冲突-是哈希函数在不同键的情况下返回相同值的情况。它如何影响CRUD操作中的哈希表复杂性?谢谢

algorithm hashtable complexity-theory collision
2个回答
1
投票
如果我们避免冲突,可以避免最坏情况下的复杂性。

是的,当哈希表中存储的所有元素的所有哈希值都映射到同一存储桶并在同一存储桶上发生碰撞时,最复杂的情​​况就会发生。

据我所知,冲突-是哈希函数在键不同的情况下返回相同值的时间。

最终,使用哈希函数将值映射到哈希表中的存储桶。就是说,通常将整体概念哈希函数实现为产生巨大数值范围内的值的哈希函数(例如,介于0和2 ^ 32-1之间的32位哈希,或介于0和0之间的64位哈希)和2 ^ 64-1),然后使用%运算符根据当前哈希表存储桶计数将该值映射到特定存储桶。因此,假设您的哈希表有137个存储桶,您可能会生成一个哈希值139,然后说139%137 == 2并使用第三个(存储桶数组中的[2])。无论表的大小如何,此两步方法都可以轻松使用相同的哈希函数(产生32位或64位哈希)。如果您改为创建一个直接产生0到136之间的数字的哈希函数,则对于较小或较大的存储桶计数根本无法正常工作。

返回您的问题...

据我所知,冲突-是哈希函数在键不同的情况下返回相同值的情况。...对于上文所述的“ 32位或64位哈希函数后跟%”的方法,有两种不同类型的冲突:32位或64位哈希函数本身可能会产生完全相同的32位或用于散列的不同值的64位值,否则它们可能会产生不同的值-在%操作之后-永远不会映射到哈希表中的同一存储桶。

它如何影响CRUD操作中的哈希表复杂性?

哈希表通过概率性地将值分布在存储桶中来工作。当多个值在同一个存储桶中发生冲突时,必须使用辅助搜索机制来处理所有冲突的值(以及其他可能混合的值,如果您使用开放式寻址来尝试哈希表中的存储桶序列,则不是将碰撞元素的链表或二进制树挂在每个存储桶上)。因此,从根本上讲,冲突率越差,获得的理想O(1)复杂度就越远,尽管实际上,如果具有

特别是错误的哈希函数,您实际上才开始显着影响big-O复杂度。正在存储的一组值。


1
投票
在具有良好哈希功能的哈希表实现中,并且负载因子(条目数除以总容量)为70%或更小,冲突数非常低,哈希查找为O(1)。] >

如果散列功能不佳,或者负载系数开始增加,则冲突次数将增加。如果散列功能较差,则某些散列码将发生很多冲突,而另一些则很少。您的平均查找率可能仍接近O(1),但是某些查找将花费更长的时间,因为冲突解决需要很长时间。例如,如果哈希码值11792映射了10个键,那么您可能必须检查10个不同的键才能返回匹配的键。

如果哈希表超载,每个哈希码映射有几乎相同数量的键,那么您的平均查找率将为O(k),其中k是每个哈希码的平均冲突次数。

© www.soinside.com 2019 - 2024. All rights reserved.