應用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原生函數加以實現,其中沒有手動加入任何操作最小堆的代碼,另外,本文的一個遺憾是第二次建堆的時候其實不是完全的必要,因為我們只需要保持對的性質就可以,歡迎批評指正,希望對大家有所幫助。
