zoukankan      html  css  js  c++  java
  • 3.4.3递归算法的效率分析

    1.时间复杂度的分析
    在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析可以转化为一个递归方程求解。也就是数学上求渐进解得问题,而递归方唱的形式多种多样,其求解方法也不尽相同。迭代法是求解递归方程的一种常用方法,其基本步骤是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计(即方程的解)来达到对左端的估计。
    下面以阶乘为例求解时间复杂度。
    阶乘执行函数如下:
    longFact(long n)
    {
    long temp;
    if(n==0)return1;//活动记录退栈
    else temp=n*Fact(n-1);//活动记录进栈
    return temp;//活动记录退栈
    }
    设Fact(n)的执行时间是T(n)。此递归函数中语句4的时间复杂度为O(1)【因为语句4的执行次数不会随着问题规模n的改变而改变】。递归调用Fact(n-1)的执行时间是T(n-1)【因为随着n的不同,函数中Fact(long n)会被执行n次】,所以语句5的执行时间是O(1)+T(n-1)【因为语句5中最后一次传进的参数是0,所以执行的是语句4。又前面共执行了n-1次调用,所以有执行时间是O(1)+T(n-1)】。
    加入设两数相乘和赋值的时间复杂度都是O(1),则对某常数C【非终止条件下的递归通式】、D【终止条件下的执行时间】有如下递归方程
    设n>2,利用上式对T(n-1)展开,即在上式中用n-1代替n得到
    T(n-1)=C+T(n-2)
    再代入T(n)=C+T(n-1)中,有
    T(n)=2C+T(n-2)
    同理,n>3时有
    T(n)=3C+T(n-3)
    以此类推,当n>i时有
    T(n)=iC+T(n-i)
    最后,当i=n时有
    T(n)=nC+T(0)=nC+D
    求得递归方程的解为:
    T(n)=O(n)
    采用这种方法计算Fibonacci数列和Hanoi塔问题递归算法的时间复杂度为
     
    2、空间复杂度的分析
    递归函数在执行时,系统会建立一个“递归工作栈”存储每一层递归所需的信息,此工作栈是递归函数执行的辅助空间,因此,分析递归算法的空间复杂度需要分析工作栈的大小。
    对于递归算法,空间复杂度
    S(n)=O(f(n))
    其中,f(n)为“递归工作栈”中工作记录的个数,与问题规模n的函数关系。
    根据这种分析方法不难得到,前面讨论的阶乘问题、Fibonacci数列问题、Hanoi塔问题的递归算法的空间复杂度为O(n)。

    1.时间复杂度的分析2、空间复杂度的分析1.时间复杂度的分析在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析可以转化为一个递归方程求解。也就是数学上求渐进解得问题,而递归方唱的形式多种多样,其求解方法也不尽相同。迭代法是求解递归方程的一种常用方法,其基本步骤是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计(即方程的解)来达到对左端的估计。 下面以阶乘为例求解时间复杂度。阶乘执行函数如下:long Fact(long n){    long temp;    if(n==0) return 1;//活动记录退栈    else temp=n*Fact(n-1);//活动记录进栈    return temp;//活动记录退栈}
    设Fact(n)的执行时间是T(n)。此递归函数中语句4的时间复杂度为O(1)【因为语句4的执行次数不会随着问题规模n的改变而改变】。递归调用Fact(n-1)的执行时间是T(n-1)【因为随着n的不同,函数中Fact(long n)会被执行n次】,所以语句5的执行时间是O(1)+T(n-1)【因为语句5中最后一次传进的参数是0,所以执行的是语句4。又前面共执行了n-1次调用,所以有执行时间是O(1)+T(n-1)】。加入设两数相乘和赋值的时间复杂度都是O(1),则对某常数C【非终止条件下的递归通式】、D【终止条件下的执行时间】有如下递归方程
    设n>2,利用上式对T(n-1)展开,即在上式中用n-1代替n得到T(n-1)=C+T(n-2)再代入T(n)=C+T(n-1)中,有T(n)=2C+T(n-2)同理,n>3时有T(n)=3C+T(n-3)以此类推,当n>i时有T(n)=iC+T(n-i)最后,当i=n时有T(n)=nC+T(0)=nC+D求得递归方程的解为:T(n)=O(n)采用这种方法计算Fibonacci数列和Hanoi塔问题递归算法的时间复杂度为

    2、空间复杂度的分析递归函数在执行时,系统会建立一个“递归工作栈”存储每一层递归所需的信息,此工作栈是递归函数执行的辅助空间,因此,分析递归算法的空间复杂度需要分析工作栈的大小。对于递归算法,空间复杂度S(n)=O(f(n))其中,f(n)为“递归工作栈”中工作记录的个数,与问题规模n的函数关系。根据这种分析方法不难得到,前面讨论的阶乘问题、Fibonacci数列问题、Hanoi塔问题的递归算法的空间复杂度为O(n)。

  • 相关阅读:
    vue-loader介绍和单页组件介绍
    webpack的插件 http-webpack-plugin。 webpack-dev-server
    webpack的介绍
    Axios 的基本使用
    如何使用 re模块的, spilt.
    为 JS 的字符串,添加一个 format 的功能。
    另一种分页器 不依赖Paginator模块的方法
    Socket初识
    网络协议
    双下方法补充以及异常处理
  • 原文地址:https://www.cnblogs.com/kitor/p/10123424.html
Copyright © 2011-2022 走看看