树中每对节点之间的距离

时间:2013-08-06 12:57:45

标签: algorithm data-structures tree

给一棵树。如何在不使用大小为n * n的2D矩阵的情况下找到树中每对节点之间的距离。我知道O(n ^ 2)复杂度的解决方案。

2 个答案:

答案 0 :(得分:8)

如果您希望能够通过快速预处理快速回答distance(u, v)形式的查询,则可以使用LCA。有根树中两个顶点的LCA或最低共同祖先是一个顶点,它是两个顶点的祖先,并且是所有共同祖先中最低的顶点。在LCA(u, v)预处理时间的对数时间内找到n log n的算法并不是很复杂。如果需要,我可以描述它。

因此,您的问题可能会解决如下问题。首先,修复树的根。然后进行上述预处理以便能够找到LCA。然后,假设h[v]是从v到根的距离(可以在所有顶点的线性时间内预先计算),然后distance(u, v) = h[u] + h[v] - 2 * h[LCA(u, v)]

答案 1 :(得分:2)

正如我在评论中已经提到的,假设树中每对顶点(v1,v2,distance)的输出应为v1,v2 - 请注意,这些顶点有n*(n-1)对。由于n*(n-1)位于O(n^2) - 并且它是输出的大小,它不能比O(n^2) 更好,因此您的算法是最佳的,就其而言大O符号。

相关问题