vote选举算法的Majority实现

多数投票算法(Majority Vote Algorithm)

    先给一个题目助助兴,给一个数组,其中含有N个非负元素,让你求出数组中出现次数超过一半的数字。

看到这个问题我们首先想到的可能是暴力的解法,那就是将数组排个序,输出中间的元素就行了,因为如果出现次数超过一半的话排完序后中间的那个元素肯定是我们需要求的值。

这样做的话排序的时间复杂度一般来说是O(NlogN),那么有没有时间复杂度为n的算法呢?

    答案当然是有的,有这样的一个算法,Majority Vote Algorithm,他是这样的做的:设置一个计数器count和保存最多元素的变量majority,

  1. 如果count==0,则将now的值设置为数组的当前元素,将majority赋值为1;
  2. 反之,如果majority和现在数组元素值相同,则count++,反之count--;
  3. 重复上述两步,直到扫描完数组。
  4. count赋值为0,再次从头扫描数组,如果素组元素值与majority的值相同则count++,直到扫描完数组为止。
  5. 如果此时count的值大于等于n/2,则返回majority的值,反之则返回-1。

代码的简单实现如下:

复制代码

 public int Find_Majority(int [] array) {
         int major=0, count = 0;
      int i=0;
     while(i<array.length){  
        if(i==0){       
            major=array[0];
            count=1;  
        }else if(major==array[i]){ //如果数组扫描到的数和当前majority数相等。  
            count++;  
        }else if(major!=array[i]&&count!=0){//如果数组扫描到的数和当前majority数不相等,且当前majority数的票数至少有一票。  
            count--;  
        }else{                   
           
            major=array[i];  
        }  
        i++;  
    }  
    int tmp_count=0;  
    for(int j=0;j<array.length;j++){  
        if(array[j]==major)  
            tmp_count++;  
    }  
    if(tmp_count>=(array.length+1)/2) //检验majority数的票数是否超过了总票数的一半  
        return major;  
    else  
        return -1;  
    
    }

复制代码

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值