『数学杂谈』递归式复杂度求解/渐进式小记
关于递归式复杂度求解的一些想法。
虽然说具体数学有一整章讲渐进式,但鉴于学这个性价比太低了,基本也用不到,所以很多有关渐进式的实用知识会在本文总结。
接下来进入正题。
渐进式
很多时候,我们并不能很好的得知一个式子的封闭形式,但是对于这个式子知道他的增长速度也是极好的。这里用来表示这种渐进的符号最常用的符号有两种:
计算渐进式的方法有很多,下面会一一介绍。
主定理及其局限性
这是本文十分重要的一个点。这里先介绍一下主定理,这是一个非常好的求解递归式渐进的方法(证明略):
Theorem:
主定理的适用范围是非常广的,但是它对下面这个式子束手无策:
发现主定理用不了,因为子问题里的
除了上式外,看到下面这个递归式:
这个式子的子问题并不是平均划分的,因此也就不能用主定理。
我们再看一个式子:
此时该式子不符合主定理的三种情况,也是不能用主定理的。
不那么暴力的暴力
对于不能用主定理解决的递归式,《算法导论》中推荐使用递归树+数学归纳法解决,但是这样工作量过于巨大了,会显得很蠢,还不如乱猜再证明来的快,此时就十分的难受,不知道怎么整。
为了让我们能更简洁与优美的暴力,采用更好的方法是必要的。我们尝试在递归树的基础上进行优化。就像记忆化搜索可以优化深度优先搜索一样,我们可以对每一个可能出现的子问题考虑它对答案的贡献。
拿
相信对数字敏感的人无需列表即可感性地证明规律,即使不太敏感,表的前三项也足够找到规律:
那么设
总的复杂度就会是:
而
所以答案为:
如果具有较好的和式计算能力的话,这种做法也是可以得出和主定理一样的结果的。下面是 Codeforces Round 960 F题 的一种错误做法最劣时间复杂度分析,它是一个基于递归的分治算法。递归树这一步就省略了,得出的式子是这样的:
我们把后面的和式拎出来处理:
具体数学一书中有对和式后面一个和式的化简,这里不赘述化简过程:
带回到原式就有
不妨再来一组。我们来解决式
最后我们来搞定式
然后发现式子并不能化简到封闭形式,此时我们就需要下面的定理。
Akra-Bazzi定理
Theorem:
其中的多项式增长条件可以简易地理解为
开了之后我们再回到式
Akra-Bazzi 定理原论文里的证明用了一种称为 阶变换(Order Transform) 的技巧,还涉及泛函分析,这些笔者还在学习中。当然粗暴一点的证明有数学归纳法,这里受限于本人能力不足,不做证明。
总结
总结一下,对于一般的递归式,可通过主定理求渐进解。而对于
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南