應用C++ STL以最小堆方法解決Top K 問題


應用C++ STL以最小堆方法解決Top K 問題

問題的來源我想不必多言了,很多的面試題中,以及<編程之美>中都有對問題的描述,以及相關的解法,寫本文的目的是以C++ STL的方式用最小堆解法解決這個問題。

那么什么是最小堆呢?

其實最小堆是一顆特殊二叉樹,其父節點的key小於其孩子節點,對!最小堆不是堆,是二叉樹!

最小堆解法其實可以將問題的時間復雜度縮減到nlgK, 但是本文由於沒有在C++ STL 中找到合適的函數保持最小堆(如果用自己寫代碼可以做到lgk),所以必須每次重建最小堆(如果您有更好的建議,歡迎指點),因此,時間復雜度為nk, 另外本文假設k<<n.

#include <iostream>

#include <algorithm>

#include <vector>

#include <functional>

 

using namespace std;

 

void TopKAlgorithm(int inputArray[], int nInputLength, int nOutputLength )

{

 

       //construct the minimum heap the size is K

       vector<int> vec(inputArray,inputArray+nOutputLength);

       make_heap (vec.begin(),vec.end(), greater<int>());

 

       for(int i=nOutputLength; i<10; i++)

       {

              if(inputArray[i] >= vec[0])

              {

                     vec[0] = inputArray[i];

//此處其實只需要保持堆的性質即可,並不需要重建堆

                     make_heap (vec.begin(),vec.end(), greater<int>());

              }

       }

 

       for(int i=0; i<nOutputLength; i++)

       {

              inputArray[i]=vec[i];

       }

 

 

}

 

int main ()

{

 

 int InputValues[] = {10,200,30,5,15,110,2,42,6,36};

 

 

 TopKAlgorithm(InputValues, 10, 3);

 

 cout << "The top K Values are:";

 for (unsigned i=0; i<3; i++)

 {

        cout << " " << InputValues[i];

 }

 cout << endl;

 

 return 0;

}

總結

本文以最小堆解法解決了TOP K 問題,完全采用C++STL原生函數加以實現,其中沒有手動加入任何操作最小堆的代碼,另外,本文的一個遺憾是第二次建堆的時候其實不是完全的必要,因為我們只需要保持對的性質就可以,歡迎批評指正,希望對大家有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM