一. 前言
众所周知,数列分块和莫队是非常优雅的暴力算法。
那么,我们如何分才能使时间复杂度最优呢?
请看以下证明。
二. 数列分块
数列分块的最佳大小为 n \sqrt{n} n
设 n n n 与 m m m 同一数量级。
设块长为 s s s , 序列长度 n n n 那么块的总数为 n s \frac{n}{s} sn,每次操作时间复杂度为 O ( n ⋅ s ) O(n⋅s) O(n⋅s)。
= s ⋅ n s ⋅ s =s⋅\frac{n}{s}⋅s =s⋅sn⋅s
= s 2 ⋅ n s =s^2⋅\frac{n}{s} =s2⋅sn
我们要使该数尽量小,根据小学二年级的数学知识可得:
当且仅当 n s = s \frac{n}{s}=s sn=s时, s 2 ⋅ n s s^2⋅\frac{n}{s}