如何将递归定义的输入大小函数转换为问题输入大小的直接函数?

时间:2010-02-02 16:39:46

标签: algorithm math time

假设我有一个算法,它对大小为n的输入进行操作,我知道n所需的时间是n-1所需时间的两倍。我可以在这个简单的情况下观察(假设n = 0需要1秒),算法需要2 n 秒。

是否存在将递归定义的定义转换为更熟悉的直接表达式的一般方法?

3 个答案:

答案 0 :(得分:8)

Master Theorem

特别是:

T(n)= aT(n / b)+ n c

如果log b a< c,然后T(n)= O(n c

如果log b a = c,那么T(n)= O(n c log [n])

如果log b a> c,然后T(n)= O(n log b a

这是一个有用的定理,但不能完全回答你的问题。

您正在寻找的是递归关系的生成函数。通常,这些仅在非常简单的情况下是可解的,即当f(n)= Af(n-1)+ Bf(n-1)和f(0)= f(1)= 1(或f(1)时= A)。其他复发关系很难解决。

有关详细信息,请参阅linear recurrence relation

答案 1 :(得分:3)

像这样的“递归函数”称为递归关系,它们的“直接类型”称为封闭式解决方案

虽然Poita列出的主定理在计算时间复杂度方面非常有用,但它与实际解决递归关系无关。

WikipediaWolfram's Math World(在“另请参阅”下)列出了一些常见的重复关系类的封闭形式。然而,复杂(非线性)递归关系可能很难找到封闭形式的解决方案,如果存在的话。没有通用的算法来解决它们。

答案 2 :(得分:0)

如果它是线性的,你可以将关系表达为矩阵并找到特征值,将其分解为一种形式,让你将特征值提升到一个幂,就像Fibonacci here一样。