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