一:摩尔算法核心
- 最基本的摩尔投票问题,找出一组数字序列中出现次数大于总数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
- 来源:知乎
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。