倍增
倍增是一个运用广泛的算法,他博大精深
什么是倍增
倍增,意思是成倍的增加增长,成倍地增长
这是废话,没什么用,但是这对于之后的学习还是有点启发作用的
前序
现在假设你在A点,你需要前往B点去见你的妹子
你需要尽快的时间到达B点,以求跟妹子待得时间更长,于是你求教了一些人
A:泡什么妹子,还不如回家打摆(搞颓),88不理你了,回家打游戏去
B:泡妹子要有恒心,要一步一个脚印,踏踏实实,所以要一步一步的走,总会走到
C:既然要快,直接"飞"到B啊,管那么多干什么?泡妹子要快,下手要早,那么啰嗦干什么?你只要在之前踩点就好了,这样子你就可以在妹子需要你的时候第一时间到达目的地(例如"一个省会"就是这么做的)
dalao:前面都是假的,不要信这些人的,这都是错的,我来举一些反例
A:你这样子泡不到妹子的
B:如果妹子距离你很远的话,要么是你累死在路上了,要么是妹子等的不耐烦了,走了,不管怎么样你都泡不到妹子
c:如果你喜欢的妹子多怎么办?还踩点,脑子够用吗,记不住啊?
所以啊,还是要听我的。
你只需要会倍增,你就可以事倍工log。所以啊还是要学倍增
倍增算法
现在来正式讲一讲倍增。
假如你在A点,你只需要踩点是记录下2^n就好了,这样子你就可以很快的到达目的地了,那么应该怎么跳呢?
当然是从大往小跳啊,如果能跳就跳,不能跳就不跳
eg:
假设A到B的长度是26;
首先你先处理最长的要跳多少步,现在假设最长要跳32步,于是我们从32开始枚举
枚举到要跳多少步 | 能否跳 | 跳完剩余几步 |
---|---|---|
32 | NO | 26 |
16 | YES | 10 |
8 | YES | 2 |
4 | NO | 2 |
2 | YES | 0 |
0 | YES | 0 |
好了,这就结束了,我们发现我们只需要枚举6次,而暴力跳却需要26次,所以这个算法的效率十分的高 |
ps:
1. 为什么不可以从小往大枚举呢?
我们来看看一个例子如:5,5=4+1,而从小往大枚举的话会多出一个2,这是还需要回溯,十分麻烦,而从大往小枚举就避免了这种情况。
2. 为什么不可以重复选呢?因为如果你可以重复选的话,你为什么不选这个数的两倍呢?
好了,这个算法就讲到这里了,接下来是后续
后续
所以说学好算法对泡妹子也是很有帮助的