我需要执行以下操作:
(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);
}
}
}
我想知道是否标有// !!!是最佳的
答案 0 :(得分:0)
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
1}}保留对第一个元素的引用。通常,迭代LinkedHashSet
比HashSet
快得多,因为您只需要遵循一系列引用。但请注意,LinkedHashSet
将使用比HashSet
更多的内存,但如果您感兴趣的话,LinkedHashSet
是一个很好的答案。