我有一个排序问题,我很确定没有规范的“答案” - 但可能有许多不同的方法,每个都有利弊。我有兴趣听听一些不同的方法。
假设一群人{p_i | i=1,...,M}
排名他们最喜欢的冰淇淋口味。总共有N
种不同的口味,但是单个人p_i
仅排列他或她最熟悉的n_i << N
口味。我有兴趣将这些子排名组合成所有N
种口味的合理整体排名。
对于具体情况:我的M
和N
大致1000
(巧合),每个n_i
约为20
。你可以假设人们的口味有足够的重叠,这样就没有味道完全“孤立”。
同样,即使没有一个明确的答案,我也有兴趣听到不同的方法来解决这个问题。谢谢!
答案 0 :(得分:1)
解决这个问题的一种方法是构造一个有向循环图,表示对元素排序的所有约束。图中的节点将表示要比较的不同元素,如果有人排名第一个元素比第二个元素好,则第一个节点和第二个节点将有一个边缘。该图不会太大,可以通过为每个节点创建一个节点来构建线性时间。对象,然后根据首选项添加边缘。
此图表有两种可能性。首先,如果图形包含一个循环,则首选项中必定存在冲突,并且无法一致地对元素进行排序。其次,如果图形没有周期,那么图形的任何拓扑排序都会给出元素的整体一致排序,因为每个元素都将放在所有元素之后,它们传递到它之前。
希望这有帮助!
答案 1 :(得分:1)
我认为这个问题对于SO来说太开放了,但我会建议一个简单而有效的加权排名和后续总结。
我是这种方法,人们将他们的选择从1到20排列,其中1是他们的最爱,承载20和20的重量是他们最差的,权重为1。
一旦所有偏好都是所有权重的总和,你就有了排名。