我需要一个支持 O(1):
中的以下操作的数据结构myList。 getRandomElement()(概率相同)
- (请注意,getRandomElement()并不意味着随机访问,它只是意味着:“随机提供其中一项,概率相同”)
请注意,我的商品是唯一的,因此我不关心是否使用列表或设置。 我检查了一些java数据结构,但似乎没有一个是解决方案:
有什么建议吗?请告诉我应该拨打哪些功能?
如果java没有这样的数据结构,我应该为此目的使用哪种算法?
答案 0 :(得分:6)
如果内存允许,您可以使用 HashMap 和 ArrayList 的组合: -
- 将数字存储在ArrayList arr中。
- 使用HashMap提供映射arr [i] =>我
- 生成随机选择随机形式arrayList
醇>
删除: -
- 在HashMap中检查num =>我
- swap(i,arr.size() - 1)
- HashMap.remove(num)
- HashMap中(ARR [I])=>我
- arr.remove(arr.size() - 1)
醇>
所有操作均为O(1)
,但额外O(N)
空间
答案 1 :(得分:5)
您可以将HashMap
(ID为数组索引)与数组(或ArrayList
)结合使用。
add
,就可以在O(1)中完成 HashMap
。
remove
可以在O(1)中通过从HashMap
执行查找(和删除)来查找索引,然后将数组中的最后一个索引移动到该索引,更新HashMap
中元素的索引,并将数组大小减一。
getRandomElement
可以通过从数组中返回一个随机元素在O(1)中完成。
示例:强>
Array: [5,3,2,4]
HashMap: [5->0, 3->1, 2->2, 4->3]
删除3:
Look up (and remove) key 3 in the HashMap (giving 3->1)
Swap 3 and, the last element, 4 in the array
Update 4's index in the HashMap to 1
Decrease the size of the array by 1
Array: [5,4,2]
HashMap: [5->0, 2->2, 4->1]
添加6:
Simply add it to the array and HashMap
Array: [5,4,2,6]
HashMap: [5->0, 2->2, 4->1, 6->3]