出現次數的TopK問題

2021-10-10 12:29:33 字數 1484 閱讀 3538

給定string型別的陣列strarr,再給定整數k,請嚴格按照排名順序列印 出次數前k名的字串。

[要求]

如果strarr長度為n,時間複雜度請達到o(nlogk)

輸出k行,每行有乙個字串和乙個整數(字串表示)。

你需要按照出現出現次數由大到小輸出,若出現次數相同時字串字典序較小的優先輸出

示例1

["1","2","3","4"],2
[["1","1"],["2","1"]]
示例2

["1","1","2","3"],2
[["1","2"],["2","1"]]
【解析】 

首先遍歷strarr並統計字串的詞頻,例如,strarr=[「a」,」b」,」b」,」a」,」c」],遍歷後可以生成每種字串及其相關詞頻的雜湊表map:

雜湊表中有多少資訊,就建立多少個pair對,並且依次放入堆中,具體過程為:

(1)建立乙個大小為k的小根堆priority_queue<> heap。

(2)遍歷雜湊表的每條記錄,假設一條記錄為(s,t),s表示一種字串,s的詞頻為t,記為(str,times)。

a、如果小根堆沒有滿,就直接將(str,times)加入堆,然後進行建堆調整(heapinsert調整),堆中pair對例項之間都以詞頻(times)來進行比較,詞頻越小,位置越往上。

b、如果小根堆已滿,說明此時小根堆已經選出k個最高詞頻的字串,那麼整個小根堆的堆頂自然代表已經選出的k個最高詞頻的字串中,詞頻最低的那個。假設堆頂的元素記為(headstr,mintimes)。如果mintimes小於times,說明字串str有資格進入當前k個最高詞頻字串的範圍。而headstr應該被移出這個範圍,所以把當前的堆頂(headstr,mintimes)替換成(str,times)。

c、遍歷完strarr之後,小根堆裡就是所有字串中k個最高詞頻的字串,但要求嚴格按排名列印,所以還需要根據詞頻從大到小完成k個元素間的排序。

遍歷strarr建立雜湊表的過程是o(n),雜湊表中記錄的條數最多為n條,每一條記錄進堆時,堆的調整時間複雜度為o(logk),所以根據記錄更新小根堆的過程為o(nlogk)。k條記錄排序的時間複雜度為o(klogk),所以總的時間複雜度為o(n)+o(nlogk)+o(klogk),即o(nlogk)

具體**如下:

#includestruct compare

};class solution

while(it!=map.end())

it++;

}vector> ret;

while(!heap.empty()));

heap.pop();

}reverse(ret.begin(), ret.end());

return ret;

}};

出現次數的TopK問題

出現次數的topk問題 給定string型別的陣列strarr,再給定整數k,請嚴格按照排名順序列印 出次數前k名的字串。要求 如果strarr長度為n,時間複雜度請達到o n log k o n log k o nlogk 輸入描述 第一行兩個整數n,k。n表示陣列大小 接下來n行,每行乙個字串 ...

SDUT 出現次數

time limit 1000ms memory limit 65536k 有疑問?點這裡 對於給定乙個整數序列,你的任務是確定這個序列中出現次數最多的整數和它出現的次數。輸入包含多組測試資料,每組資料的第一行為乙個整數 n 0 n 1000 接下來一行為 n 個以空格分隔的整數 ai,ai 2 3...

TopK問題詳解

1.基本topk問題描述 從1百萬個數中找出最大 或最小 的5個數 看到這個問題,很多同學的第一反應會是 排序。那麼,選擇哪種排序方法呢,有同學說 快排,將所有數排序後,再選出最大的5個。雖然快排確實能解決這個問題,但是需要對1百萬個數排序,但我們僅僅需要其中的5個。那麼,有更好的方法嗎?還記得我們...