《算法 - 摩尔投票算法》

一:摩尔算法核心

  - 最基本的摩尔投票问题,找出一组数字序列中出现次数大于总数1/2的数字(并且假设这个数字一定存在),显然这个数字只可能有一个。

  - 摩尔投票算法是基于这个事实:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个

二:代码

  • 我们再根据只有两个变量的实际代码理一遍:
    
    major 初始化随便一个数,
    
    count 初始化为0
    
    输入:{1,2,1,3,1,1,2,1,5}
    
    扫描到1,count是0(没有元素可以和当前的1抵消),于是major = 1,count = 1(此时有1个1无法被抵消)
    扫描到2,它不等于major,于是可以抵消掉一个major => count -= 1,此时count = 0,其实可以理解为扫到的元素都抵消完了,这里可以暂时不改变major的值
    扫描到1,它等于major,于是count += 1 => count = 1
    扫描到3,它不等于major,可以抵消一个major => count -= 1 => count = 0,此时又抵消完了(实际的直觉告诉我们,扫描完前四个数,1和2抵消了,1和3抵消了)
    扫描到1,它等于major,于是count += 1 => count = 1
    扫描到1,他等于major,无法抵消 => count += 1 => count = 2 (扫描完前六个数,剩两个1无法抵消)
    扫描到2,它不等于major,可以抵消一个major => count -= 1 => count = 1,此时还剩1个1没有被抵消
    扫描到1,它等于major,无法抵消 => count += 1 => count = 2
    扫描到5,它不等于major,可以抵消一个major => count -= 1 => count = 1
    至此扫描完成,还剩1个1没有被抵消掉,它就是我们要找的数。

三:算法详解

  - 作者:喝七喜

  - 链接:https://www.zhihu.com/question/49973163/answer/235921864

  - 来源:知乎

  - 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自www.cnblogs.com/25-lH/p/10469639.html