给定一组关系,计算有序集的最有效算法是什么

时间:2014-05-14 23:58:11

标签: algorithm sorting

   c > b
   d > b
   a > d
   c > a

鉴于这种传递关系,计算所有这些关系的最有效算法是什么?

2 个答案:

答案 0 :(得分:1)

构建图表,并使用topological sort按排序顺序检索节点。

如果使用am邻接列表表示和图表顶点的哈希映射,则总时间将为O(N),其中N是您拥有的关系数。构建图表与您拥有的关系数量成线性关系。拓扑排序为O(| V | + | E |),其中| V |是顶点数,| E |是边数。边数等于关系数,即NV的上限为2*N,因此我们有O(3 * N),即O (N)。

答案 1 :(得分:1)

您在案例中实际描述的是拓扑排序问题:http://en.wikipedia.org/wiki/Topological_sorting

除了图表,您还有字母的排序。每个字母代表一个节点,每个比较运算符代表一个有向边。用于计算成对排序的拓扑排序的标准算法如下:

L ← Empty list that will contain the sorted elements
S ← Set of all nodes with no incoming edges
while S is non-empty do
    remove a node n from S
    add n to tail of L
    for each node m with an edge e from n to m do
        remove edge e from the graph
        if m has no other incoming edges then
            insert m into S
if graph has edges then
    return error (graph has at least one cycle)
else 
    return L (a topologically sorted order)

请记住,为了找到订单,可能没有周期。即:

a < b //This
b < c //contains
c < a //a cycle!

这称为DAG。有向无环图。请参阅:http://en.wikipedia.org/wiki/Directed_acyclic_graph

以下是如何在Python中执行此操作的示例:Topological sort python