从有序集中查找包含图

时间:2019-03-25 15:47:58

标签: algorithm graph

比方说,我有一组元素和它们之间的顺序关系(不是总计)。

为简单起见,假设其包含包含在内的1D细分。

从细分的原始列表中,如何建立直接包含的图表(如果有可能的话):

enter image description here

从黑色部分开始,如何重建红色图表?

我在C#中有一个O(n^3)解决方案,这非常难看,我想知道是否还有更好的[伪代码]:

interface INode
{
    bool Includes(INode other);
    List<INode> Childs { get; set; }
}

class Graph
{
    public INode Root { get; set; }
}

class GraphBuilder
{
    public static Graph Build(IList<INode> nodes)
    {
        Graph result = new Graph();
        foreach (var segment in nodes) {
            segment.Childs = new List<INode>();
            bool isRoot = true;
            foreach (var segment2 in nodes)
            {
                if (segment2.Includes(segment))
                {
                    isRoot = false;
                }
                if (segment.Includes(segment2))
                {
                    bool isDirectChild = true;

                    foreach (var segment3 in nodes)
                    {
                        if (segment.Includes(segment3) && segment3.Includes(segment2))
                            isDirectChild = false;
                        break;
                    }
                    if (isDirectChild)
                        segment.Childs.Add(segment2);
                }
            }
            if (isRoot)
            {
                result.Root = segment;
            }
        }

        return result;
    }
}

1 个答案:

答案 0 :(得分:2)

首先使用Kahn's algorithm之类的高效算法在O(V+E)时对DAG进行拓扑排序。

对于每个元素,仅构造从其自身到与原始DAG相比最小的箭头(按拓扑顺序)。解决这些问题还需要时间O(V+E)

这是时间O(V+E)中的红色图表。

请注意,仅读取DAG会花费时间O(V+E),因此,在一定程度上,这是您可能会做的最好的事情。