【发布时间】:2012-09-05 07:15:56
【问题描述】:
我正在使用一个大的ArrayList<HashMap<A,B>>,我会反复需要从随机 HashMap 中选择一个随机键(并用它做一些事情)。选择随机 HashMap 很简单,但是我应该如何从这个 HashMap 中选择一个随机键呢?
速度很重要(因为我需要这样做 10000 次并且哈希图很大),所以只需在 [0,9999] 中选择一个随机数 k,然后在迭代器上执行 k 次 .next(),真的不是一个选项。 同样,在每次随机选择时将 HashMap 转换为数组或 ArrayList 确实不是一种选择。请在回复之前阅读此内容。
从技术上讲,我觉得这应该是可能的,因为 HashMap 在内部将其键存储在 Entry[] 中,并且从数组中随机选择很容易,但我不知道如何访问这个 Entry[]。因此,任何访问内部Entry[] 的想法都非常受欢迎。当然也欢迎其他解决方案(只要它们不消耗散列图大小的线性时间)。
注意:启发式方法很好,所以如果有一种方法可以排除 1% 的元素(例如,由于多个填充的桶),那根本没有问题。
【问题讨论】:
-
当您在同一个索引中有多个条目时,条目将被链接。所以这不会那么简单。
-
如果将 entrySet 转换为 List 的速度不够快(您进行了分析吗?),那么您需要另一个数据结构。
-
@dystroy Pseudorandom 很好,如果有 1% 的条目从未被选中,这没什么大不了的。这是否提供了额外的选择?所以,如果一个元素被链接了,不用担心,然后选择另一个元素。