我读LCA Tutorial 定义P [1,N] [1,logN],其中P [i] [j]是i的第2j个祖先
为什么使用logN 和为什么使用2j祖先?我不理解它的直觉?
我无法理解最后一步:
//we compute LCA(p, q) using the values in P
for (i = log; i >= 0; i--)
if (P[p][i] != -1 && P[p][i] != P[q][i])
p = P[p][i], q = P[q][i];
return T[p];
答案 0 :(得分:2)
如果P[i, j] = 2^j-th ancestor of i
,则:
P[P[i, j - 1], j - 1]
2^(j - 1)-th
2^(j - 1)-th
祖先的i
祖先是2^(j - 1) + 2^(j - 1) = 2*2^(j - 1) = 2^j
。我们有:
n x log n
通过定义它,我们实现了一些重要的事情:
内存效率:由于矩阵为O(n * log n)
,因此使用的内存为{{1}};
时间效率:因为我们可以通过使用在每一步将问题大致分为2的重复来找到每个祖先,所以我们为每个查询提供了一个高效的对数解决方案。