我有一个由用户指定的整数流和一个int k。在程序结束时,我必须打印k个最高的数字。我只允许使用容量为k的优先级队列。
我的问题是,当队列达到最大容量时,下一个整数读取必须替换队列中的最小整数。
如何在插入后对队列进行排序,以使我知道在下一次迭代中要替换哪个int,且复杂度为O(logn)?我使用了一个游泳方法(在下面显示),但是,尽管它将新的int放置在正确的级别,但是它不能使队列完全排序。
这是游泳方法:
private void swim(int i){
while (i > 1) { //if i root (i==1) return
int p = i/2; //find parent
int result = cmp.compare(heap[i], heap[p]); //compare parent with child
if (result == 1) return; //if child <= parent return
swap(i, p); //else swap and i=p
i = p;
}
}
为了使自己更清楚,这里有一个k = 3的例子。
1: A = 42 / B = null / C = null
2: A = 69 / B= 42 / C = null (69 swims upwards)
3: A = 69 / B= 42 / C = 32
4: A = 69 / B= 42 / C = 32 (no change)
5: A = 104 / B= 42 / C = 69 (104 is inserted replacing 32, then swims upwards)
6: A = 104 / B= 42 / C = 93 (93 is inserted replacing 69, remains there)
首先,您无法保持PriorityQueue
排序顺序;如果与堆数据结构不完全相同,则它是相似的。
PriorityQueue
只是被授予者,根据其最小或最大堆,顶部元素是最小或最大。
而且,您还会对2个不同的问题感到困惑,即对元素进行排序和查找K个最大/最小元素。
如果要对N个元素的给定列表中的元素进行排序:使用基于比较的排序算法,运行时间不会比O(N * log(N))更好。
但是,如果您的情况只是从N个元素的列表中查找K个最小/最大元素:您可以在O(N * log(K))时间内实现。
请检查一次此问题:查找数组中的前n个最大元素
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句