级数相关
定义
有数列 ,加号连接这些数,得到级数。
如果 拥有极限,则称级数 收敛。否则称级数 发散。
条件收敛:如果 收敛而 发散,则称 条件收敛。
重要性质:对发散级数不能更改求和顺序。(加括号属于更改求和顺序)
黎曼级数定理
一个颠覆常规观念的结论:
如果级数 条件收敛,那么我们可以指定任意实数 ,通过调整级数的求和顺序,使得 ;也可以通过调整级数的求和顺序,使得 , 或根本没有极限。
如果级数
调和级数
级数 称为“调和级数”。
它的前 项和 ,其中 被称为“欧拉常数”。
近年来出现了声称调和级数收敛的狗屁论调,我们容易证明调和级数发散:
又有右边柿子等于
故调和级数发散。
调和级数与 同阶,故经常用来证明复杂度。例如下面的代码:
for(i=1;i<=n;i++) for(j=1;i*j<=n;j++) //do something excited in O(1)
考虑对于某个 , 将会有 个取值。
那么总的 的取值为: 。
那么总的
而 与 同阶,故算法复杂度是 .
证明复杂度
有时与微积分联系起来,证明复杂度。
例如一个典型的例子。在CDQ分治套莫队算法的时候,会有这种复杂度: .
惯用伎俩,把复杂度按层考虑。
惯用伎俩,把复杂度按层考虑。
如上图。对于每个大小为 的块,需要耗费 的复杂度来处理。
那么以“第几层”为自变量 ,则有:第 层有 个块,每块大小为 ;故处理每块的复杂度是 .化简为 .
由于这层有 个块,则处理整层的复杂度是 .
共有 个块,故整个算法的复杂度为: .
由于 与 无关,故提取出来。整个算法复杂度为: .
右边的和式并不好求,我们将它近似到微积分的形式:
不妨乘上常数 (约等于 )。则复杂度变成:
由于
右边的和式并不好求,我们将它近似到微积分的形式:
不妨乘上常数
不妨令 ,则有 .
于是
直接解开,得到 .
于是
直接解开,得到
因此我们的算法复杂度是: .
好神奇啊,连个 都不带。
Update on 2016.8.30:
uoj的人给出了一种很劲的方法:可以用“主定理”求出上面的递归式的复杂度.
因为
这就完了……去看看算法导论,留坑待补。
Update on 2016.10.3:
此坑已补。
评论
发表评论