输入:元素数组和这些元素子集的部分顺序,被视为约束集。
输出:符合部分顺序的数组(或任何有序序列)。
问题:如何有效地实现重新排序?与原始输入序列相比引入的反转(或交换)的数量应尽可能小。注意,可以为任何数量的元素定义偏序(某些元素可能不是它的一部分)。
上下文:它来自2层图交叉减少的情况:在交叉减少阶段之后,我想重新排序一些节点(因此,部分订单可能只包含一个小子集。)
一般来说,我有一点想要削弱这一点,并且仅针对作为部分顺序一部分的元素来解决问题(尽管我认为,这可能导致非最佳结果)。因此,如果我有序列A B C D E并且部分顺序仅包含A,B和E,那么C和D将保持在相同的位置。它以某种方式让我想起了Kemeny得分,但我还不能把它变成算法。
只是为了确定:我不是在寻找拓扑类型。这可能会引入比所需更多的反转。
修改1:
答案 0 :(得分:0)
我发现了一篇看起来很有希望的论文:"一种用于约束两级交叉减少的快速简单的启发式算法"迈克尔福斯特。 连同我的问题下面的评论一起回答。再次感谢,@ j_random_hacker!