如何从算法中找到递归关系
how to find a recurrence relation from algorithm
我试图理解递归关系。 我找到了一种通过递归确定整数数组中最大元素的方法。 下面是函数。 第一次调用它时,n 是数组的大小。
int ArrayMax(int array[], int n) {
if(n == 1)
return array[0];
int result = ArrayMax(array, n-1);
if(array[n-1] > result)
return array[n-1];
else
return result;
}
现在我想了解递归关系以及如何从那里获得 big-O 表示法。 我知道 T(n( = aT(n/b( + f(n(,但我看不出如何得到 a 和 b 应该是什么。
直观地说,a
是"有多少递归调用",b
是"将数据拆分成多少块"。请注意,递归调用中的参数不必n
除以某些东西,通常它是描述数据量级如何更改的任何n
函数。
例如,二叉搜索在每一层执行一个递归调用,将数据拆分为 2 个,并在每层执行恒定的工作,因此它具有T(n) = T(n/2) + c
。合并排序每次将数据一分为二(拆分占用的工作与n
成正比(,并在两个子数组上递归 - 所以你得到T(n) = 2T(n/2) + cn
.
在您的示例中,您将有T(n) = T(n-1) + c
,因为您正在进行一次递归调用并通过每次将其大小减小 1 来"拆分数据"。
要从中获得大O表示法,您只需进行替换或扩展即可。使用您的示例很容易:
T(n) = T(n-1) + c = T(n-2) + 2c = T(n-3) + 3c = ... = T(0) + nc
如果你假设T(0) = c0
,一些"基常数",那么你得到T(n) = nc + c0
,这意味着所做的功是O(n)
。
二叉搜索示例类似,但您必须进行替换 - 尝试让n = 2^m
,看看您可以在哪里使用它。最后,推导出 eg 的大 O 表示法。T(n) = T(sqrt(n)) + c
是一项非常酷的练习。
编辑:还有其他方法可以解决递归关系 - 主定理是一种标准方法。但是证明并不是特别好,上面的方法适用于我曾经应用的每一次复发。和。。。好吧,这比将值代入公式更有趣。
在您的情况下,递归关系为:
T(n) = T(n-1) + constant
主定理说:
T(n) = aT(n/b) + f(n) where a >= 1 and b > 1
这里主定理不能应用,因为对于主定理b
应大于1
(b>1)
在您的情况下b=1
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 如何记住这种递归关系?
- 关于记忆后这种递归关系的时间复杂度
- 如何从算法中找到递归关系
- 同一生成文件中的 make 目标之间的递归依赖关系
- C++:类型别名中的递归依赖关系
- 算法的递归关系