zoukankan      html  css  js  c++  java
  • 多数投票算法(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;  
        
        }
  • 相关阅读:
    php之面向对象(2)
    PHP ON 阿里云的环境配置攻略
    InitPHP框架搭建高可用WEB应用
    PHP移动互联网开发笔记(6)——MySQL数据库基础回顾[1]
    5 个不用 Bootstrap 的理由
    http中get与post的区别
    django的CSRF保护机制
    博客园项目开发中的难点
    centos7.5静态网页基于nginx建站(python3.6 mysql5.7 nginx安装以及配置)
    python3面向对象常用特性知识点
  • 原文地址:https://www.cnblogs.com/jfwu/p/5561567.html
Copyright © 2011-2022 走看看