想象一下我想按照他们喜欢的顺序排列的书籍清单。我没有对单个书籍进行评级,而是从列表中选择两本(随机选择)书籍中的最佳书籍,并根据我的需要重复多次(不对所有组合进行评级)。
如何根据此二元选择对书单进行排序?这个问题有官方名称吗?
答案 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