我有一个有数百万个顶点和边的有向图。给出了一组顶点,假设它们被称为“START_POINTS”。还给出了另一组称为“END_POINTS”的顶点。问题是找出可以从哪个START_POINTS 到达哪个END_POINTS。
这是一个例子:
START_POINTS: S1 S2 S3 S4 S5 S6 S7 ...
END_POINTS : E1 E2 E3 E4 E5 E6 E7 ...
该算法应该能够说明以下内容:
S1 can reach to E1, E2, E6
S2 can reach to E9, E10
S3 cannot reach any END_POINT
S4 can reach to .....
....
某些 END_POINTS 可能无法从任何 START_POINT 到达。
现在,问题是:实现它的最有效方法是什么?
我尝试从每个 START_POINT 开始,并使用深度优先搜索(或 BFS,它确实会大大改变运行时间)找到可到达的 END_POINTS。但是,这需要很多时间,因为START_POINTS 太多(END_POINTS 也很多)。
可以优化搜索,因为 START_POINTS 的跟踪路径之间存在巨大重叠。需要记住哪些路径可以到达哪些 END_POINTS。实现这一目标的最有效方法是什么?这可能是众所周知的问题,但我还没有找到解决方案。
1月6日编辑:
我尝试实现 highBandWidth 的想法(以类似于 Keith Randall 提出的方式):对于每个节点,如果该节点不是 START 或 END 点,则将所有输入连接到输出,然后删除该节点。
foreach NODE in NODES
Skip if NODE is START_POINT or END_POINT
foreach OUTPUT_NODE of NODE
Disconnect NODE from INPUT_NODE
end
foreach INPUT_NODE of NODE
Disconnect NODE from INPUT_NODE
foreach OUTPUT_NODE of NODE
Connect INPUT_NODE to OUTPUT_NODE
end
end
Remove NODE from NODES
end
这开始非常快,很快变得非常慢,主要是因为剩余节点的输入/输出计数变得非常大并且嵌套的 for 循环会降低性能。知道如何提高效率吗?