我正在使用带有路径压缩的 Lengauer 和 Tarjan 算法来计算具有数百万个节点的图的支配树。该算法非常复杂,我不得不承认我没有花时间完全理解它,我只是在使用它。现在我需要计算根节点的直接子节点的支配树,并可能将图形向下递归到某个深度,重复此操作。即,当我为根节点的子节点计算支配树时,我想假装根节点已从图中删除。
我的问题是,是否有一个有效的解决方案,利用已经在初始支配树中为根节点计算的直接支配信息?换句话说,我不想为每个孩子从头开始,因为整个过程非常耗时。
天真地看起来这一定是可能的,因为在图表的深处会有很多节点,它们的 idms 就在它们上方一点点,并且不受图表顶部的变化的影响。
顺便说一句:支配树的主题由编译器人员“拥有”并且在经典图论书籍中没有提到它,这很奇怪。我使用它的应用程序——我的 FindRoots java 堆分析器——与编译器理论无关。
澄清:我在这里谈论有向图。我指的“根”实际上是可达性最大的节点。我已经更新了上面的文本,用“graph”替换了对“tree”的引用。我倾向于将它们视为树木,因为形状主要是树状。该图实际上是 Java 堆中的对象,并且您可以想象它是合理的层次结构。我发现支配树在进行 OOM 泄漏分析时很有用,因为您感兴趣的是“是什么让这个对象保持活力?” 答案最终是它的支配者。支配树可以让你<ahem>看到树林而不是树木。但有时很多垃圾会漂浮到树顶,所以你有一个根,下面有成千上万个孩子。对于这种情况,我想尝试计算以根的每个直接子节点(在原始图中)为根的支配树,然后可能会向下一层等等。(我暂时不担心反向链接的可能性:)