假设我有一个算法,它对大小为n的输入进行操作,我知道n所需的时间是n-1所需时间的两倍。我可以在这个简单的情况下观察(假设n = 0需要1秒),算法需要2 n 秒。
是否存在将递归定义的定义转换为更熟悉的直接表达式的一般方法?
答案 0 :(得分:8)
特别是:
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列出的主定理在计算时间复杂度方面非常有用,但它与实际解决递归关系无关。
Wikipedia和Wolfram's Math World(在“另请参阅”下)列出了一些常见的重复关系类的封闭形式。然而,复杂(非线性)递归关系可能很难找到封闭形式的解决方案,如果存在的话。没有通用的算法来解决它们。
答案 2 :(得分:0)
如果它是线性的,你可以将关系表达为矩阵并找到特征值,将其分解为一种形式,让你将特征值提升到一个幂,就像Fibonacci here一样。