找到链的比较器

时间:2013-06-14 02:10:18

标签: algorithm sorting compare

我有一对像

这样的对
[[4,1],[1,2],[2,3]]

我们的想法是对它们进行排序,以便第一个节点的第二个索引与第二个节点的第一个匹配。在该示例中,列表已排序。假设列表始终可以唯一地放入此表单中。该列表永远不会循环。

现在,如果有可能,我想要一个比较器compare,它可以通过以下方式获得此表格:

x = [[4,1],[1,2],[2,3]]

x.sort(compare)

假设函数compare返回对应于“更大”和“更小”的两个值中的一个。这是否可能,如果是,它是否依赖于排序算法。

如果不可能,是否可以通过两次传球(可能使用不同的比较器)或任何固定的次数。

我在python中写过这个,但我的问题不是具体的。

1 个答案:

答案 0 :(得分:8)

一次通过是不可能的,因为您想要的顺序不是strict partial order。具体来说,为了使比较器工作,它需要遵守几个属性:

  1. 反身性:一个元素永远不会比自己低。
  2. 不对称:如果a比较小于b,则b不会比a小。
  3. 传递性:如果比较小于b且b比较小于c,则c不会比小于a。
  4. 在您的情况下,所有这三个属性都被违反:

    1. [1,1]比自己小,因为你可以链[1,1],[1,1]。
    2. 两个元素可以相互链接:[1,4]链[4,1]和[4,1]链[1,4]。
    3. 传递性不成立:[1,2]链[2,3]和[2,3]链[3,4],但[1,2]不与[3,4]链连接。
    4. 更好的问题建模方法是尝试通过图表查找Eulerian path。 Eulerian路径是一种跟踪一系列链接的方式,因此您永远不会回溯链接,以便跟踪所有链接。 (如果你曾经有过那些“画这个数字而不用回线或捡起你的铅笔”的谜题,那就是同样的想法。)在你的情况下,链接是对[a,b]和通过它们的链与欧拉路径相同。幸运的是,there are many good, efficient algorithms for finding Eulerian paths,我认为它们正是您在此背景下所寻找的。

      希望这有帮助!