我需要一个数据结构,支持以下操作的时间复杂度为 O(1):
- myList.add(Item)
- myList.remove(Item.ID) ==> 实际上需要随机访问
myList.getRandomElement()(等概率地)
--(请注意,getRandomElement() 不意味着随机访问,它只是表示:“随机给我一个元素,概率相等”)
请注意,我的元素是唯一的,因此我不关心使用 List 还是 Set。
我检查了一些 Java 数据结构,但似乎没有一个是解决方案:
- HashSet 支持 1、2 的时间复杂度为 O(1),但它无法在 O(1) 的时间内给我一个随机元素。我需要调用 mySet.iterator().next() 来选择一个随机元素,这需要 O(n) 的时间复杂度。
- ArrayList 支持 1、3 的时间复杂度为 O(1),但它需要进行线性搜索才能找到要删除的元素,尽管它的时间复杂度为 O(n)
有什么建议吗?请告诉我应该调用哪些函数?
如果 Java 没有这样的数据结构,我应该使用哪种算法来实现此目的?