什么是摩爾投票算法誊垢?
摩爾投票算法是一種使用線性時(shí)間和常數(shù)空間查找大部分元素序列的算法症见。它以1981年出版的Robert S. Boyer和J Strother Moore的名字命名,并且是流式算法的典型例子。
最簡(jiǎn)單的形式就是壁晒,查找輸入中重復(fù)出現(xiàn)超過一半以上(n/2)的元素。如果序列中沒有這種元素谬晕,算法不能檢測(cè)到正確結(jié)果,將輸出其中的一個(gè)元素之一攒钳。如果不能保證輸入數(shù)據(jù)中有占有一半以上的元素雷滋,需要再遍歷一下驗(yàn)證文兢。
算法流程:
該算法在其局部變量中維護(hù)一個(gè)序列元素和一個(gè)計(jì)數(shù)器焕檬,計(jì)數(shù)器最初為零。然后实愚,它一次一個(gè)地處理序列的元素。處理元素x時(shí)击喂,如果計(jì)數(shù)器為零碰辅,則算法將x存儲(chǔ)為其維護(hù)的序列元素,并將計(jì)數(shù)器設(shè)置為1乎赴。否則,它將x與存儲(chǔ)的元素進(jìn)行比較榕吼,并使計(jì)數(shù)器遞增(如果相等)或遞減計(jì)數(shù)器(不相等)。
這里有兩個(gè)先覺條件要明確:
出現(xiàn)超過一半以上(n/2)的元素有且只有一個(gè)原探;
這個(gè)元素一定存在
這里先貼代碼(swift):
代碼摘要:
我們維護(hù)一個(gè)局部變量作為當(dāng)前查找元素顽素,一個(gè)局部變量作為計(jì)數(shù)器,
當(dāng)遍歷開始的時(shí)候型型,此時(shí)計(jì)數(shù)(count)為0全蝶,則將數(shù)組第一個(gè)元素作為當(dāng)前查找元素;
當(dāng)遍歷的元素與查找元素相等抑淫,計(jì)數(shù)加1;反之則-1始苇;
若當(dāng)計(jì)數(shù)為0時(shí),將下一個(gè)元素作為當(dāng)前查找元素函喉,繼續(xù)重復(fù)以上操作;當(dāng)遍歷結(jié)束時(shí)函似,當(dāng)前查找元素則為目標(biāo)元素。