Data structures 为什么小负载因子哈希表的大O复杂性是O(1)?

Data structures 为什么小负载因子哈希表的大O复杂性是O(1)?,data-structures,big-o,hashtable,Data Structures,Big O,Hashtable,我很难理解如何使用负载因子对哈希表的链式和开放式寻址进行big-O分析 据我了解: LoadFactor=(#哈希表中的条目)/(#哈希表中的“插槽”)=(n/m) 因此,LoadFactor反映了输入到哈希表中的数据正在使用哈希表的多少 对于链式哈希表,最坏情况下的时间复杂度为O(n),因为所有元素都散列到哈希表中的最后一个插槽的数据的非均匀分布将问题简化为在大小为n的链表中搜索 对于开放寻址哈希表,最坏情况下的时间复杂度为O(n),因为再次,所有元素散列到一个哈希代码的数据的非均匀分布将导致

我很难理解如何使用负载因子对哈希表的链式和开放式寻址进行big-O分析

据我了解:

LoadFactor=(#哈希表中的条目)/(#哈希表中的“插槽”)=(n/m)

因此,LoadFactor反映了输入到哈希表中的数据正在使用哈希表的多少

对于链式哈希表,最坏情况下的时间复杂度为O(n),因为所有元素都散列到哈希表中的最后一个插槽的数据的非均匀分布将问题简化为在大小为n的链表中搜索

对于开放寻址哈希表,最坏情况下的时间复杂度为O(n),因为再次,所有元素散列到一个哈希代码的数据的非均匀分布将导致连续输入所有元素。因此,问题简化为在大小为n的数组中进行搜索

对于最坏的情况,我假设n>m

现在对于一个小的负载因子,链式和开放寻址哈希表都将产生一个O(1)

我看不出n>m和n之间的区别
为什么会出现这种情况?

小加载因子哈希表的预期事例时间复杂度为O(1),因为访问哈希表中项目的时间不取决于哈希表中的项目数。

n
远小于
m
(存储桶数)时,然后很可能每个键都散列到一个唯一的bucket。随着
n
的增加,冲突(两个键散列到同一个存储桶)的可能性增加。当
n>m
时,可以保证至少有两个键将散列到相同的值

因此,当
n
远小于
m
时,冲突的可能性较小,因此预期的查找时间为O(1)。随着项目数量的增加,您将花费更多的时间解决冲突

经验证据表明,你不希望你的负荷系数超过0.75。可能接近0.70。当
n>0.70*m
时,哈希表变得非常低效。当然,实际数字会因数据而异,但这是一个很好的经验法则


显示了当
n
接近
m
时碰撞率如何增加。在表中插入项目数的平方根后,遇到单个冲突的可能性接近50%。如果要创建一个大小为365的哈希表并开始插入项,则仅插入25个项时,出现哈希冲突的几率高于50%。(这是假设一个好的散列函数。一个差的散列函数会增加整体冲突的可能性。)

您似乎混淆了最坏情况复杂性和预期情况复杂性。非自适应哈希表的最坏情况始终是O(n),而与加载因子无关,因为最坏情况是所有条目都具有相同的哈希值。