不确定叶节点是否仍然是合适的术语,因为它不是树(每个节点可以有多个子节点,也可以有多个父节点),而且我实际上正在尝试找到所有根节点(这实际上只是一个语义问题,如果你反转所有边的方向,它们将成为叶节点)。
现在我们只是遍历整个图(从指定节点可达的部分),但这证明是相当昂贵的,所以我想知道是否有更好的算法来做这件事。一个想法是我们记住已经访问过的节点(在遍历不同路径时)并且不再重复检查它们。
还有其他算法优化吗?
我们还考虑过保留此节点是后代的根节点列表,但似乎如果需要检查每次添加、移动或删除节点时是否更改了这样的列表,维护这样的列表也会相当昂贵。
编辑:
这不仅仅是找到单个节点,而是找到所有端点节点。
此外,没有节点的主列表。每个节点都有其子节点和父节点的列表。 (嗯,这并不完全正确,但是从DB中提取数百万个节点的存储开销非常昂贵,并且可能会导致OutOfMemory异常)
编辑2:
也许会改变可能的解决方案,但该图形具有底部重量级,即最多有几十个根节点(我正在寻找这些节点),以及一些数百万(可能是数十亿或数亿)的叶节点(我从哪里开始)。