当前位置: 首页 > news >正文

摩尔投票法和Quorum算法

摩尔投票法和Quorum算法

1. 摩尔投票法

摩尔投票法也可以称为多数投票法。

1.1 概述

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

1.2 算法

1.2.1 形象化描述

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

1.2.2 算法步骤

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

  1. pairing阶段:两个不同选票的人进行对抗,并会同时击倒对方,当剩下的人都是同一阵营,相同选票时,结束。
  2. counting阶段:计数阶段,对最后剩下的下进行选票计算统计,判断选票是否超过总票数的一半,选票是否有效。
  • pairing阶段的简化

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

1.2.3 算法证明

证明

假设共有n个代表(一人一票,选票总数为n)。当onwaier看到第i个代表的选票时,前面他已经看到的所有选票可以分为两组,第一组是k个代表赞同cand;另一组是选票可以全部成对(选票不同)抵销。当处理完所有的选票时,如果存在大多数,则cand当选。
假设存在一个x其不同于cand,但拥有的选票超过。但因为第二组的选票可以全部成对抵销,所以x最多的选票数为,因此x必须要收到第一组的选票才能超过一半,但是第一组的选票都是cand的,出现矛盾,假设不成立。
所以,如果存在大多数,cand就是那个。

1.2.4 算法演示

来自网站

选票情况为:
A A A C C B B C C C B C C
结果应该是C

  • 算法执行过程

动图

1.2.5 算法代码

  • 伪代码

    function find_majority(A[0..n-1]):candidate ← Nonecount ← 0# 第一次遍历:选出候选人for i from 0 to n-1:if count = 0:candidate ← A[i]count ← 1else if A[i] = candidate:count ← count + 1else:count ← count - 1# 候选人即为可能的多数元素# (可选:第二次遍历校验出现次数是否 > n/2)return candidate
    
  • python代码

    def boyer_moore_majority(nums):candidate = Nonecount = 0# 第一次遍历:寻找候选元素for num in nums:if count == 0:candidate = numcount = 1elif num == candidate:count += 1else:count -= 1# (可选)第二次遍历:验证候选是否为多数if nums.count(candidate) > len(nums) // 2:return candidateelse:return None  # 不存在多数元素
    

2. Quorum算法

2.1 概述

分布式系统中的每一份数据拷贝对象都被赋予一票。每一个读操作获得的票数必须大于最小读票数(read quorum)(Vr),每个写操作获得的票数必须大于最小写票数(write quorum)(Vw)才能读或者写。如果系统有V票(意味着一个数据对象有V份冗余拷贝),那么最小读写票数(quorum)应满足如下限制:1. Vr + Vw > V(总票数)
2. Vw > V/2(保证写多数)第一条规则保证了一个数据不会被同时读写。当一个写操作请求过来的时候,它必须要获得Vw个冗余拷贝的许可。而剩下的数量是V-Vw 不够Vr,因此不能再有读请求过来了。同理,当读请求已经获得了Vr个冗余拷贝的许可时,写请求就无法获得许可了。第二条规则保证了数据的串行化修改。一份数据的冗余拷贝不可能同时被两个写请求修改。

简单说,假设有N个副本。当更新操作w在超过Vw个副本上成功之后,才认为此次更新操作成功;而对于读操作而言,至少需要读到Vr个副本才能读到此次更新的数据。其中Vw+Vr>N,即Vw和Vr有重叠,一般Vr + Vw = N + 1。

在这里插入图片描述

举个栗子,假设系统有5个副本,Vw=3,Vr=3。初始时数据为(V1, V1, V1, V1, V1)——【成功提交的版本号为1】。

在某次更新操作在3个副本上成功之后,就认为此次更新操作成功。数据变成:(V2, V2, V2, V1, V1)——【成功提交的版本号为2】

因此,最多只需要读3个副本,一定就可以读到V2(此次更新成功的数据)。而后台可以对剩余的V1同步成V2,且不需要让Client知道

2.2 架构图

假设quorum值 = (系统节点数/2)+1,B系统必须部署奇数台节点,A系统每次向B系统发送数据,都必须给B系统中的每个节点发送一次。A系统判断本次数据发送成功与否的依据是,在指定时间内,B系统中至少有quorum台节点回复了ACK,即B系统中超过半数的节点接收成功。

在这里插入图片描述

2.3 优势

  • 提升可用性:写操作无需等待所有副本响应,只需部分副本成功即可。

  • 保证一致性:写和读操作之间票数重叠,避免“读到旧数据”或“写冲突”。

  • 容错能力强:集群中即使有若干节点故障,只要剩余节点满足 Quorum,就能继续服务。

Quorum 机制也广泛用于分布式共识算法(如 Paxos、Raft、Zab)的多数投票流程中,确保决策在至少多数副本确认后才生效,从而避免脑裂和不一致。

2.4 算法实现

  • 伪代码
procedure majorityVote(A[0..n−1]):candidate ← nullcount ← 0for i from 0 to n−1 doif count == 0 thencandidate ← A[i]count ← 1else if A[i] == candidate thencount ← count + 1elsecount ← count − 1return candidate
  • python实现

    def majority_vote(nums):# 第一阶段:寻找候选人candidate = Nonecount = 0for num in nums:if count == 0:candidate = numcount = 1elif num == candidate:count += 1else:count -= 1# 第二阶段:验证候选人是否真的是多数if candidate is not None and nums.count(candidate) > len(nums) // 2:return candidatereturn None
    
http://www.sczhlp.com/news/49533/

相关文章:

  • Oracle 和 Sybase ASE 数据库关闭后的启动
  • 一站式网络营销网站开发需求收集 模板
  • 建筑网站制作企业微信官网入口
  • 门户网站建设招标方企业网站优化服务
  • 携程网网站是哪家公司做的淘宝美工培训班怎么样
  • 如何利用NAS做网站wordpress问答模板
  • 要怎么做网站作弊的网站
  • 百度网络营销佛山搜索seo优化排名
  • 购物网站建设信息在线网站建设平台
  • zzp 对研究报告的研究报告
  • KingbaseES DBLink 扩展
  • BUG: I3C读取I2C设备数据,I3C主机接收数据时未产生ACK
  • 音视频编解码——视频数据格式
  • 电流探头不慎进水怎么办?
  • 典型的网站案例免费的行情软件网站不下载
  • mi2设计公司网站做衣服的网站
  • 网站下雪代码wordpress没有底部
  • 太原做网站公司运营一个空间建多个网站
  • 平谷网站建设公司阿里做外贸的网站
  • 什么样的网站域名好免费的代码分享网站
  • 湖南seo优化推荐网站seo去哪个网站找好
  • 汽车网站页面设计网站建设总经理岗位职责
  • 长治哪里做网站wordpress商城模板免费下载
  • OI 回忆录 | 退役祈愿
  • Apache SeaTunnel 指南
  • 企业借助 MyEMS 开源能源管理系统实现节能减排的实践路径
  • docker上传镜像到阿里云私服arm-amd
  • 高清的宝安网站推广wordpress joomla 菜单
  • 宁波网站建设方式互联网三网合一网站建设
  • 屏蔽网站推广百度公司高管排名