热门问题
时间线
聊天
视角
多數投票算法
来自维基百科,自由的百科全书
Remove ads
博耶-摩爾多數投票算法(英語:Boyer–Moore majority vote algorithm),中文常作多數投票算法、摩爾投票算法等,是一種用來尋找一組元素中占多數元素的常數空間複雜度、線性時間複雜度算法。這一算法由羅伯特·S·博耶和J·斯特羅瑟·摩爾在1981年發表[1],也是處理數據流的一種典型算法。

這一算法應用的問題原型是在集合中尋找可能存在的多數元素,這一元素在輸入的序列重複出現並占到了序列元素的一半以上;在第一遍遍歷之後應該再進行一個遍歷以統計第一次算法遍歷的結果出現次數,確定其是否為眾數;如果一個序列中沒有占到多數的元素,那麼第一次的結果就可能是無效的隨機元素。對於數據流而言,則不太可能在亞線性空間複雜度的情況下中就尋找到出現頻率最高的元素;而對於序列,其元素的重複次數也有可能很低。[2]
Remove ads
算法
該算法在其局部變量中存儲一個數組元素和一個計數器,計數器初始化為 0。然後對數組進行遍歷操作,在遍歷到元素 x 的時候:如果計數器為 0,則算法將 x 存儲到數組元素變量,並將計數器設置為 1。 否則,它將 x 與存儲的元素進行比較,然後遞增計數器(如果它們相等)或遞減計數器(不相等)。 在此過程結束時,如果數組中存在占多數的元素,則它將是存儲的數組元素變量的值。
算法可以用偽代碼如下表示:
- 初始化元素m並給計數器i賦初值i = 0
- 對於輸入隊列中每一個元素x:
- 若i = 0, 那麼 m = x and i = 1
- 否則若m = x, 那麼 i = i + 1
- 否則 i = i − 1
- 返回 m
即便輸入序列沒有多數元素,這一算法也會返回一個序列元素。然而如果能夠進行第二輪遍歷,檢驗返回元素的出現次數,就能判斷返回元素是否為多數元素。因此算法需要兩次遍歷,亞線性空間算法無法通過一次遍歷就得出輸入中是否存在多數元素。[3]
參見
參考資料
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads