倍增原理
Posted hhyx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了倍增原理相关的知识,希望对你有一定的参考价值。
1) 递推的时候,如果状态空间很大线性递推无法满足时间和空间复杂度的要求,可以通过成倍增长的方式。
2) 二进制划分来进行递推,任意整数可以表示成若干个2的次幂项的和,使用求出的代表值拼成需要的
3) 递推求解的问题的状态空间必须关于2的次幂具有划分性
经典问题模型:
长度为n的序列,m次询问,每次给定一个t,求出最大的下标k使得从1到k的和小于t,也就是区间最值问题
朴素做法:
枚举k,每次询问最坏的情况为O(n)
二分:
用O(n)时间预处理a数组的前缀和,二分k的位置,每次询问都是O(logn)
倍增做法:
1) 令p=0,k=0,sum=0
2) 比较A数组中 k 之后的 p 个数的和与t的关系,
如果sum + s[k + p]-s[ k ]<t,令sum+=s[k + p] - s[k],k += p,p *= 2
就是累加上p个数的和,然后把p的跨度增长一倍,
如果sum+s[k+p]-s[k] > t,令p/=2
3) 重复2,直到p为0
以上是关于倍增原理的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB · 特性分析 · MMAPv1 存储引擎原理
洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)