Java 按键查找PriorityQueue中的元素

Java 按键查找PriorityQueue中的元素,java,data-structures,priority-queue,Java,Data Structures,Priority Queue,假设给了我一些钥匙。我想找到的是优先级队列中的一个元素,它的键等于或大于给定的键 显然,我希望它在O(logn)中完成。我几乎可以肯定Java提供了这样的方法,但却找不到(在官方文档中查看)没有这样的方法 优先级队列的底层实现是min heap(它也可以配置为充当min heap)。因此,对于具有max heap属性的优先级队列,当您检查peek元素(即O(1)操作)时,它将返回最大元素。轮询后,将执行heapify ing,下一个顶部元素将是第二个最大值。这就增加了O(logn)的复杂性。所以

假设给了我一些钥匙。我想找到的是优先级队列中的一个元素,它的键等于或大于给定的键


显然,我希望它在
O(logn)
中完成。我几乎可以肯定Java提供了这样的方法,但却找不到(在官方文档中查看)

没有这样的方法

优先级队列的底层实现是min heap(它也可以配置为充当min heap)。因此,对于具有max heap属性的优先级队列,当您检查peek元素(即
O(1)
操作)时,它将返回最大元素。轮询后,将执行heapify ing,下一个顶部元素将是第二个最大值。这就增加了
O(logn)
的复杂性。所以,若要使所有密钥大于或等于给定密钥,则需要保持从最大堆优先级队列进行轮询,直到顶层元素小于给定密钥。在最坏的情况下,这可能是
O(nlogn)

同样在这些操作之后,队列结构也将改变,因为一些密钥已经被轮询。因此,在下一个操作之前,您必须通过重新按下轮询键来恢复队列的状态,该键也将是
O(nlogn)

PriorityQueue<Integer> queue = new PriorityQueue<>(10, Collections.reverseOrder())

List<Integer> keysGreaterOrEqualTo(Integer key) {
    List<Integer> keys = new ArrayList<>();
    while(!queue.isEmpty() && queue.peek() >= key) {
        keys.add(queue.poll());
    }
    return keys;
}
PriorityQueue queue=new PriorityQueue(10,Collections.reverseOrder())
列表键GREATEROREQUALTO(整数键){
列表键=新的ArrayList();
而(!queue.isEmpty()&&queue.peek()>=key){
key.add(queue.poll());
}
返回键;
}

Java优先级队列具有
contains()
方法,如果在优先级队列中找到密钥,该方法将返回true。 引用-

要查找大于或等于的键,可以实现自己的自定义方法。例如:

int searchkey = 5, foundKey = 0;

While(!pq.isEmpty()){
  foundKey = pq.poll();   
  if(foundKey == searchKey || foundKey > searchKey)
    break;
}
System.out.println(foundKey == searchKey || foundKey > searchKey ? foundKey : -1);

有一种非破坏性的方法可以做到这一点。您可以使用来搜索,而不是在找到符合条件的内容之前从队列中删除内容

请理解迭代器不会以任何特定顺序返回项,因此如果您想要大于或等于某个值的最小项,您仍然必须遍历整个集合

这个问题的复杂性显然是O(n)。公认答案中描述的破坏性技术的复杂性为O(k logn),其中
k
是小于您正在搜索的项目的数量。在最坏的情况下,
k=n
,算法是O(n logn)