📜  DAA递归关系(1)

📅  最后修改于: 2023-12-03 14:40:36.065000             🧑  作者: Mango

DAA递归关系

在算法设计与分析中,DAA递归关系是经常使用的工具,它用于将问题的复杂度转化为递归式,使其易于分析。

什么是递归?

递归是一种允许函数调用自身或其它函数的方法。在递归算法中,解决问题的方法会反复调用本身,直到满足出口条件。

递归一般分为两种:

  1. 直接递归:函数直接调用自己。
  2. 间接递归:函数互相调用,形成有向图结构。
DAA递归关系的定义

DAA递归关系又称为递推关系,通常用于递归算法的时间复杂度分析。

设一个递归算法的时间复杂度为$T(n)$,则它的递归式可以表示为:

$$ T(n) = aT(\frac{n}{b}) + f(n) $$

其中,$a$表示递归调用次数,$\frac{n}{b}$表示递归时的问题规模,$f(n)$表示递归出口的复杂度。

递归式的求解

求解递归式通常采用递归树或主方法进行分析。

递归树

递归树是一种可视化的分析方式,将递归式表示为一棵树,每个节点表示递归调用所需要的时间。树的深度表示递归次数,每层节点的数目表示递归问题规模的变化。

例:对于归并排序算法的递归式

$$ T(n) = 2T(\frac{n}{2}) + n $$

可视化的递归树如下:

           n
        /     \
     n/2      n/2
    /   \    /   \
  n/4  n/4  n/4  n/4
   .     .    .    .
   .     .    .    .
   .     .    .    .
   1     1    1    1

从递归树中可以看出:“递归式的解法次数”$\times$ “每个解法的时间复杂度”$=$“递归式的解法的总时间复杂度”。

主方法

主方法是一种通用的求解递归式的方法,适用于形如:

$$ T(n) = aT(\alpha n) + f(n) $$

其中,$a > 0,\alpha > 0$。主方法的步骤如下:

  1. 将式子展开,得到 $T(n) = aT(\alpha n) + f(n)$
  2. 根据定义,得到 $a > 0,\alpha > 0$
  3. 比较 $f(n)$ 与 $n^{\log_{\alpha}a}$ 的大小:
    1. 如果 $f(n) = O(n^{\log_{\alpha}a - \epsilon})$,其中 $\epsilon > 0$,则 $T(n) = \Theta(n^{\log_{\alpha}a})$
    2. 如果 $f(n) = \Theta(n^{\log_{\alpha}a}\log^kn)$,其中 $k \geq 0$,则 $T(n) = \Theta(n^{\log_{\alpha}a}\log^{k+1}n)$
    3. 如果 $f(n) = \Omega(n^{\log_{\alpha}a + \epsilon})$,其中 $\epsilon > 0$,并且 $af(\frac{n}{\alpha}) \leq cf(n)$,其中 $c < 1$,则 $T(n) = \Theta(f(n))$

例:对于归并排序算法的递归式

$$ T(n) = 2T(\frac{n}{2}) + n $$

可使用主方法进行求解,得到 $a = 2, \alpha = 0.5, f(n) = n$。则:

$$ f(n) = n = n^{\log_{0.5}2} = \Theta(n^1) $$

因此,$T(n) = \Theta(n\log n)$。

总结

DAA递归关系是递归算法的时间复杂度分析方法。通过递归关系,可以将递归算法的时间复杂度表示为递推式,然后通过递归树或主方法求解递推式,得到算法的时间复杂度。