2. 當前解決方案 c++
針對top k類問題,一般比較好的方案是【分治+trie樹/hash+小頂堆】,即先將數據集按照hash方法分解成多個小數據集,而後使用trie樹或者hash統計每一個小數據集中的query詞頻,以後用小頂堆統計出每一個數據集中出頻率最高的前K個數,最後在全部top K中求出最終的top K。附上小根堆實現的c/c++代碼: 算法
/* *交換函數 */ template<typename T> inline void Swap( T &a, T &b) { T c; c = a; a = b; b = c; } /* */ template<typename T> void HeapAdjustSmall(T *array, int i, int nLength) { int nChild; T tTemp; for (tTemp = array[i]; 2 * i + 1 < nLength; i = nChild) { nChild = 2 * i + 1; if (nChild < nLength - 1 && array[nChild + 1] < array[nChild]) ++nChild; if (tTemp > array[nChild]) { array[i]= array[nChild]; } else { break; } array[nChild]= tTemp; } } /* *@ µ÷ÕûÐòÁеÄÇ°°ë²¿·ÖÔªËØ,µ÷ÕûÍêÖ®ºóµÚÒ»¸öÔªËØÊÇÐòÁеÄ×îСµÄÔªËØ */ template<typename T> void HeapCreate(T *array, int length) { for (int i = length / 2 - 1; i >= 0; --i) { HeapAdjustSmall(array, i, length); } } /* */ template<typename T> void HeapSort(T *array, int length) { for (int i = length - 1; i > 0; --i) { Swap(array[0], array[i]); HeapAdjustSmall(array, 0, i); } } template<typename T> void HeapUpdate(T *array, int nLength, T *value) { if ( *value > array[0] ) { array[0] = *value; HeapAdjustSmall(array, 0, nLength); }else return; } template <typename T> inline bool GetTopK(T *pData, const se_uint32_t num, se_uint32_t k){ num_t size = 0; HeapCreate(pData, k); for ( int i = k; i < num; ++i ) { HeapUpdate( pData, k, (pData + i) ); } HeapSort(pData, k); return true; } #endif