【发布时间】:2009-06-02 21:26:31
【问题描述】:
Wikipedia: Directed Acyclic Graph
不确定叶节点是否仍然是正确的术语,因为它不是真正的树(每个节点可以有多个子节点,也可以有多个父节点),而且我实际上正在尝试找到所有根节点(这实际上只是一个问题语义,如果你反转所有边的方向,它们将是叶节点)。
现在我们只是遍历整个图(可以从指定的节点访问),但这会变得有些昂贵,所以我想知道是否有更好的算法来执行此操作。我在想的一件事是我们跟踪已经访问过的节点(在遍历不同的路径时)并且不重新检查这些节点。
还有其他算法优化吗?
我们还考虑过保留一个该节点是其后代的根节点的列表,但是如果我们需要在每次添加节点时检查它是否会发生变化,那么维护这样一个列表似乎也会相当昂贵,移动或移除。
编辑:
这不仅仅是查找单个节点,而是查找作为端点的所有节点。
也没有节点的主列表。每个节点都有一个它的子节点和它的父节点的列表。 (嗯,这并不完全正确,但提前从数据库中提取数百万个节点的成本非常高,并且可能会导致 OutOfMemory 异常)
编辑2:
可能会或可能不会更改可能的解决方案,但该图是最底层的,因为最多有几十个根节点(我正在尝试查找)和数百万(可能是数千万或数亿)叶节点(我从哪里开始)。
【问题讨论】:
-
一个 DAG 可以有叶节点。叶节点只是一个没有扇出的节点。
标签: algorithm optimization graph directed-acyclic-graphs