用于快速添加,获取和删除随机元素的集合

时间:2015-03-07 19:32:38

标签: java collections

真的不是一个大问题。什么样的集合可以快速添加,获取和删除随机元素?

这些物品不必保留任何订单。

我正在开发一个蛇游戏,我正在跟踪游戏区域中未占用的细胞(一旦它被吃掉,就能快速为苹果选择一个新的位置)。

这里“fast”可以是O(log n)或O(1)。

3 个答案:

答案 0 :(得分:4)

我推荐一个平衡的二叉树。插入/删除将是O(log(n))并且选择随机元素将是从树枝中随机向下走到叶子的问题,O(log(n))。

与添加/删除被占用的细胞相比,如果查找苹果未占用的位置是相对不常见的操作,我会选择LinkedHashSet

  • 让单元格空闲:unoccupied.add(pos),O(1)(摊销)
  • 使一个单元格占用:unoccupied.remove(pos),O(1)
  • 查找随机未占用的单元格:

    if (unoccupied.isEmpty()) throw something;
    int i = random.nextInt(unoccupied.size());
    Iterator<Pos> iter = unoccupied.iterator();
    while (i-- > 0)
        iter.next();
    return iter.next();
    

(使用LinkedHashMap代替HashMap可确保上次操作时出现O(n)。)

ArrayList将删除O(n)。 LinkedListHashSet将有O(n)用于查找随机元素。

答案 1 :(得分:0)

最好的ListLinkedList 删除并插入在O(1)中发生,但检索位置发生在O(n)中。 检索位置n中的元素是O(n)。

其他你可以使用TreeSet。所有操作都在O(log n)中授予。

如果您可以使用密钥来检索元素,则可以使用MapHashMap在O(1)

中插入了检索删除

答案 2 :(得分:-1)

HashMap,对于所有三个(大多数情况下),它的复杂度为O(1): http://en.wikipedia.org/wiki/Hash_table