加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 16:47:43 所属栏目:Java 来源:网络整理
导读:只是为了练习(而不是作业作业),我一直在试图解决这个问题(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
只是为了练习(而不是作业作业),我一直在试图解决这个问题(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)).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读