首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >算法时间分析:递归案例的困惑

算法时间分析:递归案例的困惑
EN

Stack Overflow用户
提问于 2014-02-04 01:28:02
回答 1查看 105关注 0票数 0

我有一个关于伪码算法分析问题的问题,它涉及递归。

对于那些不知道的人,算法分析通常是指找到函数运行所需时间的顺序。因此,作为一个简单的例子,如果一个函数有2个嵌套的while循环,从1到n,则函数将花费大约n^2的时间。这对于确定程序运行所需的估计时间是非常有用的。希望这是合理的。

这是一个涉及递归的有趣问题。让我们从代码开始:

代码语言:javascript
运行
复制
Func3(A,n) {
    if(n <= 10) then return (A[1])
    k = Random(n); //Random returns a number <= n
    s = A[k]; //A constant time operation (negligible amount of time)
    if(k is even) then s = s + Func3(A,n-3); //Referred to as R1 below.
    if(k <= n/2) then s = s + Func3(A,n-9); //Referred to as R2 below.
    return(s);
}

这是一个有趣的问题,因为你必须仔细考虑k的可能性,以及k是随机选择的。

让我们取100元。那么,k的最坏可能值是什么(最坏的意思是导致程序运行时间最长的值)?人们最初可能会认为k=100将是最坏的值,因为这将导致这两个递归运行最多次,因为从R1调用n的n的次数很少。R1将被n=97击中,现在在随后的递归中R1或R2可能会被击中(请记住,每次程序运行时都会随机选择k)。如果不是在循环的每个级别,那么很可能至少会在随后的大量递归循环的每个级别上命中其中一个。

但是,这只会导致一个递归运行,而另一个被忽略。也许另一个最坏的情况是,k= 50,正好是n的一半,是一个偶数。然后,R1和R2在第一次运行时都会被击中。这不仅需要花费两倍的时间,而且现在这两个递归都在运行,因此在随后的循环中发生进一步递归的可能性是原来的两倍。例如,取n= 100,k= 50。然后R1和R2分别被n=97和n=91击中。然而,现在我们有两个递归循环,因此有两倍的可能会发生进一步的递归调用(想想看:如果对于随机选择,K1 = 97和K2 = 40,在从原始运行调用的那些R1/R2递归调用中会发生什么?)。

这里的时机最坏的情况是什么?估计值(使用概率)是多少?R1 = 1/2的机会,而R2 =1/2的机会)渐近运行时间?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-04 01:39:05

最好的例子是O(1),最坏的情况是O(n)

最好的情况是一个非常微不足道的证明,因为最初的n可能不到10。

最坏的情况也不难证明。基本上,您必须认识到,这里的每个操作都与您选择的n成正比。k偶数或小于n/2的概率都是O(an)的形式,因为常量实际上并不重要,它只是O(n)

在那之后,这只是一个游戏,你的数字接近一个小于10的数字。因为您要减去常量,而且这两个条件不取决于n的大小,所以它们也必须是形式O(an)。由于在大O表示法中不考虑常量,所以您不可能比O(n)做得更糟。

如果你有什么问题请告诉我。

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

https://stackoverflow.com/questions/21541330

复制
相关文章

相似问题

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