算法 – 有效地从链接哈希表中挑选一个随机元素?

前端之家收集整理的这篇文章主要介绍了算法 – 有效地从链接哈希表中挑选一个随机元素?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
只是为了练习(而不是作业作业),我一直在试图解决这个问题(CLRS,第3版,练习11.2-6):

Suppose we have stored n keys in a hash table of size m,with
collisions resolved by chaining,and that we know the length of each
chain,including the length L of the longest chain. Describe a
procedure that selects a key uniformly at random from among the keys
in the hash table and returns it in expected time O(L * (1 + m/n)).

到目前为止,我认为每个键的返回概率是1 / n.如果我们尝试得到1到n之间的随机值x,并尝试按顺序首先按桶排序,然后沿着桶中的链排列找到第x个密钥,那么将通过进行O(m)找到合适的桶通过桶逐个和O(L)时间获得链中的正确键.

解决方法

重复以下步骤,直到返回一个元素:

>随机选择一个桶.令k是桶中元素的数量.
>从1 … L随机选择p均匀.如果p <= k则返回桶中的第p个元素.
应该清楚的是,该过程会随机均匀地返回一个元素.我们对排列在2D阵列中的元素应用拒绝采样.

每桶的预期数量为n / m.采样尝试成功的概率为(n / m)/ L.因此,找到一个存储桶所需的尝试次数为L * m / n.与从桶中检索元素的O(L)成本一起,预期运行时间为O(L *(1 m / n)).

原文链接:/java/124301.html

猜你在找的Java相关文章