给定一棵树。如何在不使用大小为n * n的二维矩阵的情况下找到每对节点之间的距离。我知道O(n ^ 2)复杂度的解决方案。
给定一棵树。如何在不使用大小为n * n的二维矩阵的情况下找到每对节点之间的距离。我知道O(n ^ 2)复杂度的解决方案。
distance(u, v)
的查询,可以使用LCA技术。在根据树两个顶点的最近公共祖先(LCA)算法中,LCA是一个顶点,它是它们二者的祖先中最低的一个。有一种不太复杂的算法可以用n log n
的预处理时间以对数时间找到LCA(u, v)
。如果需要的话我可以描述一下。h[v]
是从v
到根的距离(可以为所有顶点在线性时间内预计算),则distance(u, v) = h[u] + h[v] - 2 * h[LCA(u, v)]
。正如我在评论中提到的,假设您的每一对顶点 v1,v2
在树中的输出应该是 (v1,v2,distance)
- 请注意,有 n*(n-1)
这样的顶点对。由于 n*(n-1)
属于 O(n^2)
- 而且它是输出的大小,因此不能比 O(n^2)
更好地完成,因此从大 O 表示法的角度来看,您的算法是最优的。