【发布时间】:2012-11-21 20:07:05
【问题描述】:
我在一棵(非二叉树)树上有一组 n 个节点。我想找到任意两个节点之间的最大距离。 (我将两个节点之间的距离定义为这些节点与其最低共同祖先之间的距离之和)。
我可以在 O(n^2) 中轻松解决这个问题,只需计算每个节点与其他节点之间的距离并获得最大值,但是我希望有更好的东西,因为这对我来说太慢了*应用场景。
(补充信息:在我的应用场景中,这些节点实际上是文件,树是目录结构。因此,树很浅(深度 之间。实际上,我试图弄清楚我的文件在每组中的分布范围。)*
编辑:也许我可以问一个等效的问题来提示更多答案:考虑原始树的一个子集,它只包含我的集合中的节点以及连接它们所需的节点。那么问题就变成了:如何在无向无环图中找到最长的简单路径?
*编辑 2: 正如 didierc 指出的那样,我实际上应该考虑文件夹集而不是文件。这使我的集合更小,并且详尽的方法可能足够快。尽管如此,看到一个更快的解决方案还是有好处的,我很想知道是否有一个。
【问题讨论】:
-
如果您认为您只是比较文件夹而不是文件(因为它们中的许多共享同一个文件夹),您可以摆脱详尽的比较。也就是说,n其实就是文件夹的个数。
-
首先建立一个你的树的内存模型,以避免被IO限制。
-
@didierc 我确实有一个内存模型。关于节点是文件夹而不是文件的要点;在这种情况下,详尽的方法实际上可能足够快。不过,我仍然很好奇是否有更快的解决方案。
-
你想要距离还是“违规”节点?
-
@didierc 两者都有用。我认为找到距离会更简单,但是拥有“违规”节点可能同样有用。基本上,我只是尝试建立关于这些文件组的分布程度的指标。信息越多越好。