LCA的动态方法

时间:2015-03-01 11:09:15

标签: algorithm tree

我读LCA Tutorial 定义P [1,N] [1,logN],其中P [i] [j]是i的第2j个祖先

enter image description here

为什么使用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];

1 个答案:

答案 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

通过定义它,我们实现了一些重要的事情:

  1. 内存效率:由于矩阵为O(n * log n),因此使用的内存为{{1}};

  2. 时间效率:因为我们可以通过使用在每一步将问题大致分为2的重复来找到每个祖先,所以我们为每个查询提供了一个高效的对数解决方案。