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

Java 用于快速添加、获取和删除随机元素的集合,java,collections,Java,Collections,真的不是什么大问题。什么样的集合有利于快速添加、获取和删除随机元素 这些物品不必保留任何形式的订单 我正在开发一款蛇类游戏,我正在跟踪游戏区域中未被占用的单元,以便在苹果被吃掉后能够快速为它选择一个新的位置 这里fast可以是Olog n或O1。我建议使用平衡二叉树。插入/删除将是Ologn,选择一个随机元素将是一个沿着分支随机走到叶子Ologn的问题 如果与添加/删除占用的单元格相比,查找苹果的未占用位置是一项相对少见的操作,那么我会选择LinkedHashSet: 使单元格未占用:未占用。a

真的不是什么大问题。什么样的集合有利于快速添加、获取和删除随机元素

这些物品不必保留任何形式的订单

我正在开发一款蛇类游戏,我正在跟踪游戏区域中未被占用的单元,以便在苹果被吃掉后能够快速为它选择一个新的位置


这里fast可以是Olog n或O1。

我建议使用平衡二叉树。插入/删除将是Ologn,选择一个随机元素将是一个沿着分支随机走到叶子Ologn的问题

如果与添加/删除占用的单元格相比,查找苹果的未占用位置是一项相对少见的操作,那么我会选择LinkedHashSet:

使单元格未占用:未占用。addpos,O1摊销 使单元格被占用:未被占用。删除位置,O1 查找随机未占用的单元格:

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可以确保在最后一个操作中启用

ArrayList将启用以进行删除。LinkedList或HashSet将启用以查找随机元素。

最佳列表是LinkedList 移除和插入发生在O1中,而检索位置发生在On中。 检索位置n上的元素

另外,你可以使用TreeSet。所有操作都在Olog n中授予


如果可以使用键检索元素,则可以使用映射。HashMap在O1

HashMap中具有插入-检索-删除功能,在大多数情况下,这三种功能的复杂性都是O1:

您想要列表还是集合?@pbabcdefp对于这两种随机删除都是线性的,您是指HashSet吗?如果是这样,您将如何随机选择O1中的元素?你不知道存储桶的分布。如果一个HashMap或一个HashSet的大小为n,你如何删除O1中n个条目中的任意一个?我无法通过随机索引可靠地从映射中删除,至少在固定时间内是如此。也许我可以在Olog n中使用TreeMaphowe来实现它,不管所有的单元格是否都是叶子。我想这取决于你如何构造你的树。@OlaviMustanoja这里有一个实现来回答你的问题@OlaviMustanoja,但是我强烈怀疑,对于蛇游戏,你应该使用哈希集。您不需要像平衡树这样复杂的东西,除非您的数据很大,并且您会注意到Olog n和On之间的差异。@pbabcdefp数据大小非常大