其他分享
首页 > 其他分享> > 分 块 套 娃

分 块 套 娃

作者:互联网

众所周知, 如果我们用正常的分块做单点加区间求和, 时间复杂度高达 \(O(1)-O(n^{1/2})\) (修改-询问).

然后你发现这太慢了. 于是你考虑改一下分块的大小.
我们更改块的大小为 \(n^{2/3}\), 整块的复杂度成功变成了 \(O(n^{1/3})\)!
但是散块的复杂度变成了 \(O(n^{2/3})\), 成功劣化.
于是你考虑套娃, 对每个块再套用正常的分块, 块的大小是 \(n^{1/3}\).
于是时间复杂度就神奇地变成了 \(O(1)-O(n^{1/3})\)!

继续套娃.
分块大小改为 \(O(n^{3/4})\), 这样整块的复杂度就是 \(O(n^{1/4})\), 然后考虑使用刚刚得出的算法, 散块也是 \(O(n^{1/4})\)!

以此类推, 只要我们分 \(k\) 层, 我们就得到了 \(O(k)-O(n^{1/k})\) 的算法, 我们取一个 \(k\) 使得 \(k=n^{1/k}\), 容易发现 \(k\) 小于 \(\log n\), 我们取得了比线段树还优秀的时间复杂度!

这样分析太大意了. 实际上, 随着层数的增长, 查询时散块带来的常数会指数级增长, 然后这个算法就寄掉了.

但是 \(O(1)-O(n^{1/3})\) 算法是可以试试的(

另外这种奇怪的思路可以被应用到二维分块中 (不会qaq), 我第一次看到是在 这里.

标签:,套娃,分块,复杂度,算法,大小,散块
来源: https://www.cnblogs.com/pjykk/p/16583952.html