ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-29 21:04:37  阅读:128  来源: 互联网

标签:分析 势能 技巧 复杂度 区间 操作 有助于 log


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

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

按单元分析

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

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

例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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有