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

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

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...