二元选择等级的排序算法

时间:2011-01-05 08:31:50

标签: algorithm

想象一下我想按照他们喜欢的顺序排列的书籍清单。我没有对单个书籍进行评级,而是从列表中选择两本(随机选择)书籍中的最佳书籍,并根据我的需要重复多次(不对所有组合进行评级)。

如何根据此二元选择对书单进行排序?这个问题有官方名称吗?

3 个答案:

答案 0 :(得分:2)

正如Jonas Elfström指出的那样,Fisher-Yates是一种改变套装的规范方式,这可能是一个好主意,因为它可以让你获得每个项目的数据。我想你可能想要不止一次通过。基本上,在对项目集合进行排序时,您正在构建有向图,其中节点是项目,边缘表示大于或等于的关系。当一个人可以通过算法来定义这种关系时,那么单次传递就足够了,你最终会得到一个很好的有序集。

这里的复杂之处在于,非常可信的是,一次查看两本书并让人们在没有明确定义的算法的情况下做出决定,最终会出现A>的情况。 B,B> C和C>答:这显然不会产生良好的有序集。更糟糕的是,在两个不同的日子里,人们可以为同一本两本书给出两个不同的答案。

我能想到的最佳方法是维护n x n矩阵,其中n是要排序的项目数量。 i, j条目是选择项i优于项j的次数。在这里,i索引行和j索引列。

从这里,PageRank不幸的是获得专利 1 ,将是理想的。不太优雅,但可能足够好的是总结a ij a ji之间的差异,然后根据书籍排序在那。例如,排序三本书

   A B C
   _ _ _
 A|0 3 2
 B|2 0 3
 C|1 2 0

意味着A的评分优于B 3次,优于C 2次。对行进行求和

 A: (AB - BA) + (AC - CA) = (3 - 2) + (2 - 1) = 2
 B: (BA - AB) + (BC - CB) = (2 - 3) + (3 - 2) = 0
 C: (CA - AC) + (CB - BC) = (1 - 2) + (2 - 3) = -2

所以他们会排序为A > B > C


如果您不打算使用页面排名,则可以通过将每个书籍初始化为0的整数相关联来消除矩阵并获得相同的结果。在A上选择B时,递增与A关联的整数,并递减与B关联的整数。

1很抱歉咆哮,但我知道你是如何申请专利的,这本质上是一个数学结果。

答案 1 :(得分:0)

你可以做一本Fisher–Yates shuffle本书,然后逐两送他们。比较两个实例要么是一个称为排序的拉伸,要么可以说它是非常核心的。

答案 2 :(得分:0)

很抱歉引起旧问题,但我认为这对你有用。

当我处理相同的任务时,我选择在线插入排序。这是小型收藏的完美选择。例如,对于10本书,您应该只进行14次比较(平均情况下)。在最好的情况下,您应该只进行9次比较(如果您的集合已经排序)。

如果选择快速排序,则应进行20次比较(平均值),但总是比脏排序(通过将每本书与收藏中的所有书籍进行比较)更好。

无论如何,你应该进行在线排名(根据以前的比较结果进行下一对选择)。

请注意,所有这些解决方案都有一个关于传递关系的假设(如果book1比book3更好,book2比book3更好,那么book1比book3更好)。如果它不适合你 - 你不能对它们进行排名。

你可以找到维基百科上完美描述的两种算法:
http://en.wikipedia.org/wiki/Insertion_sort
http://en.wikipedia.org/wiki/Quick_sort