使用最小交换次数对序列重新排序以实现部分顺序约束

时间:2016-03-20 21:20:38

标签: algorithm sequence swap inversion partial-ordering

输入:元素数组和这些元素子集的部分顺序,被视为约束集。

输出:符合部分顺序的数组(或任何有序序列)。

问题:如何有效地实现重新排序?与原始输入序列相比引入的反转(或交换)的数量应尽可能小。注意,可以为任何数量的元素定义偏序(某些元素可能不是它的一部分)。

上下文:它来自2层图交叉减少的情况:在交叉减少阶段之后,我想重新排序一些节点(因此,部分订单可能只包含一个小子集。)

一般来说,我有一点想要削弱这一点,并且仅针对作为部分顺序一部分的元素来解决问题(尽管我认为,这可能导致非最佳结果)。因此,如果我有序列A B C D E并且部分顺序仅包含A,B和E,那么C和D将保持在相同的位置。它以某种方式让我想起了Kemeny得分,但我还不能把它变成算法。

只是为了确定:我不是在寻找拓扑类型。这可能会引入比所需更多的反转。

修改1:

  • 更改了措辞(序列到数组)。
  • 解决问题的额外空间量可以是任意的(好的,多项式有界)大。当然,越少越好:)所以,像O(ArrayLen * ArrayLen)这样的东西最多就太棒了。
  • 为什么最小量的交换或反转:由于此过程是交叉减少的一部分,因此在与第二个节点层的边缘交叉方面,输入数组的排序(希望)接近最佳值。然后,每次额外的交换或反转都可能会再次引入边缘交叉。 在计算输出的过程中,完成的交换次数或移动次数并不重要(尽管如此,线性或正方形会很酷),因为只有输出质量很重要。现在,我要求约束处于总顺序,只检查该订单的节点,因此解决它变得微不足道。但是部分订单约束会更灵活。

1 个答案:

答案 0 :(得分:0)

我发现了一篇看起来很有希望的论文:"一种用于约束两级交叉减少的快速简单的启发式算法"迈克尔福斯特。 连同我的问题下面的评论一起回答。再次感谢,@ j_random_hacker!