有助于复杂度分析的一些小技巧
有助于复杂度分析的一些小技巧
本文考虑一个严格大于等于的上界,然后加以感性分析。本文仅考虑最坏情况并忽略可忽略的常数。
按单元分析
也许你可以弄一些什么高级的东西去弄,但是既然是技巧就是简单点的东西。
你可以考虑每个点最多提供多少的复杂度贡献,然后累计分析。
例1:分析线段树合并的空间复杂度,如果我们对于每个点的线段树都进行一次单点操作,每次都最多新建 个点,于是最坏空间复杂度 。
按照不断趋向分析
有一个终止条件,如果每次操作都至少向终止条件走一步,那么最坏复杂度就是起始条件到终止条件的步数。
一个典型例子是双指针向中间逼近,总共之会走 步,复杂度 。
按照趋向速率分析
有一个终止条件,如果每次操作都至少向终止条件的路程变为原来的 ,那么复杂度 。
当然具体问题不一定这么简单,考虑分析线段树区间操作的复杂度。
考虑 的区间,每次切半,每个子区间都会贴到上界或下界,之后每次切半都会使得至少一半的区间被完全包含,途径的节点类似两条链接一些节点,最坏复杂度 。
势能分析和均摊分析
和上面两个类似,但是我们直接用上面的方法判断出来的上界过于松散,使得有些复杂度正确(或者说无法被 hack
)的做法被误判。
于是可以考虑构建势能函数处理。当然也可以均摊分析,不过感性一点就是了。
设第 次操作的实际复杂度为 ,根据具体情况构造势能函数,设 为第 次操作与第 次操作的势能差 ,然后记 ,那么总复杂度:
例1:区间开根的静态线段树,支持区间和查询。分析暴力开根的复杂度。
设势能为区间和不为 的线段树节点的个数,对包含同一个点的区间每极少个操作(至少小于等于 )使得势能减少至少 。考虑中庸之道,每次取长度为 的区间操作,假设进行 次操作,每个点由抽屉原理平均进行 次,于是只要 的复杂度可以完成,其中 很小。
一些辅助计算复杂度的小性质
1
.约数对的和数量级是 的。
不会证明,但是考虑 ,总共 对,每对的和最大的 其他的不断减小,结合题目数据范围可以大概猜测复杂度的正确性。
或者说,有调和级数公式:
后续持续更新
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具