topK

  1. 使用快速排序中的partition函数,时间复杂度为o(n),需调整数组位置
    每进行一轮排序看返回的结点是否为第k个数,若为,则k左边都比k小,k右边都比k大,这时返回前k个数就好了
void getLeaseNumbers(int []input,int n,int k){
  int[] output=new int[k];
  if(input==null||k>n||n<=0||k<=0)return ;
  int start=0;
  int end=n-1; 
  int index =Partition(input,n,start,end);
  while(index!=k-1){
    if(index>k-1){
      end=index-1;
      index = Partition(input,n,start,end);
    }else{
      start=index+1;
      index = Partition(input,n,start,end);  
    }
  }
  for(int i=0;i<k;i++){
    output[i]=input[i];
  }
}

2)若初始数组不能允许排序,则可使用一个大根堆进行实现。时间复杂度为o(nlogk),适合海量数据
首先构建一个容量为k的堆,然后从n个数据中继续读取数据,大根堆中的堆顶为最大值,将该值和从n中取出的值相比较,若堆顶元素更大,则将其删除,插入从n中取出的数据,然后再调整堆。
3)使用PriorityQueue模拟大根堆
http://blog.csdn.net/jiutianhe/article/details/41441881

 public class FixSizedPriorityQueue <E extends Comparable<E>>{
    private PriorityQueue<E> queue;
    private int maxSize;// 堆的最大容量
    public FixSizedPriorityQueue(int maxSize) {
        if(maxSize <=0){
            throw new IllegalArgumentException();
        }
        this.maxSize = maxSize;
        this.queue =new PriorityQueue<E>(maxSize,new Comparator<E>() {
            // 生成最大堆使用o2-o1,生成最小堆使用o1-o2, 并修改 e.compareTo(peek) 比较规则
            public int compare(E o1, E o2) {                
                return(o2.compareTo(o1));
            }
        });
    }
    public void add(E e){
        if(queue.size() < maxSize) {// 未达到最大容量,直接添加
            queue.add(e);
        }else{// 队列已满
            E peek = queue.peek();
            if(e.compareTo(peek) <0) {// 将新元素与当前堆顶元素比较,保留较小的元素
                queue.poll();
                queue.add(e);
            }
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,603评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,098评论 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,034评论 0 2
  • 说说我和她的一切吧,我高三校运会期间,我遇上了她。那个时候她在技校,比我小两岁,也是我的初恋,直到现在也是。和大多...
    当已经接近黄昏阅读 2,833评论 0 2
  • 我很讨厌堵车,我从家到单位的距离大约有7公里,不堵车的时候我开车单位去也就十几分钟,堵车的话就不好说了。 为了不堵...
    甚小松阅读 3,328评论 7 3

友情链接更多精彩内容