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