在我正在进行的应用程序中,我获得了一个项目列表,以及它们之间的关系,我需要计算一个排序列表。为了好玩,让我们使用考试评分示例,我们知道:
John比Jane做得更好
Jane比Luke
卢克比杰森做得更好
Jason比Tim
对于此列表,我需要计算以下排序列表:
如何根据有争议的关系派生项目在排序列表中的位置?
答案 0 :(得分:3)
从根本上说,排序需要linear order 。
你需要你的关系是一个线性顺序,这意味着:
那么,这是什么意思?大多数通常的关系是线性的例如,如果你在谈论成绩,实际上是实数,那么是,成绩可以线性排序。排名也是如此,因为它们只是实数。
但是,例如,如果您对国际象棋选手进行排名,则无法使用他们的比赛历史记录。如果玩家A在他们的大部分比赛中击败了玩家B,并且B在他们的大部分比赛中再次击败了C,这并不意味着A> B> C,仅仅因为C在他们的大部分比赛中可能击败了A.
这是Elo ratings存在的原因之一,他们需要一个线性顺序来排序谁是最好的玩家,并注意Elo基本上只是一个实数,因此有一个线性顺序。
因此,对于考试评分,您根本就没有线性顺序。为什么?这是真实的数字!嗯,是的,你有这个线性顺序,但你不能问这个线性顺序的一切,你被限制在预定义的比较列表,在这里:
- John比Jane更好。
- 简比卢克做得差。
- 卢克比杰森做得更好
- 杰森的表现比蒂姆差。
醇>
所以,答案是:不,一般情况下,如果您没有任何一对元素之间的比较,则无法对列表进行排序。
现在,我正在研究一个“最不好的”#34;回答,但这对我来说并非微不足道......
编辑:好的,我想出了一些东西。我们的想法是,您将在预定义的比较列表中提取最可能的信息。然后将不在扩展比较列表中的任何比较视为相等。
那么,你是怎么做到的?
首先,对于任何< b比较,添加条目b>一个。然后,您将查看预定义的比较列表以进行任何比较a< b和b< c并添加(如果它已经不在这里)所有相应的a< c(传递性)和c>一个。如果你知道没有平等(没有同一年级的学生),那就完成了。否则,你必须添加所有的反身性和反对称关系。你无法对整体做任何事情。现在,您有扩展的比较列表。
现在,采取您最喜欢的排序算法。如果你没有,quicksort是好的,高效的,写短的。然后,每次算法要求a和b之间进行比较时,请查看扩展比较列表。如果比较在这里,很好,否则,将比较视为a = b。 (请注意,如果您知道没有平等性,那么算法并不重要)
结果将是"最不严重的"排序清单。通常有几种可能的"最不严重的"排序列表,但这个算法只给你一个。
所以,让我们举个例子。它与OP中给出的几乎相同,略有不同(" John比Luke&#34更差;而不是" Jane比Luke做得更差") 。所以,我们从:
开始现在,对于每个" X比Y"更差,我添加" Y优于X",反之亦然。新句子以粗体显示:
最后,我扫描所有可能的句子" X做得比Y"并且" Y比Z"做得更好,我添加" X比Z&#34更好;
扩展表已完成。
现在让我们来看看quicksort的伪代码:
function quicksort('array')
if length('array') ≤ 1
return 'array' // an array of zero or one elements is already sorted
select and remove a pivot value 'pivot' from 'array'
create empty lists 'less' and 'greater'
for each 'x' in 'array'
if 'x' ≤ 'pivot' then append 'x' to 'less'
else append 'x' to 'greater'
return concatenate(quicksort('less'), 'pivot', quicksort('greater'))
与标准快速排序的唯一差异在于,您通常无法知道问题if('x' ≤ 'pivot') ...
的答案。相反,如果x=Luke
和pivot = Tim
,你会在你的表格中查找句子"卢克的表现比蒂姆更糟糕。如果您找到了,那么您认为答案是true
并且append 'x' to 'less'
。如果你在表格中找到了#43;卢克比蒂姆更好,那么你认为答案是错误的,你做append 'x' to 'greater'
。最后,如果您无法找到上面提到的两个句子中的任何一个,那么就像'x' == 'pivot'
那样,append 'x' to 'less'
答案 1 :(得分:2)
如果您在此处抛出http://en.wikipedia.org/wiki/Topological_sorting算法,则可以查看结果以查看是否有任何两个人处于固定顺序:如果是,则可以从另一个人访问一个。如果您的数据是一致的,拓扑排序将为您提供与您的数据一致的线性顺序,但可能意味着您的数据实际上不支持的顺序,因为缺乏比较来判断Adam是否真的比Bill做得更好。
除非您的数据非常特殊,否则您可能会发现一些情况,其中图表中存在周期,因此根本没有订单是一致的。您可以使用http://en.wikipedia.org/wiki/Strongly_connected_component找到与此类周期相关联的人群。
如果你必须解决嘈杂和不一致的数据,你可能不得不求助于某种统计排名系统。在http://en.wikipedia.org/wiki/Pairwise_comparison处有一种摘要。进一步的网络搜索将向您展示布拉德利 - 特里模型可以通过各种方式进行拟合,包括逻辑回归,因此它是一个起点,尽管当然还有各种各样的其他评分系统,其中一些与运动和诸如http://en.wikipedia.org/wiki/Elo_rating_system
之类的游戏