仅仅是为了练习(而不是作业)我一直试图解决这个问题(CLRS,第3版,练习11.2-6):
假设我们已将n个密钥存储在大小为m的哈希表中,其中包含 通过链接解决碰撞,并且我们知道每个碰撞的长度 链,包括最长链的长度L.描述一个 从键中随机均匀地选择键的过程 在哈希表中并在预期时间O(L *(1 + m / n))中返回它。
到目前为止,我认为每个密钥返回的概率是1 / n。如果我们试图得到一个介于1到n之间的随机值x,并尝试按顺序查找按顺序排序的第x个密钥,然后沿着存储桶中的链,则需要O(m)才能找到正确的存储桶通过桶一个接一个地和O(L)时间来获得链中的正确密钥。
答案 0 :(得分:23)
重复以下步骤,直到返回一个元素:
k
为存储桶中元素的数量。p
随机选择1 ... L
。如果p <= k
,则返回存储桶中的p
元素。应该清楚的是,该过程随机均匀地返回一个元素。我们将排斥采样应用于放置在2D阵列中的元素。
每个广告投放元素的预期元素数量为n / m
。抽样尝试成功的概率为(n / m) / L
。因此,查找存储桶所需的预期尝试次数为L * m / n
。加上从存储桶中检索元素的O(L)
成本,预计运行时间为O(L * (1 + m / n))
。