如果你知道分块的时间复杂度是
O(n√)
,请忽略这篇博文。
如果你并不关心是怎么证明出来的,请忽略这篇博文。
如果你是神犇,请务必忽略这篇博文。
以下证明又是在数学课上瞎想,如果有误欢迎提出……
(数学老师我错了......)
1、规定符号
n
:序列的长度;
y
:查询或修改时,需要操作的零散区间中元素个数;
通过符号规定,可以看出一定有:
SC=n,x≤S,y<2C
。
2、目的
通过分块,统一维护块内元素,查询时可以快速取出整块内答案,再与零散区间合并,达到降低时间复杂度的目的。(这种元素需满足区间加法维护的性质)。
因此,需要最小化修改与查询次数。即最小化
x+y
的值。
3、证明
① 当最差情况下时,操作的区间为
[2,n−1]
,此时需要查询
S−2
个块和
2C−2
个元素,即
x=S−2,y=2C−2
。
x+y=S−2+2C−2=S+2C−4
。忽略常数,得
x+y=S+C
。
因
SC=n
,则
C=nS
。
代入,得
x+y=S+nS≥2∗S∗nS−−−−−√=2n√
当且仅当
S=nS
,即
S=n√
时,等号成立。
所以在最坏时,时间复杂度为
O(n√)
。常数不超过
3
。
② 在一般情况下时,可以得出
移项,得
x=L−yC
。
因
0<L≤n,0<y<2C
,则
0<L−y<n−2C
。
因
C>0
,则
L−yC<n−2CC=SC−2CC=S−2<S
故
x+y<S+2C
,忽略常数,
x+y<S+C
。
因
SC=n
,
S+C≥2SC−−−√=2n√
。
当且仅当
S=C
,即
S=C=n√
时,等号成立。
此时
x+y<2n√
。
综上,分块的时间复杂度为
O(n√)
,常数不超过
3
。证毕。
分块中,
[XJB研究] [分块] 关于分块时间复杂度的证明
最新推荐文章于 2024-04-23 15:23:45 发布