繁体   English   中英

计算有向图每个节点的级别的最快方法是什么?

[英]What is the fastest way to compute the levels of each node of a directed graph?

给定一个由两个各自节点和链接的列表表示的层次图,找到所有节点级别的最佳解决方案是什么?

以下节点的名称纯粹是虚构的,不会被排序。 请注意,源节点应该很容易找到,因为它是唯一一个没有父节点的节点。

如果发生特殊情况(如多个级别),则仅返回最大级别。

插图:

可视化

输入:

g = Graph()
g.addNodes([0, 1, 2, 3, 4, 5, 6, 7])
g.addLink(0, 1)
g.addLink(0, 2)
g.addLink(1, 3)
g.addLink(1, 4)
g.addLink(1, 5)
g.addLink(2, 6)
g.addLink(6, 7)
getLevels(g.nodes, g.links)

输出:

#Node : Level
0 : 0
1 : 1
2 : 1
3 : 2
4 : 2
5 : 2
6 : 2
7 : 3

从您谈论它的方式来看,听起来您想要的是树而不是图。 否则,您实际上不是在编写“级别”算法,而是在编写“到节点的距离”算法。 树木可以有层次,您需要的是图表上两个节点之间的最远距离。

如果您打算自己编写代码,则基本上可以执行广度优先搜索类型算法,在该算法中,您将源节点(在本例中为0)弄清楚与其链接的内容。 如果要返回映射,则将等于这些节点的键设置为1,然后将值设置为1。然后查找到这些链接的下一个链接(不包括先前的节点),遍历这些链接,然后将值保存到映射中,但现在的值为2。 循环直到您不再有孩子。 如果使用树来执行此操作,则可以删除检查以排除先前的节点。

根据树的表示,您需要某种机制来枚举节点的子代。 然后使用类似

TellLevels(Root, Level):
    Say "The node ", Root.Id, " has level ", Level
    for Son= FirstSon(Root) to LastSon(Root)
        TellLevels(Son, Level + 1)

并用

TellLevels(Root, 0)

仅在图具有树形拓扑时才有效。


避免骑自行车:

TellLevels(Root, Level):
    Root.Visited= true
    Say "The node ", Root.Id, " has level ", Level
    for Son= FirstSon(Root) to LastSon(Root)
        if not Son.Visited
            TellLevels(Son, Level + 1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM