zoukankan      html  css  js  c++  java
  • Boyer and Moore Fast majority vote algorithm(快速选举算法)

    问题来来自于leetcode上的一道题目,https://leetcode.com/problems/majority-element/,大意是是找出一个数组中,出现次数超过一个半的数字,要求是O(n)的算法。

    这道题的解法来自于  Boyer-Moore Majority Vote Algorithm   http://www.cs.utexas.edu/~moore/best-ideas/mjrty/。

    算法原理

    以下是论文原文的片段

    翻译过来大致是:

    假设有一群投票的人,每个人都会投票个某个候选人。为了选择最终赢的选取的候选人,可以采用这样的选举方式:每个投票人找到其他的投票人,并且这个投票人支持的候选不同于自己的支持的候选人,PK过后,这一对投票人同时出局。经过全部的PK之后,那么还没有出局的投票人支持的候选人,就有可能是最终的选举胜利者(获得半数以上的选票)。最后,选举主席,需要检查这位可能赢得选举的候选人的票数,来确认他是否赢得了选举。

    因为leetcode上的题目,已经确认了majority number始终是存在的。那么统计票数的一个步骤实际可以省略了。

    算法实现

    以下是论文的原文

    用java代码实现是

     public int majorityElement(int[] nums) {
     	int candIndex = -1;
     	int k = 0;
     	for ( int i = 0; i < nums.length  ; i++) {
     		if ( k == 0 ){
     			candIndex = i;
     			k = 1; 
     		}else{
     			if ( nums[candIndex] == nums[i]) {
     				k++;
     			}else {
     				k --;
     			}
     		}        	
     	}
     	return nums[candIndex];              
     }
    

      

  • 相关阅读:
    静态编译Qt4.4.3
    aenity
    qt linux 打包发布
    在處理影像資料上,Qt提供了QPixmap、QBitmap、QImage與QPicture等類別。
    bitrock 他家有绝活
    QT4.7 compile Qscilata you need change one line code
    QScintilla: QScintilla a Port to Qt v4 of Scintilla
    Scintilla and SciTE
    Take webpage screenshot from command line in Ubuntu Linux | Binary Tides
    tuoj.in
  • 原文地址:https://www.cnblogs.com/javanerd/p/6262249.html
Copyright © 2011-2022 走看看