求解topk问题

  • 全局排序,比如快速排序,找出前k大的数;复杂度:nlogn

  • 局部排序

    • 只排序TopK个数,就是说通过k次遍历找到最大的,第二大的…第k大的,找到一个就放到数组最前面;复杂度:n*k;
    • 堆排序:构造小顶堆,遍历n-k次,遍历的同时调整小顶堆;;复杂度:nlogk
  • 随机选择+partation:先通过随机选择找第k大的数,然后再通过一次partation就把比k大的都放到了左边;复杂度:n

    随机选择伪代码:

    int RS(arr, low, high, k){
    
      if(low== high) return arr[low];
    
      i= partition(arr, low, high);
    
      temp= i-low; //数组前半部分元素个数
    
      if(temp>=k)
    
          return RS(arr, low, i-1, k); //求前半部分第k大
    
      else
    
          return RS(arr, i+1, high, k-i); //求后半部分第k-i大
    
    }
    

参考:

https://www.6aiq.com/article/1538030833699

你可能感兴趣的:(算法,排序算法,数据结构)