Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 固定大小堆上操作的复杂性_Java_Heap_Time Complexity_Big O - Fatal编程技术网

Java 固定大小堆上操作的复杂性

Java 固定大小堆上操作的复杂性,java,heap,time-complexity,big-o,Java,Heap,Time Complexity,Big O,我正在为即将到来的考试学习,我遇到了一个问题,我必须从一个无限的数字流中建立并维护前10名的最高整数。我想我可以使用一个固定大小为10的最小堆,当我收到一个新的数字时,我可以检查最小值是否低于新的传入数字,如果是这样,我必须通过依次提取根来更新堆,直到我得到一个更高的值,然后插入新的数字,以及之前弹出的根(减去第一个,以保持10的固定大小)。现在我有了这个堆,我可以通过弹出并打印堆中的每个节点轻松获得前10个 我用Java编写了一个方法,通过PriorityQueue可以完成我所说的 publi

我正在为即将到来的考试学习,我遇到了一个问题,我必须从一个无限的数字流中建立并维护前10名的最高整数。我想我可以使用一个固定大小为10的最小堆,当我收到一个新的数字时,我可以检查最小值是否低于新的传入数字,如果是这样,我必须通过依次提取根来更新堆,直到我得到一个更高的值,然后插入新的数字,以及之前弹出的根(减去第一个,以保持10的固定大小)。现在我有了这个堆,我可以通过弹出并打印堆中的每个节点轻松获得前10个

我用Java编写了一个方法,通过PriorityQueue可以完成我所说的

public void addNumber(int number){
    if(pq.size() < 10){
        pq.offer(number);
    }
    else if(pq.peek() < number){
        List<Integer> topNumbers = new LinkedList<Integer>();
        while(!pq.isEmpty() && pq.peek() < number){
            topNumbers.add(pq.poll());
        }
        pq.offer(number);
        for(int i = 1; i < topNumbers.size(); i++){
            pq.offer(topNumbers.get(i));
        }
    }
}

public void printTop10(){
    List<Integer> topNumbers = new LinkedList<Integer>();
    while(!pq.isEmpty()){
        topNumbers.add(pq.poll());
    }

    for(int i = 0; i < topNumbers.size(); i++){
        Node thisOne = topNumbers.get(topNumbers.size() - 1 - i);
        System.out.println(thisOne);
        pq.offer(thisOne);
    }
}
public void addNumber(整数){
如果(pq.size()<10){
pq.报价(编号);
}
否则如果(pq.peek()<编号){
List topNumbers=newlinkedlist();
而(!pq.isEmpty()&&pq.peek()

根据我的测试,这段代码完成了任务并按预期工作。现在,我的问题来了。这两个操作的复杂度是多少?我们有一个PriorityQueue,所以insert和extract min操作是对数的。但是在这种情况下,堆的大小“n”最多是10。这是否意味着这两个操作的复杂度是O(日志10)是的,常数的对数也是常数

通常,通过将这些算法的运行时间描述为几个变量的函数来分析它们。例如,我们可以说,您的算法从
n
中提取O(n log k)时间和O(k)空间中的顶部
k


但是,如果已知
k
的值,我们不妨利用这一事实来简化分析。

谢谢你的回答。是的,我认为复杂性取决于我们希望在前k中显示的元素数量,但由于在这种情况下我有一个固定大小的列表,我只能说它在恒定的时间内运行。