算法Top的几种解法

一、全局排序

  任何排序算法均可,但是时间复杂度或者空间复杂度不符合要求。明明只需要TopK,却将全局都排序了,这也是这个方法复杂度非常高的原因。那能不能不全局排序,而只局部排序呢?这就引出了第二个优化方法局部排序

二、局部排序

  (1)冒泡排序:每冒一个泡,找出最大值,冒k个泡,就得到TopK

     伪代码:

        for(i=1 to k){
          bubble_find_max(arr,i);
        }

  冒泡排序,将全局排序优化为了局部排序,非TopK的元素是不需要排序的,节省了计算资源,时间复杂度O(n*k)。不少朋友会想到,需求是TopK,是不是这最大的k个元素也不需要排序呢?这就引出了第三个优化方法堆排序

三、堆排序

  思路:只找到TopK,不排序TopK。

  步骤一:先用前k个元素生成一个小顶堆,这个小顶堆用于存储,当前最大的k个元素。

  步骤二:从第k+1个元素开始扫描,和堆顶(堆中最小的元素)比较,如果被扫描的元素大于堆顶,则替换堆顶的元素,并调整堆,以保证堆内的k个元素,总是当前最大的k个元素。

   步骤三:扫描完所有n-k个元素,最终堆中的k个元素,即得TopK。

  时间复杂度:O(n*lg(k))

  伪代码:

    heap[k] = make_heap(arr[1, k]);
      for(i=k+1 to n){
      adjust_heap(heep[k],arr[i]);
    }
    return heap[k];

=>=>  

猜你喜欢

转载自www.cnblogs.com/hdc520/p/12099203.html