我需要执行以下操作:

(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);
         }

    }


}


我想知道是否用//标记的行!是最佳的

最佳答案

HashSetadd(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/

10-13 05:58