zoukankan      html  css  js  c++  java
  • 《算法

    一:摩尔算法核心

      - 最基本的摩尔投票问题,找出一组数字序列中出现次数大于总数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

      - 来源:知乎

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

  • 相关阅读:
    python前端CSS
    python 前端HTML
    python-day08网络编程
    python学生选课系统
    python-day07-面向对象进阶
    列表补充,列表的组合、查询元素是否存在列表,查询元素出现在列表中几次
    list补充,append()、extend()、insert()、remove()、del()、pop()、分片
    python第五天,两个知识点三目运算符和assert抛异常处理。
    运算符补充
    python第四天,list补充
  • 原文地址:https://www.cnblogs.com/25-lH/p/10469639.html
Copyright © 2011-2022 走看看