查詢出現次數大於n k的重複元素

2021-09-08 17:34:02 字數 955 閱讀 4082

本文是對一篇英文**的總結: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, int

n)

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 解答 核心思路 一次...