算法笔记:摩尔投票法
Posted 东条希尔薇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法笔记:摩尔投票法相关的知识,希望对你有一定的参考价值。
问题引入:
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
我们很轻松的想到暴力求解的方法:
定义两个指针i和j,i记录该位置的数字,j向后遍历
每遇到相等的数字就将计数器+1
如果计数器大于了n/2,就停止,并返回此时的i
但这种算法的时间复杂度较高,为O(n2),显然达不到题目的要求
所以,为了将这道题的时间复杂度降到O(n),我们可以使用摩尔投票法
算法简介
摩尔投票法,是一个方便求众数的算法,其算法核心思想是:
- 将数组中第一个元素记录下来,并将计数器置为1
- 往后遍历数组,如果遇到相等的元素,计数器加一
- 如果遇到不相同的元素,计数器减一
- 减到0后,将记录的元素更新为当前指针的后一个元素,并更新计数器为1
- 遍历完数组后最后存储的数字,就是我们要求的众数
形象解释
我们可以想象有一个总统竞选,超过半数的当选总统
设有1,2,3三位总统竞选,选民将自己支持的总统的序号写在自己的牌子上
但不同的选民都互相看不顺眼,不顺眼的一对全部出去打架去了
这是出去打架后剩下的结果
可以观察到:
剩下的数字,绝对是那个超过了总数一半数字的
所以我们能轻易求出这个超过一半选票的总统是1
这就是我们理解这个算法的基础
代码实现
int majorityElement(int* nums, int numsSize){
int count=0;
int ret=0;
for(int i=0;i<numsSize;i++)
{
if(count==0)//更新数字
{
ret=nums[i];
count=1;
}
else
{
if(ret==nums[i])//如果相等,计数器加一
{
count++;
}
else
{
count--;//不相等就减一
}
}
}
return ret;//最后记录的数字就是我们要求的众数
}
以上是关于算法笔记:摩尔投票法的主要内容,如果未能解决你的问题,请参考以下文章
Boyer–Moore Majority Vote Algorithm摩尔投票法,众数算法,Java