倍增算法基本概述
倍增算法,顾名思义,就是不断地翻倍。
倍增算法是一种优化算法,通常应用于某些需要高效计算指数幂的场景.
例子1:
假设我们是小兔子我们回到家需要走13m的路程才能回到家.
如果我们每次只跳1m的路程的话,我们需要跳13下才能回到家,也就是说我们需要循环13次.
但是如果我们每次多跳一些这样就大大的减少了我们循环的次数.根本不需要跳那么多次,只需要[]([]向下取整)
得出结论就是:只需要的预处理.
例子2:
假设再次我们回到家需要走m才能回到家,那我们不可能跳次吧,那岂不是很久都回不了家.
根据第一个例子我们只需要预处理次
处理方法:
假设我们设a[i][j]为从起点 i 跳到 步后回到家,b[i][j]则表示从起点 i 跳到 步走的路程.
则有式子:
a[i][j]=a[a[i][j-1]][j-1]
b[i][j]=b[i][j-1]+b[a[i][j-1]][j-1]
现在,我们来举个例子:
让我们假设起点到终点的距离是100米。假设我们要从起点跳到终点 a[0][3],其中 a[0][3] 表示从起点 0 跳到 2^3 = 8 步后回到家的位置。
1.首先,我们先跳到位置a[0][2],也就是从起点0跳到2^2=4步后的位置.
2.然后,我们在跳2^(3-1)=2^2=4步就能回到家
所以,我们先跳到 a[0][2] 的位置,然后再跳 4 步,就能回到家。这样我们确实可以使用 a[0][3] = a[a[0][2]][2] 的方式来计算从起点跳到终点的位置。
所以得出:a[i][j]=a[a[i][j-1]][j-1]
让我们使用相同的例子来解释为什么 b[i][j] = b[i][j-1] + b[a[i][j-1]][j-1]。
假设我们要从起点跳到终点 a[0][3],其中 a[0][3] 表示从起点 0 跳到 2^3 = 8 步后回到家的位置。
首先,我们需要理解 b[i][j] 的含义。b[i][j] 表示从起点 i 跳到 2^j 步所经过的总路程。
现在,我们来分解 b[i][3]:
1.首先,我们需要跳到 a[i][2] 的位置,也就是从起点 i 跳到 2^2 = 4 步后的位置。这段路程的距离是 b[i][2]。
2.然后,我们再从 a[i][2] 跳到家的位置。这段路程的距离是 b[a[i][2]][2]。
因此,b[i][3] = b[i][2] + b[a[i][2]][2]。也就是说,从起点 i 跳到 2^3 步所经过的总路程等于从起点 i 跳到 2^2 步所经过的总路程再加上从 a[i][2] 跳到家的距离。
所以得出:b[i][j]=b[i][j-1]+b[a[i][j-1]][j-1]