Boyer-Moore majority vote algorithm

これはステージング環境です。5 秒後に自動的に本番環境 (https://noshi91.github.io/algorithm-encyclopedia) にリダイレクトされます。リダイレクトを抑止したい場合は #noredirect を付けた URL /algorithm-encyclopedia/boyer-moore-majority-vote-algorithm#noredirect を利用してください。
name
Boyer-Moore majority vote algorithm
short description
Boyer-Moore majority vote algorithm は、列の過半数を占める要素を効率的に発見するアルゴリズムの一つである。 相異なる要素を繰り返し対にして、対にならずに残った要素が過半数となる候補であるという事実を用いる。 要素に対しては一致判定のみを用いるため、全順序などが定義されている必要が無い。 過半数を占める要素が存在しない場合何を出力しても良いことにすると、計算量をそのままに、列を一度走査するだけで計算することが可能になる。
input
長さ NN の列 aa
output
aaN2\frac{N}{2} 回を超えて出現する要素が存在するかどうか、存在する場合その要素
time complexity
Θ(N)\Theta(N)
space complexity
Θ(1)\Theta(1)

概要

Boyer-Moore majority vote algorithm は、列の過半数を占める要素を効率的に発見するアルゴリズムの一つである。 相異なる要素を繰り返し対にして、対にならずに残った要素が過半数となる候補であるという事実を用いる。 要素に対しては一致判定のみを用いるため、全順序などが定義されている必要が無い。 過半数を占める要素が存在しない場合何を出力しても良いことにすると、計算量をそのままに、列を一度走査するだけで計算することが可能になる。

詳細

aa から相異なる 22 要素を対にして、それらを取り除くことを操作が不可能になるまで繰り返すことを考える。 このとき、aa に残る要素が存在するならば全て等しくなっており、この要素のみが aa の過半数を占める可能性がある。

証明

xxaaN2\frac{N}{2} 回を超えて出現するとする。 対を作るたびに xx は高々 11 つずつ aa から取り除かれるが、対は N2\frac{N}{2} 個以下しか作れないため、xx は最後まで完全に取り除かれることが無い。 \blacksquare

アルゴリズムにおいては、aa を前から順に参照して、相異なる 22 要素を発見したら直ちに取り除く。 より正確には i=0,1,,N1i = 0, 1, \dots, N - 1 の順に、aja _ j が取り除かれていないかつ ajai,j<ia _ j \neq a _ i, j \lt i となるような jj が存在するならば aja _ jaia _ i を取り除く、という操作を繰り返す。 そのような jj の存在を効率的に判定するために、多重集合 S{ajj<i,ajS \coloneqq \lbrace a _ j \mid j \lt i, a _ j は取り除かれていない }\rbrace を管理する。 SS は空であるか、あるいは 11 種類の要素だけから構成されているため、11 つの元と S\lvert S \rvert だけを管理すればよい。 この表現によって、aja _ j の発見や SS の更新は全て時間計算量 Θ(1)\Theta(1) で実行される。

これによって得られた出力の候補が実際に過半数を占めるかどうかは、もう一度 aa を走査することで確認できる。

空間計算量は aa の元を O(1)\mathrm{O}(1) で保持できると仮定すると Θ(log(N))\Theta(\log(N)) bits となる。 これは S\lvert S \rvert の保持や、最後の確認で数えるときに NN 以下の整数を持つ必要があるためである。 Word-RAM を仮定すれば Θ(1)\Theta(1) となる。

一般化

長さ NN の列 aa1kN1 \leq k \leq N を満たす整数 kk が与えられたとき、aaNk+1\frac{N}{k + 1} 回を超えて出現する要素を列挙することが Θ(Nk)\Theta(Nk) の時間計算量、Θ(k)\Theta(k) の空間計算量で可能である。 元のアルゴリズムとほとんど同様に、k+1k + 1 個の互いに相異なる要素を組にして、組になっていない高々 kk 種類の要素とそれぞれの個数を管理すればよい。 k=1k = 1 の場合が Boyer-Moore majority vote algorithm である。

その他

参考文献