《算法 - 摩爾投票算法》


一:摩爾算法核心

  - 最基本的摩爾投票問題,找出一組數字序列中出現次數大於總數1/2的數字(並且假設這個數字一定存在),顯然這個數字只可能有一個。

  - 摩爾投票算法是基於這個事實:每次從序列里選擇兩個不相同的數字刪除掉(或稱為“抵消”),最后剩下一個數字或幾個相同的數字,就是出現次數大於總數一半的那個

 

二:代碼

  • 我們再根據只有兩個變量的實際代碼理一遍:
    
    major 初始化隨便一個數,
    
    count 初始化為0
    
    輸入:{1,2,1,3,1,1,2,1,5}
    
    掃描到1,count是0(沒有元素可以和當前的1抵消),於是major = 1,count = 1(此時有1個1無法被抵消)
    掃描到2,它不等於major,於是可以抵消掉一個major => count -= 1,此時count = 0,其實可以理解為掃到的元素都抵消完了,這里可以暫時不改變major的值
    掃描到1,它等於major,於是count += 1 => count = 1
    掃描到3,它不等於major,可以抵消一個major => count -= 1 => count = 0,此時又抵消完了(實際的直覺告訴我們,掃描完前四個數,1和2抵消了,1和3抵消了)
    掃描到1,它等於major,於是count += 1 => count = 1
    掃描到1,他等於major,無法抵消 => count += 1 => count = 2 (掃描完前六個數,剩兩個1無法抵消)
    掃描到2,它不等於major,可以抵消一個major => count -= 1 => count = 1,此時還剩1個1沒有被抵消
    掃描到1,它等於major,無法抵消 => count += 1 => count = 2
    掃描到5,它不等於major,可以抵消一個major => count -= 1 => count = 1
    至此掃描完成,還剩1個1沒有被抵消掉,它就是我們要找的數。

 

三:算法詳解

  - 作者:喝七喜

  - 鏈接:https://www.zhihu.com/question/49973163/answer/235921864

  - 來源:知乎

  - 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM