CS50 Runoff程序Tabulate函数两种实现差异原因咨询
CS50 Runoff选举程序:Tabulate函数两种实现的差异解析
核心规则回顾
Runoff选举的核心逻辑是:每个选民的选票仅能贡献给其排名列表中第一个未被淘汰的候选人,且每张选票在每一轮计票中仅能被统计一次。
两种实现的本质差异
第一种实现(统计所有选票):
这种实现错误地遍历了选民的全部排名候选人,只要候选人存在就为其计票。这相当于把同一张选票重复分配给多个候选人,完全违背了Runoff的规则。比如某选民的排名是A>B>C,若A未被淘汰,该选票只能归A;但第一种实现会同时给A、B、C各加1票,直接导致得票统计严重失真,后续的淘汰逻辑和最终结果必然错误。
此外,当候选人被淘汰后,这种实现依然会将选民投给该淘汰者的票计入统计,进一步偏离了算法要求。第二种实现(仅统计选民首个未被淘汰的候选人):
这种实现严格遵循算法逻辑:对每个选民,从其排名的第一位开始依次检查,找到第一个未被淘汰的候选人后,仅为该候选人加1票,随即停止对该选民后续排名的遍历。这确保了每张选票在每一轮中仅被统计一次,且只归属当前有效的候选人,完全符合Runoff选举的计票规则。
内容的提问来源于stack exchange,提问作者Tomasz Solga
相关产品推荐
相关产品推荐

