用递归树求解递归算法时间复杂度

用递归树求解递归算法时间复杂度递归代码复杂度分析起来比较麻烦 一般来说有两种分析方法 递推公式和递归树 1 递推公式法归并排序的递推公式是 merge sort p r merge merge sort p q merge sort q 1 r 终止条件 p gt r 不用再继续分解我们假设对 n 个元素排序的时间是 T n 那分解成两个子数组排序的时间是 T n2 T dfrac n 2 T

1 递推公式法

归并排序的递推公式是:

merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r)) 终止条件: p >= r 不用再继续分解 

我们假设对n个元素排序的时间是T(n),那分解成两个子数组排序的时间是 T ( n 2 ) T(\dfrac{n}{2}) T(2n)。merge函数合并两个子数组的时间复杂度是O(n)。所以归并排序时间复杂度计算公式就是:
  T ( n ) = 2 ∗ T ( n 2 ) + n , n > 2 T(n)=2*T(\dfrac{n}{2})+n,n>2 T(n)=2T(2n)+n,n>2
 T(1)=c;
 
 继续计算T(n)








T(n)=2*T(n/2)+n =2*(2*T(n/4)+n/2)+n=4*T(n/4)+2n =4*(2*T(n/8)+n/4)+2n=8*T(n/8)+3n =8*(2*T(n/16)+n/8)+3n=16*T(n/16)+4n ... =2^k*T(n/2^k)+k*n 

n / 2 k = 1 n/2^k=1 n/2k=1的时候, k = l o g 2 n k=log_2n k=log2n,代入上面的式子: T ( n ) = c ∗ n + n l o g 2 n T(n)=c*n+nlog_2n T(n)=cn+nlog2n,用大O表示法,T(n)=O(nlogn)。

2 递归树法

在这里插入图片描述

3 递归树分析法实战

3.1 快排时间复杂度

将k=99,999…替换之后结论相同。

3.2 斐波那契数列

int f(int n) { if (n == 1) return 1; if (n == 2) return 2; return f(n-1) + f(n-2); } 

每次分解之后的合并操作只是一次加法,算一个时间1。第一层是f(n-1)+f(n-2),1次运算;第二层是f(n-2)+f(n-3),f(n-3)+f(n-4)是两次运算…依次类推,第k层的总耗时是 2 k − 1 2^{k-1} 2k1。算法总耗时是每层耗时相加。

如果路径长度都为n,那么总耗时是: 2 n − 1 2^n-1 2n1
1 + 2 + 2 2 + . . . + 2 n − 1 = 2 n − 1 1+2+2^2+…+2^{n-1}=2^n-1 1+2+22+...+2n1=2n1

如果路径长度都为 n 2 \dfrac{n}{2} 2n,那么总耗时是 2 n 2 − 1 2^{\dfrac{n}{2}}-1 22n1
1 + 2 + 2 2 + . . . + 2 n 2 − 1 = 2 n 2 − 1 1+2+2^2+…+2^{\dfrac{n}{2}-1}=2^{\dfrac{n}{2}}-1 1+2+22+...+22n1=22n1

所以算法的时间复杂度在 2 n 2 − 1 2^{\dfrac{n}{2}}-1 22n1 2 n − 1 2^n-1 2n1之间。这样的计算不够精确,只是一个范围。但是我们知道了该算法的时间复杂度是指数级的。复杂度非常高。

心得:时间复杂度是可以估算的,不用非常准确。只要数量级保证正确即可。

3.3 全排列的时间复杂度

1 递归公式是

假设数组里的内容是1,2,3.....n f(n)={最后一位是1,f(n-1)}+{最后一位是2,f(n-1)}+...+{最后一位是n,f(n-1)} 

4 递归树法分析得步骤

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202742.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:24
下一篇 2026年3月19日 下午11:25


相关推荐

  • Debian 6 字体显示效果调整

    Debian 6 字体显示效果调整在给cairo打了补丁之后,我发现debian的字体显示效果还是跟ubuntu有差别,于是我把ubuntu下/etc/fonts的所有文件都打包放在了debian的/etc/fonts下,这里面ubuntu对字体的渲染做了优化,我直接拿过来用了,:)。可是效果还是不一样,最后发现了问题所在。打开“Appearance”设置对话框,选中“Fonts”标签,点击”Details”,Hintin

    2022年10月9日
    3
  • php 伪静态 rewriterule,PHP伪静态 RewriteRule-htaccess详细规则使用说明「建议收藏」

    php 伪静态 rewriterule,PHP伪静态 RewriteRule-htaccess详细规则使用说明「建议收藏」伪静态实际上是利用PHP把当前地址解析成另一种方法来访问网站,要学伪静态规则的写法,要懂一点正则一、正则表达式教程有一个经典的教程:正则表达式30分钟入门教程常用正则如下:.换行符以外的所有字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符\d匹配数字\b匹配单词的开始或结束^匹配字符串的开始$匹配字符串的结束*重复零次或更多次+重复一次或更多次?重复…

    2022年5月14日
    39
  • nexus3的安装

    nexus3的安装一 服务器要求官网中对服务器的硬件配置做出了具体的要求内存 cpu gt 8G gt 4c 除了硬件配置 文件句柄数也是要 gt 65536 root localhost echo hardnofile65 softnofile65 gt gt etc security limits conf 开头先

    2026年3月17日
    2
  • .Net Framework 中设置Web Proxy 的方法

    .Net Framework 中设置Web Proxy 的方法正在进行MapAPI到.NetFramework平台移植。涉及到HttpConnection.其中可能用到Webproxy的设置。有两种简单的方法。WebProxyproxy=newWebProxy(“proxyaddress”,port);proxy.Credentials=newNetworkCredential(“username”,”pa

    2022年6月21日
    31
  • 在Excel中使用频率最高的函数的功能和使用方法

    在Excel中使用频率最高的函数的功能和使用方法,按字母排序:1、ABS函数函数名称:ABS主要功能:求出相应数字的绝对值。使用格式:ABS(number)参数说明:number代表需要求绝

    2021年12月24日
    60
  • ResourceBundle用法[通俗易懂]

    ResourceBundle用法[通俗易懂]ResourceBundle用于解释资源文件。 1.新建一个.properties文件这里为:AccessMessages.properties例error=错误warn=警告放入工程下的en_US,目录结构如图  2.建立绑定关系[ResourceBundle("AccessMessages")]privatestaticvarrb:Resource…

    2022年7月12日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号