Python 获取邻接列表中的所有叶
给定如下结构:Python 获取邻接列表中的所有叶,python,python-3.x,algorithm,graph,adjacency-list,Python,Python 3.x,Algorithm,Graph,Adjacency List,给定如下结构: 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
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'}
这是正确的方法吗?还有什么其他方法可以确定某件东西是否是叶子?您可以简化您的作品,使其更有效:
leaves = set()
leaves.update(*graph.values())
leaves -= graph.keys()
您可以简化您的工作以提高效率:
leaves = set()
leaves.update(*graph.values())
leaves -= graph.keys()
这些算法在浏览器搜索中是否不可用?图论被很好地涵盖;我认为“图形算法查找所有叶节点”会显示您需要的内容;它只连接到另一个节点。然而,也许你正在使用一个隐含的定义,而这个定义并不适用。这些是有向边吗,您在哪里寻找终端节点?只有一个最终边缘的终端?如果不可能存在类似于
'c3':[]
,那么我认为您的答案是正确的。看起来您当前的方法是O(| V | ^2),例如,使用完整的图表。如果节点是自定义对象,则可以存储入站连接的数量,或者使用类似于weakref
@David542的内容。它是字典的一个键,可以像使用集合一样使用。Python使用,因此不需要是set
的实例,它就可以作为一个集合使用。dict_keys
对象支持设置操作,如-
、
、&
和^
。这些算法是否不适用于浏览器搜索?图论被很好地涵盖;我认为“图形算法查找所有叶节点”会显示您需要的内容;它只连接到另一个节点。然而,也许你正在使用一个隐含的定义,而这个定义并不适用。这些是有向边吗,您在哪里寻找终端节点?只有一个最终边缘的终端?如果不可能存在类似于'c3':[]
,那么我认为您的答案是正确的。看起来您当前的方法是O(| V | ^2),例如,使用完整的图表。如果节点是自定义对象,则可以存储入站连接的数量,或者使用类似于weakref
@David542的内容。它是字典的一个键,可以像使用集合一样使用。Python使用,因此不需要是set
的实例,它就可以作为一个集合使用。dict_keys
对象支持设置操作,如-
,
,&
和^
。您能解释一下这种方法吗?它遵循与您的算法相同的逻辑,但速度大约快20%。您能解释一下这种方法吗?它遵循与您的算法相同的逻辑,但速度大约快20%。