Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 为什么递归树中的代价显示为加法?_Recursion_Tree_Runtime_Clrs - Fatal编程技术网

Recursion 为什么递归树中的代价显示为加法?

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)方程中的加

我正在学习算法介绍,并试图更多地理解递归树(我正在使用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)方程中的加法符号让我感到很不舒服,为什么这表示为加法,然后在树中每个步骤都应用了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(16)?那就是c(162)=256c,加上3T(16/4)=3T(4)。即:

T(16)=256c+3T(4)

现在,T(4)是什么?这就是c(42)=16c,加上3T(4/4)=3T(1)。因此,我们有

T(4)=16c+3T(1)

再加上我们上面所说的

T(16)=256c+3(16c+3T(1))=256c+48c+9T(1)=304c+9T(1)

你看到了吗,当我们计算每一步时,我们是如何传递更小的k值的?这就是我们评估复发的原因。T(k)的每一个单独的值总是加在k的某个函数中,它继承的k的值是由递归确定的


希望这有帮助-如果还有什么我可以澄清的,请在评论中告诉我

让我们快速更改一下符号。与其使用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(16)?那就是c(162)=256c,加上3T(16/4)=3T(4)。即:

T(16)=256c+3T(4)

现在,T(4)是什么?这就是c(42)=16c,加上3T(4/4)=3T(1)。因此,我们有

T(4)=16c+3T(1)

再加上我们上面所说的

T(16)=256c+3(16c+3T(1))=256c+48c+9T(1)=304c+9T(1)

你看到了吗,当我们计算每一步时,我们是如何传递更小的k值的?这就是我们评估复发的原因。T(k)的每一个单独的值总是加在k的某个函数中,它继承的k的值是由递归确定的

希望这有帮助-如果还有什么我可以澄清的,请在评论中告诉我