码迷,mamicode.com
首页 > 其他好文 > 详细

倍增原理

时间:2020-03-07 09:33:08      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:需要   时间   长度   空间复杂度   模型   +=   sum   前缀   重复   

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

倍增原理

标签:需要   时间   长度   空间复杂度   模型   +=   sum   前缀   重复   

原文地址:https://www.cnblogs.com/hhyx/p/12432189.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!