微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

只是为了练习(而不是作业作业),我一直在试图解决这个问题(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)).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐