我有一个表示图的python字典。我希望确定根/独立节点,以便我可以同时处理它们,然后下一个节点将成为根/独立节点。 我对如何在python中实现此技术感到困惑。
下面是一个示例词典:
my_graph = {
1:[4],
2:[6],
3:[9],
4:[5,7],
5:[8],
6:[],
7:[],
8:[],
9:[]
}
我将过程分为不同的框架。取决于上述字典的预期结果为:
1-开始: 根/独立节点为= 1,2,3
2-在第1帧之后 根/独立节点为= 4,6,9
3-第2帧之后 根/独立节点= 5,7
第3帧之后的4- 根/独立节点为= 8
编辑1: 我正在尝试以任何形式获取序列,例如给定字典中节点的依赖关系图的列表,数组或任何其他类似的数据结构,其中每个子节点都依赖于其父节点,因此无法在父节点之前进行处理。下一步,我希望获得一些并行性,即可以一次处理所有根节点。
答案 0 :(得分:2)
这称为“拓扑排序”。一个简单的算法是
如果图形不是树(有循环),则可能在完成之前停下来。在这种情况下,您将到达图形不为空但没有可用根的点。
以您的情况
def tsort(graph):
counts = dict((k, 0) for k in graph)
for n, neighbors in graph.items():
for nh in neighbors:
counts[nh] = counts[nh] + 1
while graph:
roots = [k for k in graph if counts[k] == 0]
if not roots:
raise RuntimeError("Cycles present, no topological sort possible")
print("roots", roots)
for r in roots:
print("Processing", r)
for nh in graph[r]:
counts[nh] -= 1
del graph[r]
答案 1 :(得分:1)
想要执行Topological Sort的声音
您可以使用库toposort为您进行繁重的工作,它将确定依赖关系和处理节点的顺序:
import toposort
my_graph = {
1:[4],
2:[6],
3:[9],
4:[5,7],
5:[8],
6:[],
7:[],
8:[],
9:[]
}
# change values to sets (required by toposort)
for key, value in my_graph.items():
my_graph[key] = set(value)
result = toposort.toposort(my_graph)
print(list(result))
[{6,7,8,9},{2,3,5},{4},{1}]
答案 2 :(得分:0)
容易得多:
while d: #'d' is a dictionary
roots = set(d).difference(*d.values())
print(roots)
[d.pop(k) for k in roots]
或以递归方式:
def traverse(d):
if d:
roots = set(d).difference(*d.values())
print(roots)
[d.pop(k) for k in roots]
return traverse(d)
两种方法均可打印:
set([1, 2, 3])
set([4, 6, 9])
set([5, 7])
set([8])