从链式哈希表中有效地选择一个随机元素?

时间:2011-12-25 11:46:49

标签: algorithm data-structures random hashtable sampling

仅仅是为了练习(而不是作业)我一直试图解决这个问题(CLRS,第3版,练习11.2-6):

  

假设我们已将n个密钥存储在大小为m的哈希表中,其中包含   通过链接解决碰撞,并且我们知道每个碰撞的长度   链,包括最长链的长度L.描述一个   从键中随机均匀地选择键的过程   在哈希表中并在预期时间O(L *(1 + m / n))中返回它。

到目前为止,我认为每个密钥返回的概率是1 / n。如果我们试图得到一个介于1到n之间的随机值x,并尝试按顺序查找按顺序排序的第x个密钥,然后沿着存储桶中的链,则需要O(m)才能找到正确的存储桶通过桶一个接一个地和O(L)时间来获得链中的正确密钥。

1 个答案:

答案 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))