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

      - 来源:知乎

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

  • 相关阅读:
    SQL优化——union与union all 、left join 和 inner join 及 内连接
    用jdk自带工具jvisualvm查看系统内存使用情况
    不重启也能清理catalina.out日志的方法
    自己用crontab弄个定时任务备份日志重启项目
    三层架构的一点理解以及Dapper一对多查询
    Nuget包添加文件
    WPF启动流程-自己手写Main函数
    WPF实现手势解锁
    VS提交码云权限问题
    Json转Dictionary
  • 原文地址:https://www.cnblogs.com/25-lH/p/10469639.html
Copyright © 2011-2022 走看看