【问题标题】:Choose a random element from Java.util.Deque从 Java.util.Deque 中选择一个随机元素
【发布时间】:2014-06-19 15:24:46
【问题描述】:

通常我将 Deque 用于其预期目的,但很少需要从中选择一个随机元素。我使用下面的代码来执行此操作,但它需要遍历 Deque。有没有更有效的方法?

Iterator<T> iterator = mDeque.iterator();
int target = mRand.nextInt(mDeque.size());
while (iterator.hasNext()) {
    if (target == 0) {
        chosenElement = iterator.next();
        break;
    } else {
        iterator.next();
        target--;
     }
 }

【问题讨论】:

  • 您当前的方法是 O(n),我认为没有比这更有效的方法了。 “与 List 接口不同,此接口不支持对元素的索引访问。”
  • 我想您可以创建自己的 Deque 实现,将 ArrayList 包装为其后备存储,并添加一个委托给列表的 get 方法的 get 方法。

标签: java random performance deque


【解决方案1】:

您可以使用ArrayDeque,使用toArray,然后直接使用索引(以[target] 为例)

【讨论】:

  • 就时间效率而言,您必须检查一下。不确定toArray 需要多长时间执行,这可能取决于你的双端队列的大小。
  • 它确实制作了数组的防御性副本,所以它是 O(n)。
  • 虽然效率不高,但这个答案使代码更容易阅读。
  • 我认为你可能会这样做。很高兴它有帮助。
猜你喜欢
  • 2014-07-23
  • 2010-09-12
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
相关资源
最近更新 更多