php投票算法,算法 - SegmentFault 思否

1. 多数投票算法(Boyer-Moore Algorithm)

问题描述:

给定一个无序数组,有n个元素,找出其中的一个多数元素,多数元素出现的次数大于⌊ n/2 ⌋,注意数组中也可能不存在多数元素。

https://blog.csdn.net/kimixuc...

假设数组a[n]

两个变量:

candidate:多数元素的候选人

count:候选人的生命.

初始化:

先以数组第一个数为candidate,

count设置为1

过程:

遍历1:

从第二个数开始遍历,如果a[i]==candidate -> count++;

如果a[i] != candidate -> count--;

如果count==0,令candidate=a[i],count=1;

遍历2:

拿着当前的候选人去candidate,判断是否数量大于n/2

如果有多数元素数量大于n/2,那么为什么一定是candidate呢?

可以这么假设,candidate还是candidate,令非candidate的数全部为0。0的数量少于n/2肯定会在该过程中被耗尽,更别说把0分散成各种数的情况了。

分布式Boyer-Moore

这个算法的另外一个优点就是可以分治归并。

把一个大数组分成多个小数组,然后分别算出(candidate,count)

然后按相同的candidate,将其count叠加,最后看哪个count比较高,为最终候选人。

再遍历一遍验证。

int MoreThanHalfNum_Solution(vector numbers) {

int candidate,count;

int sum;

candidate = numbers[0];

count = 1;

for(int i=1; i < numbers.size();i++){

count = numbers[i] == candidate?++count:--count;

if(count == 0){

candidate = numbers[i];

count = 1;

}

}

// cout << candidate;

sum = 0;

for(int i = 0;i < numbers.size();i++){

if(candidate == numbers[i]) sum++;

}

return sum>numbers.size()/2?candidate:0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值