Math 链式哈希表查找的预期最坏情况时间复杂度?
当使用良好的散列函数(其中任意两个元素碰撞的概率为1/m,其中m为桶数)实现散列表时,众所周知,查找元素的平均案例运行时间为Θ(1+α),其中α为负载因子。但是,如果所有元素最终都放在同一个桶中,最坏情况下的运行时间是O(n) 我最近阅读了一些散列表,发现其中(第3页)声称如果α=1,最坏情况下的预期复杂度为Θ(logn/logn)。所谓“预期的最坏情况复杂性”,我的意思是,在预期的情况下,如果元素由统一的哈希函数分布,那么您需要做的最大工作量。这与实际的最坏情况不同,因为最坏情况行为(同一存储桶中的所有元素)实际上不太可能发生Math 链式哈希表查找的预期最坏情况时间复杂度?,math,data-structures,hash,big-o,probability,Math,Data Structures,Hash,Big O,Probability,当使用良好的散列函数(其中任意两个元素碰撞的概率为1/m,其中m为桶数)实现散列表时,众所周知,查找元素的平均案例运行时间为Θ(1+α),其中α为负载因子。但是,如果所有元素最终都放在同一个桶中,最坏情况下的运行时间是O(n) 我最近阅读了一些散列表,发现其中(第3页)声称如果α=1,最坏情况下的预期复杂度为Θ(logn/logn)。所谓“预期的最坏情况复杂性”,我的意思是,在预期的情况下,如果元素由统一的哈希函数分布,那么您需要做的最大工作量。这与实际的最坏情况不同,因为最坏情况行为(同一存储
我的问题如下——作者似乎认为,不同的α值可以改变查找的预期最坏情况复杂性。有人知道某个公式、表格或文章讨论了改变α如何改变预期的最坏情况运行时间吗?对于fixed
α
,预期的最坏时间总是Θ(logn/logn)
。但是,如果将α
设为n
的函数,则预期的最坏时间可能会改变。例如,如果α=O(n)
,那么预期的最坏时间是O(n)
(在这种情况下,您有固定数量的哈希桶)
一般来说,项目在存储桶中的分布近似为泊松分布,随机存储桶拥有i
项目的概率为αi e-α/i代码>。最坏的情况是m
中接近独立观测值的第十个最坏情况。(并非完全独立,但与之相当接近。)在m
观察结果中,m
最差的往往是发生概率约为1/m
次的东西。(更准确地说,分布由Β分布给出,但对于我们的分析,1/m
就足够了。)
当你进入泊松分布的尾部时,i代码>项支配所有其他项,因此在给定的i
之上的所有项的累积概率小于选择i
本身的概率。因此,为了获得一个良好的近似值,您可以通过求解以下方程来计算期望值:
αi e-α / i! = 1/m = 1/(n/α) = α/n
如果i
的形式为k log(n)/log(log(n))
与k=Θ(1)
,那么这是否可行?让我们试试看:
log(n) = (k log(n) / log(log(n))) (log(k) + log(log(n)) - log(log(log(n)))) + O(log(log(n)))
= k (log(n) + o(log(n)) + o(log(n))
log(n)=(k log(n)/log(n))(log(k)+log(n))-log(n))+O(n)))
=k(对数(n)+o(对数(n))+o(对数(n))
然后我们得到更精确的估计,对于任何固定负载平均值α
,预期的最坏时间是(1+o(1))log(n)/log(log(n))
经过一些搜索,我发现了一个完整的分析,它给出了一大堆不同类型哈希表(包括链式哈希表)的预期最坏情况行为。作者给出了一个答案,即预期长度约为Γ-1(m),其中m是桶的数量,Γ是。假设α是常数,这大约是lnm/lnm
希望这能有所帮助!一般分析是即兴进行的(至少对我来说是如此)。我不确定是否有任何具体的参考来解决这个问题,因此可能存在局部简化。在任何情况下,请注意L
最大列表长度是max_xl(x)
其中L(x)
是放入的插槽的列表长度x
与此处的符号相同。l(x)
是伯努利试验的总和,即l(x)~Bin(1/m,n)
具有二项分布。所有这些随机变量(其中有n
)的最大值就是n阶统计量。互联网上有很多离散阶统计量分布的公式,你可以把它们放在一起(相当难看)公式,或各种数值的计算表。我不清楚预期情况(=平均情况)之间的差异还有最坏的情况。你能解释一下吗?@KonradRudolph-当然!这样想。假设你使用一个好的散列函数将n个元素分配到m个容器中。查找的预期运行时间是你期望在任何一个容器中看到的对象的平均数(这是n/m)。预期的最坏情况运行时间是包含最大对象数的存储桶中的平均元素数。获取此值的一种方法是运行大量试验,将n个元素分配到m个存储桶中,并在每次试验后计算最满存储桶中的元素数
log(n) = i log(i) + O(i)
log(n) = (k log(n) / log(log(n))) (log(k) + log(log(n)) - log(log(log(n)))) + O(log(log(n)))
= k (log(n) + o(log(n)) + o(log(n))