Recursion 为什么递归树中的代价显示为加法?
我正在学习算法介绍,并试图更多地理解递归树(我正在使用CLRS教科书)。 下面是一个示例算法:Recursion 为什么递归树中的代价显示为加法?,recursion,tree,runtime,clrs,Recursion,Tree,Runtime,Clrs,我正在学习算法介绍,并试图更多地理解递归树(我正在使用CLRS教科书)。 下面是一个示例算法: T(n) = 3T(n/4) + cn^2 我的理解是3T(n/4)表示递归子问题的数量及其作用。对于这个示例算法,每个递归将数组分割(n/4)。有4个子问题,如T前面的4所示。cn^2是在树中执行该级别递归的成本 因此,在所有这些就绪的情况下,我遇到的问题是在尝试构建递归树时: 为什么在这张图的步骤c中,孩子们似乎继承了cn^2表单??我以为cn^2只是运行第一步的成本?原始T(n)方程中的加
T(n) = 3T(n/4) + cn^2
我的理解是3T(n/4)表示递归子问题的数量及其作用。对于这个示例算法,每个递归将数组分割(n/4)。有4个子问题,如T前面的4所示。cn^2是在树中执行该级别递归的成本
因此,在所有这些就绪的情况下,我遇到的问题是在尝试构建递归树时:
为什么在这张图的步骤c中,孩子们似乎继承了cn^2表单??我以为cn^2只是运行第一步的成本?原始T(n)方程中的加法符号让我感到很不舒服,为什么这表示为加法,然后在树中每个步骤都应用了cn^2形式?这不是更像一个乘法吗
寻找一些直观的答案。让我们快速改变一下符号。与其使用T(n),不如称之为T(k)。这就是我们之间的关系 T(k)=3T(k/4)+ck2 这里的想法是,T(k)表示“在对大小为k的输入进行递归调用求值时所完成的总工作量”。如果您最初通过对大小为n的输入调用递归函数来启动递归,那么您将对求值T(n)感兴趣 我认为将变量名改为k很有帮助的原因是为了更清楚地了解发生了什么。T(k)是一个通用公式,用于计算尺寸为k的输入的重现性所需的工作量。这里,k是一个占位符变量。你可以问T(137)是多少,以了解在137大小的输入上做了多少功,或者你可以问T(2m)是多少,如果你想知道当输入是2的完美幂时,功是如何伸缩的 现在,让我们来分析一下这个公式。公式T(k)=3T(k/4)+ck2表示,在大小为k的输入上计算函数所需的功如下所示:
- 顶级递归调用完成的一些基线工作量。那是2克朗
- 递归调用所需的工作量。特别是,有三个递归调用,每个调用都是对一个输入进行的,其大小是原始调用的四分之一
希望这有帮助-如果还有什么我可以澄清的,请在评论中告诉我 让我们快速更改一下符号。与其使用T(n),不如称之为T(k)。这就是我们之间的关系 T(k)=3T(k/4)+ck2 这里的想法是,T(k)表示“在对大小为k的输入进行递归调用求值时所完成的总工作量”。如果您最初通过对大小为n的输入调用递归函数来启动递归,那么您将对求值T(n)感兴趣 我认为将变量名改为k很有帮助的原因是为了更清楚地了解发生了什么。T(k)是一个通用公式,用于计算尺寸为k的输入的重现性所需的工作量。这里,k是一个占位符变量。你可以问T(137)是多少,以了解在137大小的输入上做了多少功,或者你可以问T(2m)是多少,如果你想知道当输入是2的完美幂时,功是如何伸缩的 现在,让我们来分析一下这个公式。公式T(k)=3T(k/4)+ck2表示,在大小为k的输入上计算函数所需的功如下所示:
- 顶级递归调用完成的一些基线工作量。那是2克朗
- 递归调用所需的工作量。特别是,有三个递归调用,每个调用都是对一个输入进行的,其大小是原始调用的四分之一