Boyer-Moore majority vote algorithm(摩尔投票算法)是一种线性时间复杂度和常数级空间复杂度的算法,用来查找元素序列中的众数。它是用Robert S. Boyer和J Strother Moore两人的名字命名,是一种典型的流算法。
该算法的最简单的形式,查找最多出现的元素,也就是找到一个输入中出现一半以上的重复元素。但是,如果该数不存在的话,算法将检测不到真实结果,但是仍将输出输入元素中的一个元素。 但是,我们可以再次遍历输入序列,计算返回元素出现的次数,以确定它是否真的是众数。
该算法在其局部变量中维护一个临时变量m
和一个计数器c
,计数器初值为零。 然后我们遍历序列中的每个元素。如果c==0
,则m=x;c=1;
(其中x
表示我们遍历到的元素)。 如果m==x
,那么c++
,否则c--
。 最后返回m
即可。
这可以用伪代码表示为以下步骤:
- 初始化一个元素
m
和一个计算器c=0
- 对于输入序列中的每个元素
x
- 如果
i == 0
, 那么m = x
并且i = 1
- 如果
m == x
, 那么c++
,否则的话c--
- 如果
- 返回
m
举个例子:
[ 1 1 1 2 2 3 1] m = 0, c = 0
[*1 1 1 2 2 3 1] m = 1, c