(Java)用于快速插入、删除和随机选择的数据结构
我需要一个数据结构来支持O(1)中的以下操作:(Java)用于快速插入、删除和随机选择的数据结构,java,performance,algorithm,data-structures,hashset,Java,Performance,Algorithm,Data Structures,Hashset,我需要一个数据结构来支持O(1)中的以下操作: 我的列表。添加(项目) myList.删除(Item.ID)==>它实际上需要随机访问 myList.getRandomElement()(概率相等) --(请注意getRandomElement()并不意味着随机访问,它只是意味着:“以相同的概率随机给我一个项目”) 请注意,我的项目是唯一的,所以我不在乎是否使用了列表或集合。 我检查了一些java数据结构,但它们似乎都不是解决方案: HashSet支持O(1)中的1,2,但它不能在O(1)中给我
如果java没有这样的数据结构,我应该使用哪种算法来实现这一目的?您可以将
HashMap
(从ID到数组索引)与数组(或ArrayList
)结合使用
add
可以在O(1)中完成,只需添加到数组中,并将ID和索引添加到HashMap
remove
可以在O(1)中完成,方法是从HashMap
中进行查找(和删除)以查找索引,然后将数组中的最后一个索引移动到该索引,更新HashMap
中该元素的索引,并将数组大小减小一
getRandomElement
可以通过从数组返回随机元素在O(1)中完成
示例:
数组:[5,3,2,4]
HashMap:[5->0,3->1,2->2,4->3]
删除3项:
在HashMap中查找(并删除)键3(给出3->1)
交换数组中的最后一个元素3和4
将HashMap中4的索引更新为1
将数组的大小减少1
数组:[5,4,2]
HashMap:[5->0,2->2,4->1]
添加6:
只需将其添加到数组和HashMap中即可
数组:[5,4,2,6]
HashMap:[5->0,2->2,4->1,6->3]
如果内存允许,您可以组合使用HashMap和ArrayList,如下所示:-
所有的操作都是
O(1)
但是额外的O(N)
space在同一时间回答相同:)我最喜欢这个,因为它有示例和更详细的文本。