問題描述如下:
有k個整數陣列,各包含k個元素。在每個陣列中取乙個元素加起來,可以得到k^k個和。求這些和中最小的k個值(重複計算的算多次)。
如果同時考慮這k個陣列的取值情況,其複雜程度不言而喻,並且沒有特別明確的遞迴約束關係,處理起來很棘手。
注意到在k^k個和中,我們只關心最小的k個和,題目暗示這是比尋找第k大的和簡單的多的問題。
我們沒有必要去列舉每一種取值情況,而只需要維護一些必要的資料。
考慮到每個陣列能且只能取乙個元素,因此我們可將求和的過程可以由之前的同時併發求和轉化為當前的維護+優化。
就是說我們先考慮前k-1個陣列,得到其最小的k個和,使其成為乙個新的陣列,考慮合併最後乙個陣列和該陣列,顯然有最終待求得k個
數必然被這k^2個數所包含。
假設我們將此問題記做l(k,k)問題,那麼我們只需要考慮l(2,k),即有l(k,k) = (k - 1) * l(2,k)
l(2,k)可用多路歸併問題解法在o(klogk)時間內解決
總的問題求解複雜度為k^2logk
題目有l(2,k)問題過渡到l(k,k)問題並無任何神奇之處,其中只用到了線性連續合併,問題複雜度的降低在於如何將併發列舉優化為維護更新。
關於最小的k個數的討論 top k問題)
給定乙個長度為 n的序列,不妨設為 l1,l2,l3,ln 這個序列可以是任意一種排列,可能的排列有 n!種,我們要找到最小的 k個數,即找到這樣的k個數 並滿足 li 1 li 2 li 3 li k 且對任意的j k 1 j n 有li k li j 例如 有這樣乙個長度為 8的序列 找出最小的...
演算法學習 6 尋找最小的k個,
1 輸入n個整數,輸出其中最小的k個。思路1 先快速排序,然後取前k個數。時間複雜度 o n log n o k o n log n 思路2 a 定義乙個長度為k的陣列result,將前k個整數放入result b 採用選擇或交換排序找到result陣列的最大值max c 依次遍歷後n k個整數,若...
查詢最小的k個元素的自寫演算法
題目 輸入n個整數,輸出其中最小的k個。例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4 解題 1,通過排序陣列,然後取前k個資料 時間複雜度為o n 2 2,通過迴圈k次,找出最小的k個資料,時間複雜度為 o n k 3,如果提前知道要輸出的k個資料,則建立k個變...