我想对一组项目(大小可能大于100,000)进行排名或排序,其中集合中的项目没有内在(可比较)值,而我拥有的是任何两个项目之间的比较< / strong>由用户以主观方式提供。
示例:考虑一个包含元素[a, b, c, d]
的集合,并按用户b > a
,a > d
,d > c
进行比较。此集合的正确顺序为[b, a, d, c]
。
这个例子很简单,但可能会有更复杂的情况:
c > b
。在这种情况下会导致与上述排序发生冲突。b > a
,d > c
。在这种情况下,排序是模糊的。它可以是[b, a, d, c]
或[d, c, b, a]
。在这种情况下,可以接受订购。如果可能的话,以某种方式考虑同一比较的多个实例并给出具有更高发生率的那些实例更加重要将是很好的。但是没有这种条件的解决方案仍然可以接受。
扎克伯格的FaceMash应用程序使用了这种算法的类似应用程序,他根据比较对人进行排名(如果我理解正确的话),但我无法找到该算法实际上是什么。
是否存在可以解决上述问题的算法?如果是这种情况,我不想花费精力尝试提出一个。如果没有特定的算法,是否有某些类型的算法或技术可以指向我?
答案 0 :(得分:16)
这是另一个竞技场已经出现的问题:竞技游戏!在这里,目标也是在一系列1对1比较的基础上为每个玩家分配全局“等级”。当然,困难在于比较不具有传递性(我在你的问题中采用“主观”来表示“由人提供”)。卡斯帕罗夫击败菲舍尔节拍(不认识另一位国际象棋选手!)鲍勃可能会击败卡斯帕罗夫。
这会产生无用的算法,这些算法依赖于传递性(即a > b and b > c => a > c
),最终会得到(可能)一个高度循环的图形。
已经设计了几种评级系统来解决这个问题。
对于有竞争力的国际象棋选手来说,最着名的系统可能是Elo algorithm/score。它的后代(例如,Glicko rating system)更复杂,并考虑到赢/输记录的统计特性 - 换句话说,评级的可靠性如何?这类似于您使用更多“游戏”加权更重的记录的想法。 Glicko也构成了Xbox Live用于多人视频游戏的TrueSkill system的基础。
答案 1 :(得分:3)
您可能对最小反馈弧集问题感兴趣。基本上问题是如果元素按某种顺序线性排序,那么找到“走错路”的最小比较次数。这与查找必须删除的最小边数以使图形非循环相同。不幸的是,解决问题的确是NP难。
讨论这个问题的几个链接:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.86.8157&rep=rep1&type=pdf
答案 2 :(得分:0)
我用Google搜索,查找第12.3章拓扑排序和深度搜索
http://www.cs.cmu.edu/~avrim/451f09/lectures/lect1006.pdf
你的关系集描述了有向无环图(希望是非循环的),因此图形拓扑排序正是你所需要的。