摩爾投票演算法

2021-08-23 14:32:17 字數 842 閱讀 2543

在它最簡單的形式就是,查詢最多的元素,也就是在輸入中重複出現超過一半以上(n/2)的元素。如果序列中沒有最多的元素,演算法不能檢測到正確結果,將輸出其中的乙個元素之一。

當元素重複的次數比較小的時候,對於流演算法不能在小於線性空間的情況下查詢頻率最高的元素。

假設這個陣列中共有n個元素,我們可以把數值不同的元素看做不同的群體成員(乙個數字代表乙個群體)。那麼我們現在要根據每個群在這個名單中各自的人數,使得在名單中出現人數最多的那個管理群。我們就先從陣列的第乙個元素開始,假定它代表的群體的人數是最多的,那麼根據陣列中出現次數超過一半的數只有乙個的特質,如果我們設定乙個計數器,在遍歷時遇到不同於這個群體的人時就將計數器-1,遇到同個群體的人時就+1,只要在計數器歸0時就重新假定當前元素代表的群體為人數最多的群體再繼續遍歷(此時資料被分為兩段,前一段資料中被計數的元素數和numbers except it 數量是相等的,而後面的data中又滿足詞頻最高的數大於總數一半的情形,有點分治策略的思想),那麼到了最後,計數器記錄的那個群體必定是人最多的那個群體。這裡就使得元素排序是不會造成任何影響的,只關心元素的個數所帶來的對於計數器+1或-1的影響。

演算法實現:

法在區域性變數中定義乙個序列元素(m)和乙個計數器(i),初始化的情況下計數器為0. 演算法依次掃瞄序列中的元素,當處理元素x的時候,如果計數器為0,那麼將x賦值給m,然後將計數器(i)設定為1,如果計數器不為0,那麼將序列元素m和x比較,如果相等,那麼計數器加1,如果不等,那麼計數器減1。處理之後,最後儲存的序列元素(m),就是這個序列中最多的元素。

典型的案例

(1)找出大於n/2的元素

(2)找出大於n/3的元素把兩個數轉化為乙個數的思想,兩個大於n/3的肯定大於一半

演算法 摩爾投票

摩爾投票 問題 majority element 若有乙個陣列l,長度為n,找出是否有乙個數n,n的出現次數大於等於n 2。問題不算太難,一般可以通過遍歷計數,或者排序找中位數的辦法來解決。但是如果要求時間複雜度是o n 空間複雜度是o 1 那麼恐怕就沒那麼簡單了。摩爾投票演算法正好是這麼乙個o n...

摩爾投票演算法

思路一 使用map集合,記錄元素的出現次數 class solution return 0 思路二 用到的演算法是 摩爾投票演算法 演算法在區域性變數中定義乙個序列元素 value 和乙個計數器 count 初始化的情況下計數器為0.演算法依次掃瞄序列中的元素,當處理元素x的時候,如果計數器為0,那...

演算法 摩爾投票

摩爾投票 問題 majority element 若有乙個陣列l,長度為n,找出是否有乙個數n,n的出現次數大於等於n 2。問題不算太難,一般可以通過遍歷計數,或者排序找中位數的辦法來解決。但是如果要求時間複雜度是o n 空間複雜度是o 1 那麼恐怕就沒那麼簡單了。摩爾投票演算法正好是這麼乙個o n...