[XJB研究] [分块] 关于分块时间复杂度的证明

如果你知道分块的时间复杂度是 O(n) ,请忽略这篇博文。
如果你并不关心是怎么证明出来的,请忽略这篇博文。
如果你是神犇,请务必忽略这篇博文。
以下证明又是在数学课上瞎想,如果有误欢迎提出……
(数学老师我错了......)
1、规定符号
n :序列的长度;
S:将这个序列分成 S 块;
C:分成的每个块内有 C 个元素;
x:查询或修改时,需要操作的整块数;
y :查询或修改时,需要操作的零散区间中元素个数;
L:查询或修改时,操作序列的长度。
通过符号规定,可以看出一定有: SC=nxSy<2C
2、目的
通过分块,统一维护块内元素,查询时可以快速取出整块内答案,再与零散区间合并,达到降低时间复杂度的目的。(这种元素需满足区间加法维护的性质)。
因此,需要最小化修改与查询次数。即最小化 x+y 的值。
3、证明
① 当最差情况下时,操作的区间为 [2,n1] ,此时需要查询 S2 个块和 2C2 个元素,即 x=S2,y=2C2
x+y=S2+2C2=S+2C4 。忽略常数,得 x+y=S+C
SC=n ,则 C=nS
代入,得
x+y=S+nS2SnS=2n
当且仅当 S=nS ,即 S=n 时,等号成立。
所以在最坏时,时间复杂度为 O(n) 。常数不超过 3
② 在一般情况下时,可以得出L=xC+y
移项,得 x=LyC
0<Ln,0<y<2C ,则 0<Ly<n2C
C>0 ,则 LyC<n2CC=SC2CC=S2<S
x+y<S+2C ,忽略常数, x+y<S+C
SC=n S+C2SC=2n
当且仅当 S=C ,即 S=C=n 时,等号成立。
此时 x+y<2n
综上,分块的时间复杂度为 O(n) ,常数不超过 3 。证毕。
分块中,S C 的取值可以任意,只是当S=C=n时,时间复杂度最优。在有些JOI题目中(如[BZOJ4241] 历史研究)使用的 S C不是最优的,但是也可以A掉这种题。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值