摩尔投票法(Boyer–Moore majority vote algorithm)

参考资料

  1. 论文MJRTY A Fast Majority Vote Algorithm
  2. 算法演示网站
  3. 维基百科

算法解读

概述

摩尔投票法(Boyer–Moore majority vote algorithm)出自论文,算法解决的问题是如何在任意多的候选人(选票无序),选出获得票数最多的那个。常见的算法是扫描一遍选票,对每个候选人进行统计的选票进行统计。当候选人的数目固定时,这个常见算法的时间复杂度为: O ( n ) O(n) O(n),当候选人的数目不定时,统计选票可能会执行较长时间,可能需运行 O ( n 2 ) O(n^2) O(n2)的时间。当选票有序时,可以很容易编出 O ( n ) O(n) O(n)的程序,首先找到中位数,然后检查中位数的个数是否超过选票的一半。这篇论文针对无序且侯选人不定的情形,提出了摩尔投票算法。算法的比较次数最多是选票(记为n)的两倍,可以在 O ( n ) O(n) O(n)时间内选出获票最多的,空间开销为 O ( 1 ) O(1) O(1)

算法

  • 形象化描述

想象着这样一个画面:会议大厅站满了投票代表,每个都有一个牌子上面写着自己所选的候选人的名字。然后选举意见不合的(所选的候选人不同)两个人,会打一架,并且会同时击倒对方。显而易见,如果一个人拥有的选票比其它所有人加起来的选票还要多的话,这个候选人将会赢得这场“战争”,当混乱结束,最后剩下的那个代表(可能会有多个)将会来自多数人所站的阵营。但是如果所有参加候选人的选票都不是大多数(选票都未超过一半),那么最后站在那的代表(一个人)并不能代表所有的选票的大多数。因此,当某人站到最后时,需要统计他所选的候选人的选票是否超过一半(包括倒下的),来判断选票结果是否有效。

  • 算法步骤

算法分为两个阶段:pairing阶段和counting阶段。

  1. pairing阶段:两个不同选票的人进行对抗,并会同时击倒对方,当剩下的人都是同一阵营,相同选票时,结束。

  2. counting阶段:计数阶段,对最后剩下的下进行选票计算统计,判断选票是否超过总票数的一半,选票是否有效。

  • pairing阶段的简化

选票不同就要大干一架,太过粗鲁,这里提供一种更加现代化的文明方式。
在场的有个叫onwaier的,他很聪明,他想到一个方法。他用他那犀利人目光扫一遍所有代表们的选票,在脑子记住两件事,当前的候选人的名字cand和他对应的计数k(并不是他的选票数)。起始时,k的值为0,看每个人的选票时,先想想现在k是否为0,如果是0就将cand更新为他将看到的候选人的名字并且将k的值更新为1。观察每个人选票的过程,如果这个人的选票与cand相同,则将k的值加1;否则,将k的值减1。最后的cand可能胜选,还需统计他的总选票数是否超过一半。

算法证明

  • 53
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Boyer-Moore-Horspool算法是一种字符串匹配算法,它可以在文本中快速查找一个模式串。该算法的核心思想是利用模式串中的信息,尽可能地跳过不必要的比较,从而提高匹配效率。具体来说,算法首先预处理模式串,构建一个跳表,然后从文本串的末尾开始匹配,每次跳过尽可能多的字符,直到找到一个匹配位置或者到达文本串的开头。如果找到了匹配位置,则返回该位置在文本串中的下标;否则返回-1。该算法的时间复杂度为O(n+m),其中n和m分别为文本串和模式串的长度。 ### 回答2: Boyer-Moore-Horspool算法是一种用于字符串匹配的快速算法。该算法由Robert S. Boyer和J Strother Moore于1977年提出,之后由Richard Horspool进行了改进。该算法在实际应用中广泛使用,如文本编辑器中的查找和替换功能。 该算法的优点在于它能够利用模式串中的信息快速地跳过不匹配的字符。它的基本思想是从待匹配的字符串的右侧开始与模式串进行匹配,如果遇到不匹配的字符,则根据模式串中该字符的位置来确定移动的步数。这样可以在每次比较时跳过多个字符,提高了匹配的效率。 具体而言,Boyer-Moore-Horspool算法首先构建一个坏字符表,用于记录模式串中每个字符在模式串中最右出现的位置。当发生不匹配时,通过查找坏字符表获取需要移动的步数。如果坏字符不在模式串中出现,则可以直接移动模式串的长度个位置,因为整个模式串都不可能出现在待匹配的字符串中。 在匹配过程中,Boyer-Moore-Horspool算法一般比其他字符串匹配算法更快速,例如Brute-Force算法和KMP算法。但是,该算法并不能处理带有通配符或正则表达式的模式串,因此在某些特定情况下可能不适用。 总而言之,Boyer-Moore-Horspool算法是一种高效的字符串匹配算法,通过合理利用模式串中的信息,能够快速地跳过不匹配的字符,提高匹配效率。它在实际应用中有广泛的应用和成就。 ### 回答3: Boyer-Moore-Horspool算法是一种字符串匹配算法,用于在一个主字符串中查找子字符串的位置。它是Boyer-Moore算法的简化版本,由Nigel Horspool在1980年提出。 该算法的核心思想是从主字符串的末尾开始匹配,当发现不匹配的字符时,使用预先计算的"坏字符规则"和"好后缀规则"进行跳跃式的移动。坏字符规则是指对于不匹配的字符,在子字符串中查找其最右出现的位置,然后根据该位置和主字符串中当前字符的位置计算移动距离。好后缀规则是指对于匹配的子串的部分,从右往左查找其在子字符串中的最右出现位置,然后根据该位置和主字符串中当前字符的位置计算移动距离。 Boyer-Moore-Horspool算法通过在预处理阶段计算坏字符规则数组,以及在匹配阶段计算好后缀规则数组,来提高匹配的效率。算法的时间复杂度为O(n+m),其中n为主字符串的长度,m为子字符串的长度。 Boyer-Moore-Horspool算法在实际应用中具有很好的性能。它在大多数情况下比其他字符串匹配算法更快,特别是在处理长字符串和具有较小字符集的情况下。该算法已被广泛应用于文本编辑器、搜索引擎、数据压缩等领域。 总而言之,Boy er-Moore-Horspool算法是一种高效的字符串匹配算法,通过利用坏字符规则和好后缀规则进行跳跃式移动,以提高匹配效率。它在实际应用中表现出优秀的性能,是一个重要的算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值