我需要执行以下操作:
(1)检查O(1)中是否存在元素
(2)加上O(1)
(3)删除并返回O(1)
我在Java中考虑了Set
,但它仅支持(1)和(2)。我知道可以执行类似set.iterator().next()
和set.iterator().remove()
的操作,但是此解决方案的复杂性是什么?
编辑
我想要这样的东西:
Set<Integer> remaining = new HashSet<>();
// add values
Queue<Integer> queue = new ArrayDeque<>();
while(!remaining.isEmpty()) {
int val = remaining.iterator().next(); // !!!
remaining.iterator().remove(); // !!!
queue.add(val);
while(!queue.isEmpty()) {
List<Integer> valuesToBeRemoved = getValues();
// some logic
for(int value : valuesToBeRemoved) {
remaining.remove(value);
}
}
}
我想知道是否用//标记的行!是最佳的
最佳答案
HashSet
对add(E e)
和contains(E e)
具有O(1)性能。要从HashSet<Integer>
获取任何旧元素(并将其删除),您可以编写
Iterator<Integer> i = set.iterator();
int a = i.next();
i.remove();
当您执行
i.next()
时,您可能必须搜索空的哈希桶。如果使用
LinkedHashSet
而不是HashSet
,则add()
和contains()
的性能类似,但是i.next()
更快,因为LinkedHashSet
保留对第一个元素的引用。通常,在LinkedHashSet
上进行迭代比在HashSet
上进行迭代要快得多,因为您只需要遵循一系列引用即可。但是请注意,LinkedHashSet
将比HashSet
使用更多的内存,但是如果您对速度感兴趣,则LinkedHashSet
是一个很好的答案。关于java - Java特定的数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28917272/