多数决投票程序的实施
majorityjudgement的Python项目详细描述
这是执行多数决投票程序,如 由Michel Balinski和Rida Laraki在A theory of measuring, electing , and ranking中提出
它接受投票者提供的分数统计,并提供python类型 按照多数判决的顺序把它们包起来。
例如:
x = MajorityJudgement([5, 5]) y = MajorityJudgement([3, 7]) assert x < y
第一个是获得5票0票和5票的候选人的等级 共1页。第二位是3票0票、7票1票的候选人。因此 多数判决程序认为第一候选人比 第二个候选人。
如果你想知道更多关于投票细节的信息, 多数判断对象的行为类似于相应的等级表 分配给他们。
例如:
assert list(MajorityJudgement([2,2])) == [0,1,0,1]
多数判断对象的用法通常与 对应的等级列表。尤其是它支持所有的容器 方法有效。
在内部,实现是相当不同的。它被编码为 重复循环。所以列表
[0, 0, 0, 1, 0, 1, 0, 1]
内部表示为
[[[0], 3], [[1], 1], [[0, 1], 2]]
我们选择的表示法只会构建长度为1或2的循环:a 当存在一个明确的中间值时,通常建立一个长度周期,而 当上、下中隔层 不同(这不是完全正确的。例如,投票名单[1,1,1,1]将不会 产生任何长度为2的循环,但这是一个很好的经验法则)
与其构建整个列表然后压缩,不如将整个周期 通过计算从剩余的选票中可以弹出多大的一次竞选而立即构建 一下子把它全弹出来。这意味着即使是非常庞大的人口 投票人可能会得到有效的处理,因为最终的名单实际上非常 很小。
在这个压缩文件上也可以有效地进行比较 表现:平等在两个平等的意义上直接运作 投票将产生两个相等的代表。比较可以由 先弹出常用前缀:如果两个列表都以[x,n]和[x,m]开头 然后我们可以立即丢弃min(m,n)条目,而不必 迭代。
似乎所有的选票都可以被压缩成 此表单的列表,周期很少。我猜想它可以在 o(记录(投票者)),但尚未对此进行验证。当然,实际上 就是这样。