真的不是一个大问题。什么样的集合可以快速添加,获取和删除随机元素?
这些物品不必保留任何订单。
我正在开发一个蛇游戏,我正在跟踪游戏区域中未占用的细胞(一旦它被吃掉,就能快速为苹果选择一个新的位置)。
这里“fast”可以是O(log n)或O(1)。
答案 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)。 LinkedList
或HashSet
将有O(n)用于查找随机元素。
答案 1 :(得分:0)
最好的List
是LinkedList
删除并插入在O(1)中发生,但检索位置发生在O(n)中。
检索位置n中的元素是O(n)。
其他你可以使用TreeSet
。所有操作都在O(log n)中授予。
如果您可以使用密钥来检索元素,则可以使用Map
。 HashMap
在O(1)
答案 2 :(得分:-1)
HashMap,对于所有三个(大多数情况下),它的复杂度为O(1): http://en.wikipedia.org/wiki/Hash_table