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)n^0.5 看看这棵树——直到log_8(n)级,树已经满了,然后当我们往下看时,越来越多的内部节点消失了。根据这个理论,我们可以给出边界

T(n)=大Oh(总和j=0到对数_2(n)-1(7/8)^j n)=……=>T(n)=O(n)。 T(n)=大ω(总和j=0到对数_8(n)-1(7/8)^j n)=……=>T(n)=大ω(n)

因此,T(n)=θ(n)

这里的要点是: T(n/2)路径的长度最大

这一定不是一个完整的三元树。。。高度=对数基2的n和#叶数必须小于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)