Algorithm 如何求解:T(n)=T(n/2)+;T(n/4)及"x2B ;;T(n/8)及"x2B ;;(n)
我知道如何为只调用自身一次的算法建立递归关系,但我不确定如何在一次事件中多次调用自身 例如:Algorithm 如何求解:T(n)=T(n/2)+;T(n/4)及"x2B ;;T(n/8)及"x2B ;;(n),algorithm,recursion,recurrence,Algorithm,Recursion,Recurrence,我知道如何为只调用自身一次的算法建立递归关系,但我不确定如何在一次事件中多次调用自身 例如: T(n) = T(n/2) + T(n/4) + T(n/8) + (n) 就像编码斐波那契序列(困难的方式)作为示例一样,您只需键入以下内容: 长fib(长n){ 如果(n=fib_global.length)fib_global.add(fib(n-1)+fib(n-2)); 返回fib_global.get(n); } 代码一次只执行其中一个调用,而且很可能是按从左到右的顺序键入的,这样您就不
T(n) = T(n/2) + T(n/4) + T(n/8) + (n)
就像编码斐波那契序列(困难的方式)作为示例一样,您只需键入以下内容:
长fib(长n){
如果(n=fib_global.length)fib_global.add(fib(n-1)+fib(n-2));
返回fib_global.get(n);
}
代码一次只执行其中一个调用,而且很可能是按从左到右的顺序键入的,这样您就不必担心需要调用的次数 使用递归树。请参阅CLRS“算法简介”中递归树的最后一个示例 T(n)=T(n/2)+T(n/4)+T(n/8)+n。根将是n(成本)&分为3个递归。因此递归树如下所示: T(n)=n=n T(n/2)T(n/4)T(n/8)(n/2)(n/4)(n/8) T(n/4)T(n/8)T(n/16)T(n/8)T(n/16)T(n/32)T(n/16)T(n/32)T(n/64) 最长路径:最左边的分支=n->n/2->n/4->…->一, 最短分支:最右边的分支=n->n/8->n->64->…->一, 叶数(l):3^logu8(n)
希望你能用这种方法解决这个问题。有两种方法可以解决这个问题。一个是展开递归并找到相似之处,这需要创造性,而且非常困难。另一种方法是使用 在这种情况下,
g(x)=n
,a1=a2=a3=1
和b1=1/2
,b2=1/4
,b3=1/8
。解方程
这是1/2^p+1/4^p+1/8^p=1
你得到p=0.87915
。求解你将得到的积分,这意味着复杂度是:O(n)
正如CLRS所说,T(n)
可以用数学归纳法替换为cn
。此归纳假设适用于以下数字n
。如上所述,我们需要证明的是参数值为n。因此,具体如下:
假设:
T(n)查看图像以获得更好的解释
树的高度:我们采用log(n)(基数2),因为与n/4和n/8相比,n/2使树更长。我们的GP系列将一直持续到k=logn(base)。应该是一个问题-您如何推荐迁移问题?您所说的“重复关系”是什么意思?@Claudiu-您将标记它,但我怀疑这是一个研究水平的comp-sciquestion@Robin这不是一个CS理论问题,而是实际复杂性分析中的一个简单问题。为什么n/2^k=1?因为在某个时间点,k的某个特定值将导致该表达式为1。假设这样得到k的值,k的值会让我们知道树的高度是多少。
long fib(long n){
if(n <= 1) return n;
else return fib(n-1) + fib(n-2);
}
static ArrayList<Long>fib_global = new ArrayList(1000);
//delcare a global variable that can be appended to
long fib(long n){
if(n >= fib_global.length)fib_global.add(fib(n-1) + fib(n-2));
return fib_global.get(n);
}
n---------------------------------> n
(n/2) (n/4) (n/8)--------------> (7/8)n
n/4 n/8 n/16 n/8 n/16 n/32 n/16 n/32 n/64)--------> (49/64)n
...
T(n) = T(n/2) + T(n/4) + T(n/8) + n
<= c/2*n + c/4*n + c/8*n + n
= (7/8*c + 1) * n
<= cn (when c >= 8)