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%。