算法基础 倍增算法

倍增算法基本概述

倍增算法,顾名思义,就是不断地翻倍。

倍增算法是一种优化算法,通常应用于某些需要高效计算指数幂的场景.

 例子1:

假设我们是小兔子我们回到家需要走13m的路程才能回到家.

如果我们每次只跳1m的路程的话,我们需要跳13下才能回到家,也就是说我们需要循环13次.

但是如果我们每次多跳一些13=8+4+1=2^{_{3}}+2^{_{2}}+2^{_{0}}这样就大大的减少了我们循环的次数.根本不需要跳那么多次,只需要[log_{2}n]([]向下取整)

得出结论就是:只需要log_{2}n的预处理.

例子2:

假设再次我们回到家需要走10^{_{18}}m才能回到家,那我们不可能跳10^{_{18}}次吧,那岂不是很久都回不了家.

根据第一个例子我们只需要预处理log_{2}10^{18}

处理方法:

假设我们设a[i][j]为从起点 i 跳到 2^{^{j}} 步后回到家,b[i][j]则表示从起点 i 跳到 2^{^{j}} 步走的路程.

则有式子:

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]

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值