多数投票投票程序的实现
项目描述
这是Michel Balinski和Rida Laraki在《测量、选举和排名的理论》中提出的多数投票投票程序的实现。
它接受由选民提供的评分总计,并提供了Python类型来包装它们,这些类型按照多数投票顺序排序。
例如
x = MajorityJudgement([5, 5]) y = MajorityJudgement([3, 7]) assert x < y
第一个是一个获得了5票0分和5票1分的候选人的评分。第二个是一个获得了3票0分和7票1分的候选人。结果,多数投票程序将第一个候选人排名在第二个候选人之下。
如果您想了解更多关于投票细节的信息,MajorityJudgement对象的行为类似于分配给它们的评分列表。
例如
assert list(MajorityJudgement([2,2])) == [0,1,0,1]
MajorityJudgement对象通常可以像其相应的评分列表一样使用。特别是它以高效的方式支持所有容器方法。
内部实现相当不同。它被编码为重复循环的列表。所以这个列表
[0, 0, 0, 1, 0, 1, 0, 1]
在内部表示为
[[[0], 3], [[1], 1], [[0, 1], 2]]
我们选择的表示方式只构建长度为一或二的循环:长度为1的循环通常在存在无歧义的中间值时构建,而长度为2的循环通常在上下中间值不同时构建(这并不完全正确。例如,投票列表[1,1,1,1]不会产生任何长度为2的循环,但这是一个很好的经验法则)
不是构建整个列表然后再压缩,而是通过工作从剩余的投票中弹出多长的运行,一次性弹出所有这些运行,一次性构建整个循环。这意味着即使是非常大的选民群体也可以高效地处理,因为结果列表实际上非常小。
在此压缩表示法上,比较也可能被高效地执行:等价关系是直观的,即两个相同的投票将产生两个相同的表示。可以通过首先弹出公共前缀来进行比较:因此,如果两个列表都以[x, n]和[x,m]开头,那么我们可以立即丢弃min(m,n)个条目,而不是必须遍历。
似乎所有投票都可以用这种形式的压缩列表表示,循环很少。我推测这可以在O(log(voters))内完成,但我还没有验证这一点。在实际上,这似乎是成立的。
项目详情
majorityjudgement-0.3.2.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7588bc3ecc341e95c2d0740961848d8b5eb352f5c56fce002addf06160e3adca |
|
MD5 | 5d8a08d0f444da63b396eaf32d74b0f3 |
|
BLAKE2b-256 | 9c5da671e22c8ab59e6c94a5fac304dcd87a1246c203d09a1198d30b246b9490 |