本文是對一篇英文**的總結:finding repeated elements。想看原文,請google之。
這個問題的簡單形式是「查詢出現次數大於n/2的重複元素」。我們先從簡單問題開始,然後再做擴充套件。
1.查詢出現次數大於n/2的重複元素
《程式設計之美》中有同樣的一道題《尋找發帖水王》,具體思路是每次刪除兩個不同的元素,最後剩下的就是要求的元素。這個結論的證明如下:
已知:n,m是正整數,n表示陣列的長度,m是出現次數大於n/2的元素的個數,即m>n/2。
需要求證的結論包括兩個:
(1)我們用v表示出現次數大於n/2的元素。當刪除兩個不同元素,且其中有乙個元素是v時,則m減小1,同時n要減小2。
求證:m-1>(n-2)/2
證明:m-1>n/2-1=(n-2)/2
(2)當刪除兩個不同元素,且其中有乙個元素不是v時,則只需要n減小2。
求證:m>(n-2)/2 。這個結論是顯然的。
**如下:
int find(int array, intn)
else
} return
candidate;
}
上述**是錯誤的,最後還要驗證一下candiate是不是的出現次數是大於n/2的。反例,1,2,3,最後剩下的是3,但是他不是我們要的結果。
《程式設計之美》的後面習題是「查詢出現次數大於n/4的元素」,思路是每次刪除不同的4個元素,最後剩下的3個就是候選元素,但是還要驗證這3個元素是否滿足條件。不再詳細解釋。其實《程式設計之美》裡講的方法就是本文後提到的「多重集」演算法。
對於大於n/4的元素,最多有3個候選人,我們就設定3個candidate,每次同時刪掉4個元素,其實是3個candidate同時減1。對剩下的3個元素檢驗是否是我們想要的結果即可。
推廣到找到大於n/k的情況,設定(k-1)個候選。
8 7在陣列中找出出現次數大於N K的數
題目 給定乙個整形陣列arr,再給定乙個整數k,列印所有出現次數大於n k的數,如果沒有這樣的數,列印提示資訊。首先分析k 2這個特殊情況,有以下思路 排序後,取陣列中間的數。但該方法的時間複雜度為排序演算法的時間複雜度o nlogn 一次在陣列中刪掉兩個不同的數,不停地刪除,直到剩下的數只有一種,...
找出陣列中出現次數大於n 2 n 3,n k的數
1.找出陣列中次數大於n 2的元素 說明 演算法空間複雜度o n 時間複雜度o 1 陣列中次數超過n 2的數最多1個,設定乙個頻率數,前乙個數和後乙個數相同,頻率 1,否則 1,只要有數頻率超過陣列長度一半,最終這個頻率肯定大於0.public static intsolve2 int array ...
在陣列中找到出現次數大於N K的數
題目 給定整數陣列arr,列印其 現次數大於一半的數,如果沒有這樣的數,列印提示資訊。高階問題 給定整數陣列arr,列印其 現次數大於n k的數,如果沒有這樣的數,列印提示資訊。要求 原問題要求時間複雜度o n 空間複雜度o 1 高階問題要求時間複雜度o n k 額外空間o k 解答 核心思路 一次...