其他分享
首页 > 其他分享> > 有助于复杂度分析的一些小技巧

有助于复杂度分析的一些小技巧

作者:互联网

有助于复杂度分析的一些小技巧

本文考虑一个严格大于等于的上界,然后加以感性分析。本文仅考虑最坏情况并忽略可忽略的常数。

按单元分析

也许你可以弄一些什么高级的东西去弄,但是既然是技巧就是简单点的东西。

你可以考虑每个点最多提供多少的复杂度贡献,然后累计分析。

例1:分析线段树合并的空间复杂度,如果我们对于每个点的线段树都进行一次单点操作,每次都最多新建 \(\log n\) 个点,于是最坏空间复杂度 \(n\log n\)。

按照不断趋向分析

有一个终止条件,如果每次操作都至少向终止条件走一步,那么最坏复杂度就是起始条件到终止条件的步数。

一个典型例子是双指针向中间逼近,总共之会走 \(n\) 步,复杂度 \(n\)。

按照趋向速率分析

有一个终止条件,如果每次操作都至少向终止条件的路程变为原来的 \(\frac{1}{k}\),那么复杂度 \(\log_k n\)。

当然具体问题不一定这么简单,考虑分析线段树区间操作的复杂度。

考虑 \([l,r]\) 的区间,每次切半,每个子区间都会贴到上界或下界,之后每次切半都会使得至少一半的区间被完全包含,途径的节点类似两条链接一些节点,最坏复杂度 \(4\log n\)。

势能分析和均摊分析

和上面两个类似,但是我们直接用上面的方法判断出来的上界过于松散,使得有些复杂度正确(或者说无法被 hack)的做法被误判。

于是可以考虑构建势能函数处理。当然也可以均摊分析,不过感性一点就是了。

设第 \(i\) 次操作的实际复杂度为 \(a_i\) ,根据具体情况构造势能函数,设 \(\Delta_i\) 为第 \(i\) 次操作与第 \(i-1\) 次操作的势能差 \(\varphi(i)-\varphi(i-1)\),然后记 \(b_i=a_i+\Delta_i\) ,那么总复杂度:

\[\sum_{i=1}^na_i=\sum_{i=1}^n b_i+\varphi(0)-\varphi(n) \]

例1:区间开根的静态线段树,支持区间和查询。分析暴力开根的复杂度。

设势能为区间和不为 \(0\) 的线段树节点的个数,对包含同一个点的区间每极少个操作(至少小于等于 \(\log w\))使得势能减少至少 \(1\) 。考虑中庸之道,每次取长度为 \(\sqrt n\) 的区间操作,假设进行 \(n\) 次操作,每个点由抽屉原理平均进行 \(\sqrt n\) 次,于是只要 \(O(nk\log n)\) 的复杂度可以完成,其中 \(k\) 很小。

一些辅助计算复杂度的小性质

1.约数对的和数量级是 \(O(n\ln n\ln n)\) 的。

不会证明,但是考虑 \(\sum_{d|n}(d+\frac{n}{d})\),总共 \(O(\sqrt n)\) 对,每对的和最大的 \(O(n)\) 其他的不断减小,结合题目数据范围可以大概猜测复杂度的正确性。

后续持续更新

标签:分析,势能,技巧,复杂度,区间,操作,有助于,log
来源: https://www.cnblogs.com/cbdsopa/p/16533525.html