LeetCode精讲:摩尔投票算法

什么是摩尔投票算法?

摩尔投票算法是一种使用线性时间和常数空间查找大部分元素序列的算法。它以1981年出版的Robert S. Boyer和J Strother Moore的名字命名,并且是流式算法的典型例子。

最简单的形式就是,查找输入中重复出现超过一半以上(n/2)的元素。如果序列中没有这种元素,算法不能检测到正确结果,将输出其中的一个元素之一。如果不能保证输入数据中有占有一半以上的元素,需要再遍历一下验证。

算法流程:

该算法在其局部变量中维护一个序列元素和一个计数器,计数器最初为零。然后,它一次一个地处理序列的元素。处理元素x时,如果计数器为零,则算法将x存储为其维护的序列元素,并将计数器设置为1。否则,它将x与存储的元素进行比较,并使计数器递增(如果相等)或递减计数器(不相等)。

这里有两个先觉条件要明确:

出现超过一半以上(n/2)的元素有且只有一个;

这个元素一定存在

这里先贴代码(swift):


代码摘要:

我们维护一个局部变量作为当前查找元素,一个局部变量作为计数器,

当遍历开始的时候,此时计数(count)为0,则将数组第一个元素作为当前查找元素;

当遍历的元素与查找元素相等,计数加1;反之则-1;

若当计数为0时,将下一个元素作为当前查找元素,继续重复以上操作;当遍历结束时,当前查找元素则为目标元素。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 6,032评论 0 13
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,159评论 1 32
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,499评论 0 5
  • 后来的我经常会在别人的故事里流着自己的眼泪,感叹人世的悲苦,但却仍平复不下一颗躁动不安的心。对于未知的苦和乐,我都...
    清w欢阅读 308评论 1 4
  • 在性能测试种最常见的问题 在软件性能测试期间,开发人员会寻找性能的症状和问题。速度问题——例如缓慢的响应和长时间的...
    杨二黑阅读 437评论 0 0