首页 > 学院 > 开发设计 > 正文

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

2019-11-08 20:03:33
字体:
来源:转载
供稿:网友

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表