合并没有比较键的排序列表

时间:2015-04-01 14:32:25

标签: algorithm

说我们有以下列表:

list 1: x, y, z
list 2: w, x
list 3: u

我们希望合并它们,以便尊重每个列表中的顺序。针对上述问题的解决方案可能是w, x, y, z, u

如果我们有比较键(例如字符串比较; a< z),这个问题很容易,因为这给了我们对任何元素相对于组合列表中其他元素的位置的引用。但是当我们没有钥匙的情况呢?对于上述问题,我们可以按如下方式重述问题:

x < y AND y < z AND w < x where x, y, z, w, u are in {0, 1, 2, 3, 4}

我目前正在解决此类问题的方法是将问题建模为约束满足问题 - 运行AC3弧一致性算法以消除不一致的值,然后运行递归回溯算法做作业。这很好,但似乎有点矫枉过正。

是否有通用算法或更简单的方法来应对此类问题?

1 个答案:

答案 0 :(得分:1)

  1. 为列表中的每个字母构建一个包含节点的图表。

    x    y    z
    
    
    w    u
    
  2. 为任何列表中的每对连续字母添加从字母X到字母Y的有向边。

    x -> y -> z
    ^
    |
    w    u
    
  3. Topologically sort图表节点获取满足所有约束条件的最终列表。

    如果图表中有一个循环,拓扑排序算法将检测到该循环,揭示了原始列表引起的约束中的矛盾。