关于递归问题的复杂度计算
背景:前段时间在背八股,手撕快速排序,算法时间复杂度为
void func(n){
if(n==1){
printf("good\n");
}
func(n-1);
func(n-1);
}
也是问时间复杂度,当时没多想就选了
先来看最简单的一种递归形式,计算n!的递归代码:
int func(n){
if(n==1){
return 1;
}
return n*func(n-1);
}
上面的代码对应的递推式为:
再说一下小红书那道笔试题,它对应的递推式为:
上面的例子都是第n项和第n-1项的递推式,然而我们在写代码的时候很容易碰到第n项和第x项(x!=n-1)的递推式,比如快速排序:
void quicksort(int l,int r){
if(l<=r){
return;
}
... //选取哨兵进行左右两边进行交换的过程,时间复杂度为O(n)
quicksort(l,index-1);
quicksort(index+1,r);
}
在上述代码中,index可能是l~r的任意一个位置。理想情况下index会处于l和r中间,那么有:
一看,感觉能求,但是有点麻烦,这时候就该介绍一下主定理了。
主定理,是分析递归算法时间复杂度的一种重要工具,尤其适用于具有分治结构的递归算法。它适用的递推式如下:
主定理本身就是递归的形式,是递归方法时间复杂度的一种表示法。T(n) 代表递归方法处理规模为n的数据量的时间复杂度,T(n/b) 代表调用子递归方法的总体时间复杂度,
当一个递归问题可以表示成上述的递推式的时候,我们有:
1. 当
2. 当
3. 当
证明思路大家自己去找吧,个人感觉记得结论就行。
有了主定理后,我们来看理想下的快速排序:
当然,这只是理想的情况,实际上快速排序的时间复杂度应该是index(哨兵位置)取不同值时得到的期望,更加麻烦,最后也是
这篇博客只是自己的一些想法,写的比较简单,写的过程也有参考一些大佬的博客,比如https://www.cnblogs.com/wind-wound/p/18206958,这一篇就写的比较详细,水平高我太多。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?