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