递归算法的时间复杂性分析(递推方法、Master定理方法、递归树方法)

本文详细介绍了递归算法的概念,包括递归函数的定义和递归过程中的分治策略。探讨了递归算法的时间复杂性分析方法,如递推、Master定理和递归树,以实例演示了如何运用这些方法求解问题,如阶乘、棋盘覆盖和归并排序。
摘要由CSDN通过智能技术生成

一、递归概念

直接或间接地调用自身的算法称为递归算法;用函数自身给出定义的函数称为递归函数。


二、递归过程

1.分治法产生的子问题是原问题的较小模式;

2.反复应用分治手段,可以使子问题规模不断缩小;
3.最终使子问题缩小到很容易被直接求出其解;
4.将规模较小问题的答案逐级向上合并,可得大问题答案

三、递归算法模板

Type FuncName(参数){
    if(满足边界条件){
        边界条件的处理;    
    }
    else{
        非边界条件的处理;
        1.分:问题划分为子问题
        2.治:对各个子问题递归调用去解决
        3.合:合并子问题的解为问题的解
    }
}

四、递归算法的时间复杂性分析

1.递推方法求递归算法的时间复杂性

递推方法就是使用已有的信息,将问题一点点推出最终的结果,然后通过递推过程计算出算法的时间复杂性。

例子:阶乘(Factorial)

int Factorial(int n){
    if(n == 1){
        return 1;                      //边界条件的处理
    }
    else{
         return n*Factorial(n - 1);    //非边界条件的处理
    }
}

\boldsymbol{T(n)\left\{\begin{matrix} 1 & n=1\\ T(n-1)+1&n>0 \end{matrix}\right.}

\boldsymbol{T(n) = T(n-1)+1 = T(n-2)+2 = \cdots = T(1)+n-1 = n = O(n)}


2.Master定理方法求递归算法的时间复杂性

(1)首先根据 :\boldsymbol{T(n)\left\{\begin{matrix} 1 & n=n_0\\ aT(\frac{n}{b})+f(n) & n>n_0 \end{matrix}\right. \Rightarrow n^{log_ba} \mathbf{}}

(2)比较\boldsymbol{n^{log_ba}}\boldsymbol{f(n)}的阶的关系(>,=,<),求\boldsymbol{T(n)}

        规则1:如果:\boldsymbol{f(n)=O(n^{log_ba-\varepsilon })}\boldsymbol{\varepsilon > 0} 为常数,则 \boldsymbol{T(n)=O(n^{log_ba})}

        规则2:如果:\boldsymbol{f(n)=\Theta (n^{log_ba})},则 \boldsymbol{T(n)=O(n^{log_ba}logn)}

        规则3:如果:\boldsymbol{f(n)=\Omega (n^{log_ba+\varepsilon })}\boldsymbol{\varepsilon > 0} 为常数,且存在\boldsymbol{n_0},当\boldsymbol{n>n_0}时,\boldsymbol{af(\frac{n}{b})\leqslant cf(n)}成立,\boldsymbol{c < 1}为常数,则\boldsymbol{T(n)=O(f(n))}

注:这里要\boldsymbol{a\geq 1}\boldsymbol{b> 1}为整数,\boldsymbol{f(n)}是正函数


例子1:棋盘覆盖

\boldsymbol{T(n)\left\{\begin{matrix} 1 &n=1 \\ 4T(\frac{n}{2})+1 & n>1 \end{matrix}\right.}

\boldsymbol{n^{log_ba} = n^{log_24} = n^2,f(n) = 1 \Rightarrow n^{log_ba}>f(n)}

\boldsymbol{\therefore f(n) = O(n^{log_ba-2}) = O(n^{2-2}),\varepsilon =2 >0}

\boldsymbol\because{}  根据Master定理规则1:\boldsymbol{T(n) = O(n^{log_ba}) = O(n^2)}


例子2:归并排序

\boldsymbol{T(n)\left\{\begin{matrix} 1 &n=1 \\ 2T(\frac{n}{2})+n & n>1 \end{matrix}\right.}

\boldsymbol{n^{log_ba} = n^{log_22} = n,f(n) = n \Rightarrow n^{log_ba}=f(n)}

\boldsymbol{\therefore f(n) = \theta (n^{log_ba}) = \Theta (n)}

\boldsymbol\because{}  根据Master定理规则2:\boldsymbol{T(n) = O(n^{log_ba}logn) = O(nlogn)}


例子3

\boldsymbol{T(n)\left\{\begin{matrix} 1 &n=1 \\ 4T(\frac{n}{2})+n^3 & n>1 \end{matrix}\right.}

\boldsymbol{n^{log_ba} = n^{log_24} = n^2,f(n) = 1 \Rightarrow n^{log_ba}>f(n)}

\boldsymbol{\therefore f(n) = \Omega (n^{log_ba+1}) = O(n^{2+1}),\varepsilon =1 >0}

\boldsymbol{4f(\frac{n}{2})=4(\frac{n}{2})^3=\frac{n^3}{2}\leq cf(n)}关系成立,\boldsymbol{\frac{1}{2}\leq c< 1}

\boldsymbol\because{}  根据Master定理规则3:\boldsymbol{T(n)=O(f(n))=O(n^3)}


例子4

\boldsymbol{T(n)\left\{\begin{matrix} 1 &n=1 \\ 2T(\frac{n}{2})+nlogn & n>1 \end{matrix}\right.}

\boldsymbol{n^{log_ba} = n^{log_22} = n,f(n) = nlogn \Rightarrow n^{log_ba}<f(n)}

按照Master定理规则3,但找不到一个常数\boldsymbol{\varepsilon },使得\boldsymbol{f(n)=\Omega (n^{log_ba+\varepsilon })}

因此改题目不适用Master定理


3.递归树方法求递归算法的时间复杂性

1.递归树是迭代计算模型;

2.递归树的生成过程与迭代过程一致;
3.根据递归定义不断扩展递归树,直到边界条件(其值已知);
4.对递归树产生的所有项求和就是递归方程的解;

例子1

\boldsymbol{T(n)\left\{\begin{matrix} 1 & n=1\\ 2T(\frac{n}{2}) +n & n>1 \end{matrix}\right.}

因为递归树有\boldsymbol{k=logn}层,并且每层合计都为\boldsymbol{n}

故:\boldsymbol{T(n) = O(nlogn)}


例子2

\boldsymbol{T(n)\left\{\begin{matrix} 1 & n=1\\ 4T(\frac{n}{2}) +1 & n>1 \end{matrix}\right.}

因为递归树有\boldsymbol{k=logn}层,每层是按照\boldsymbol{4^0} \boldsymbol{4^1} \boldsymbol{4^2} \cdots \boldsymbol{4^k}

因此形成了等比数列公式:\boldsymbol{S_n = \frac{a_1(1-q^n)}{1-q}}   \boldsymbol{(a_1\cdots a_n )}  前n项和,因此计算时应该计算\boldsymbol{S_k+a_0},则  \boldsymbol{S_k+1}

\boldsymbol{S_k+1=\frac{4(1-4^k)}{1-4} +1= \frac{4^{k+1}-1}{3}=\frac{4}{3}4^k-\frac{1}{3}\approx 4^k}

由:\boldsymbol{k=logn}\boldsymbol{4^k=4^{logn}=2^{2logn}=2^{logn^2}=n^2}

故:\boldsymbol{T(n) = O(n^2)}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值