數據結構和算法之TOP K算法

問: 從arr[1, n]這n個數中,找出最大的k個數

  1. 對數組進行全部排序,時間複雜O(n*lg(n))

  2. 只對最大k個數排序,比如冒泡算法,冒K個泡,就可以拿到最大的K個數

  3. 利用最小堆解決
    步驟一、找出數組前k個數,組成最小堆
    步驟二、遍歷剩餘n-k個元素,對比每個元素和堆頂大小
    步驟三、如果大,則替換堆頂的元素,然後調整;如果小則continue。保證堆裏面的元素總是最大的
    步驟四、遍歷堆

  4. 利用隨機算法,減治法的思想解決
    步驟一、取出第一個元素,遍歷一遍數組,將大於這個元素放到左邊,小於這個元素放到右邊,並且返回這個元素的下標i
    步驟二、對比下標i和k的大小,如果大,arr[i]左邊的元素都大於k,然後遞歸arr[1,i-1]裏第k大的元素;如果小於,那麼遞歸arr[i+1,n]第k-i大的元素即可
    步驟三、最終會得到第k大的元素,然後對整個arr做一次partition,拿到最大k個數。
    僞代碼:

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大
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章