首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何求解: T(n) = T(n/2) + T(n/4) + T(n/8) + (n)

如何求解: T(n) = T(n/2) + T(n/4) + T(n/8) + (n)
EN

Stack Overflow用户
提问于 2011-04-12 06:23:09
回答 5查看 33.2K关注 0票数 9

我知道如何为只调用自己一次的算法做递归关系,但我不确定如何做一次多次调用自己的事情。

例如:

代码语言:javascript
复制
T(n) = T(n/2) + T(n/4) + T(n/8) + (n)
EN

回答 5

Stack Overflow用户

发布于 2011-09-01 01:24:29

使用递归树。参见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)

代码语言:javascript
复制
                                             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
                                            ...         

最长路径:最左边的分支=n -> n/2 -> n/4 -> ... -> 1

最短分支:最右边的分支=n -> n/8 -> n -> 64 -> ... ->1

叶数(l):3^log_8(n) n^0.5

看看树-一直到log_8(n)级树是满的,然后当我们向下走时,越来越多的内部节点缺失。通过这个理论,我们可以给出界限,

T(n) =大-Oh( j=0 to log_2( n) -1 (7/8)^j n)= ... => T(n) = O(n).T(n) = Big-Omega ( j=0 to log_8( n) -1 (7/8)^j n)= ... => T(n) = Big-Omega(n).

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

这里的要点是: T(n/2)路径具有最高长度...

这不能是一个完整的三叉树。高度=n和叶数的对数底2必须小于n ...

希望通过这种方式你可以解决这个问题。

票数 7
EN

Stack Overflow用户

发布于 2015-12-13 18:41:30

有两种方法可以解决这个问题。一种是展开递归并找到相似之处,这可能需要创造性,而且可能真的很难。另一种方法是使用Akra-Bazzi method

在本例中为g(x) = na1 = a2 = a3 = 1b1 = 1/2b2 = 1/4b3 = 1/8。解这个方程

这就是你得到的p = 0.87915。解出你将得到的积分

,这意味着复杂性是:O(n)

票数 3
EN

Stack Overflow用户

发布于 2019-12-13 15:14:48

有关的更好解释,请参见图片--

树的高度:我们取(N)(基数2),因为n/2使树比n/4和n/8更长。我们的GP系列将一直到k=logn(基数)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5628260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档