实际应用
原来曾经学过的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

被折叠的 条评论
为什么被折叠?



