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

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

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

按单元分析

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

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

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

按照不断趋向分析

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

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

按照趋向速率分析

有一个终止条件,如果每次操作都至少向终止条件的路程变为原来的 1k,那么复杂度 logkn

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

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

势能分析和均摊分析

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

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

设第 i 次操作的实际复杂度为 ai ,根据具体情况构造势能函数,设 Δi 为第 i 次操作与第 i1 次操作的势能差 φ(i)φ(i1),然后记 bi=ai+Δi ,那么总复杂度:

i=1nai=i=1nbi+φ(0)φ(n)

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

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

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

1.约数对的和数量级是 O(nlnn) 的。

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

或者说,有调和级数公式:

i=1n1i>ln(n+1)

后续持续更新

posted @   cbdsopa  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示