【问题标题】:Get all leafs in an adjacency list获取邻接列表中的所有叶子
【发布时间】: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


【解决方案1】:

您可以简化您的作品以提高效率:

leaves = set()
leaves.update(*graph.values())
leaves -= graph.keys()

【讨论】:

  • 您能解释一下这种方法吗?
  • 它遵循与您的算法相同的逻辑,但速度提高了 20% 左右。
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多