一:摩爾算法核心
- 最基本的摩爾投票問題,找出一組數字序列中出現次數大於總數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
- 來源:知乎
- 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
