基于比较的排序算法(变异)

时间:2011-04-17 15:19:19

标签: algorithm sorting comparison ranking

此问题是对上一个问题的修改: Comparison-based ranking algorithm

我想提出的变化是:如果通过丢弃最早的矛盾选择来解决循环,那么实际上可以使用传递算法。

我在这里粘贴了原来的问题:

“我想对一组项目(大小可能大于100,000)进行排名或排序,其中集合中的每个项目都没有内在(可比较)值,而我所拥有的是任何两个项目之间的比较用户以“主观”的方式提供。

示例:

考虑具有元素[a,b,c,d]的集合。用户比较:

b> a,a> d,d> ç

此集合的正确顺序为[b,a,d,c]。

这个例子很简单,但可能会有更复杂的情况:

由于比较是主观的,因此用户也可以说c>湾在这种情况下会导致与上面的排序冲突。此外,您可能没有“连接”所有项目的比较,即:

b> a,d> C。在这种情况下,排序是模糊的。它可以是:[b,a,d,c]或[d,c,b,a]。在这种情况下,可以接受订购。

...

问题是:

是否存在可以解决上述问题的算法,如果是这种情况,我不想花费精力尝试提出一个。如果没有特定的算法,是否有某些类型的算法或技术可以指向我?“

1 个答案:

答案 0 :(得分:0)

可以使用topological sorting来处理不存在“周期”的更简单版本。

现在,对于更复杂的情况,如果每个“周期”元素在最终排名中出现的顺序无关紧要,那么您可以尝试以下方法:

  • 将问题建模为有向graph(即a > b暗示结果图中有一条边从节点“a”开始并以节点“b”结尾的事实)。

  • 计算图表的strongly connected components(SCC)。简而言之,SCC是一组具有属性的节点,您可以通过跟随边缘列表从集合中的任何节点到达集合中的任何节点(这对应于原始问题中的“循环”)。 / p>

  • 通过将每个节点“折叠”到它所属的SCC来转换图形,但保留不同SCC之间的边缘。

  • 事实证明,以上述方式获得的新图表为directly acyclic graph,因此我们可以对其进行拓扑排序。

最后,我们准备好了。拓扑排序应该告诉您在不同SCC中打印节点的正确顺序。对于同一SCC中的节点,无论您选择的顺序是什么,始终都是“循环”,因此可能会以随机顺序打印它们。