常用技巧 倍增

实际应用
原来曾经学过的ST表就运用到了倍增算法,如果我当初先学习了倍增算法再学ST表,应该会更理解一些。

Tarjan算法是解决离线LCA的高效算法,不过如果LCA要求强制在线,我们也可以用倍增算法去解决。

个人理解
个人认为倍增算是一种技巧/思想,没有什么具体的模板(就像贪心一样),代码具体如何还是要根据现实情况决定。

举例
这里用一个例子大概描述一下倍增算法的思路

假设现在我们有100个格子,分别标为1、2 ……、99、100
如果我们想知道任意一个格子到另一个格子要走多少步,我们可以进行预处理。
对于格子1,记录它到其他99个格子分别要走多少步,
对于格子2,记录它到其他98个格子分别要走多少步,
……
然后就这样,一共记录了5050个数据。
如果格子的数目再稍微大一些,比如说一共有10000个格子,那么我们要预处理的数据一共就有50005000条,时间效率比较低,容易超时。

如果我们用倍增的想法来记录,情况会好很多:
对于格子1,记录它走1步、2步、4步、8步到了哪个格子,
对于格子2,记录它走1步、2步、4步、8步到了哪个格子,
……
然后就这样,一共记录了317条数据(大概),记录的数据量少了不少。
当我们的格子一共有10000个时,数据量为77187(大概),比上面的少了不少。
而且我们这样记录数据,也能够解决我们想要解决的问题(任意一个格子到另一个格子要走多少步?),预处理的时间效率也提高了,变成了O(nlogn)。

当然,查询的时候就不再是O(1)了。

参考来源

博客–白话系列–倍增算法,完全没有学过倍增的可以看这篇文章启蒙。
https://blog.csdn.net/jarjingx/article/details/8180560
博客–初级倍增算法, 不错的一篇文章。
https://blog.csdn.net/MikeJackSTG/article/details/81806120
博客(LCA)
https://blog.csdn.net/ouqingliang/article/details/74926229

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值