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

时间:2018-09-25 14:09:41

标签: python algorithm

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

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

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

插图:

Visualisation

输入:

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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)