当元素彼此具有多个关系时如何对集合进行排序

时间:2016-04-22 13:38:22

标签: arrays algorithm sorting set

我正在寻找一种算法,当元素之间的关系互相矛盾时,可以执行某种扩展数组排序。

所以我们有一套(项目) n i1 ...

中的项目之间定义了 R (关系) m 关系

这些关系可以相互矛盾,例如,一个关系表示A>B而另一个表示A<B

e.g。

r1:i1<i35

r2:i100<i4

...

rm:i45>i3

通常, r m (集合的大小)可以是任何正整数。

任务是对进行排序,以便项目以这样的方式进行:优选较低的(基于关系)在较高的...之前...

我正在寻找一种算法,它会对集合进行排序,使其尽可能接近“最佳”顺序。我想必须有一个众所周知的算法来解决这样的问题。

谢谢!

1 个答案:

答案 0 :(得分:5)

我认为衡量特定排序质量的最明智方法是它违反的给定关系的数量。如果您决定使用此度量,则问题等同于(Minimum) Feedback Arc Set。不幸的是,这个问题是NP难的,所以不可能存在有效的(多项式时间)算法。

在反馈弧集问题中,您将获得一个有向图,并要求查找最小尺寸的边集,如果删除这些边,则会破坏图中的所有周期。

要了解这与您的问题的对应关系,请注意我们可以将每个项目表示为图形中的顶点,并将每个关系表示为两个顶点之间的有向边(指向较小的顶点)。当且仅当此图中存在循环时才会发生冲突 - 也就是说,如果存在2个或更多不同顶点v_1,v_2,...,v_k的有序列表,则v_i&lt; v_(i + 1)对于所有i&lt; k,还有v_k&lt; V_1。在不违反至少一个约束的情况下,不可能对这些k个顶点进行排序。相反,如果没有循环 - 也就是说,如果图表是directed acyclic graph - 则topological sort可以快速(在线性时间内)找到违反任何约束的有效订单。因此,反馈弧集的大小是您需要移除的最小边数,以便获得可以在不违反任何约束的情况下进行排序的图形 - 或者等效地,在<中必须违反的最小边数em>任何订购。