问题:求一堆数据中最大的前k个
分析:如果是平常的做法的话 就将数据先排序 取其中一部分,但是这样做的话时间复杂度是很高的
解决:使用大根堆(前K小)、小根堆(前K大)来实现
分析:以大根堆来说,将要插入的元素与堆顶的元素比较如果比堆顶元素小的话,加删除堆顶元素在插入该元素,这样最终就会得到前K小,反之相反
用优先队列来做,封装好了堆方便使用
import java.util.*;
/**
* Date: 2019/9/9
* Time: 22:31
* Author: vincent-Dou
* Description:关于topK问题
*/
public class TopK{
int size;
PriorityQueue<Integer> priorityQueue;
public TopK(int k){
this.size = k;
priorityQueue = new PriorityQueue<Integer> (new Comparator<Integer> () {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
}
public void add(int num){
if (priorityQueue.size() < size) priorityQueue.offer(num);
if (num > priorityQueue.peek()){
priorityQueue.poll();
priorityQueue.add(num);
}
}
public List<Integer> getTopK(){
List<Integer> list = new ArrayList<>(priorityQueue);
Collections.sort(list);
return list;
}
public static void main(String[] args) {
Random random = new Random();
TopK topK = new TopK(3);
int[] arr = new int[50];
for (int i = 0; i < 50; i++){
int temp = random.nextInt(50);
arr[i] = temp;
topK.add(temp);
}
Arrays.sort(arr);
for (int i : arr){
System.out.printf(i+",");
}
System.out.println();
System.out.println(topK.getTopK());
}
}