最小(大)堆实现topK问题
topK问题:即求一组数据中最大(最小)的前K个数据,一般情况下数据量都比较大。
比如:班级前10名、世界500强、等级分排名等。
对于topK问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了 ( 可能数据都不能一下子全部加载到内存中)
推荐采用堆的方式去解决
import com.yybt.datastructure.heap.MyHeap;
/**
* 最小堆实现topk
* @author liuzehong
*
*/
public class TopK {
// 存储数据
private MyHeap<Integer> myHeap;
// 百亿数据找前k个元素。也就是tree的最大size。
private int k;
// 元素个数
private int size = 0;
public TopK(int k) {
this.myHeap = new MyHeap<Integer>(this.k=k);
}
// 插入元素
public void insert(int v) {
// 如果size小于k,直接往里添加元素
if (this.size < this.k) {
myHeap.insert(v);
size++;
return;
}else {
//如果堆中最大值大于v,则删除最大值,插入v
if (myHeap.get(0) >v) {
myHeap.delete(0);
myHeap.insert(v);
}
}
}
public void show() {
myHeap.show();
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
long a=System.currentTimeMillis();
TopK topK = new TopK(10);
for (int i = 1000000; i >= 1; i--) {
topK.insert(i);
}
topK.show();
long b=System.currentTimeMillis();
System.out.println("耗时:"+(b-a)+"毫秒");
}
}
说明
其中,MyHeap为最小堆实现,详情参考 https://github.com/yybtlzh/-.git