【发布时间】:2020-02-01 00:27:43
【问题描述】:
给定如下结构:
graph = {
# c1 is root node, graph is directed, c1 is source/root node
'c1': ['c2', 'c3'],
'c2': ['c4']
}
c1
/\
/ \
c2 c3
/
/
c4
在图上找到所有叶子的通用算法是什么?我的第一个想法是:
# values in the 'from' section, that don't have a 'to' entry
set(itertools.chain(*graph.values())) - set(graph.keys())
# {'c3', 'c4'}
这是正确的方法吗?还有什么其他方法可以确定某物是否是叶子?
【问题讨论】:
-
这些算法在浏览器搜索中是不是很容易获得?图论覆盖得很好;我认为“图算法找到所有叶节点”会满足您的需求。
-
我相信
c1也是一片叶子;它只连接到另一个节点。但是,也许您正在使用不成立的隐含定义。这些有向边是您在寻找终端节点的地方吗?只有一个最终边缘的终端? -
如果没有机会存在像
'c3' : []这样的东西,那么你的答案对我来说似乎是正确的。 -
看起来您当前的方法是 O(|V|^2),例如取一个完整的图表。如果节点是自定义对象,您可以存储入站连接数或使用
weakref之类的内容。 -
@David542 是字典的keys的view,可以当作一个集合来使用。 Python 使用duck typing,因此某些东西不需要是
set的实例就可以作为一个集合使用。dict_keys对象支持集合操作,如-、|、&和^。
标签: python python-3.x algorithm graph adjacency-list