Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 此算法的最坏情况运行时间(如何证明)?_Algorithm_Recursion_Analysis - Fatal编程技术网

Algorithm 此算法的最坏情况运行时间(如何证明)?

Algorithm 此算法的最坏情况运行时间(如何证明)?,algorithm,recursion,analysis,Algorithm,Recursion,Analysis,我有一个我正在尝试实现的算法。我被要求确定一个描述其最坏运行时间的函数。作为输入,它需要一个长度一定的数组(我们称之为n)。那么它的作用是: if (n==0){ return 0;} else if(n==1){return A[0];} else{ return f(n-1)+f(n-2) } 抱歉,如果我对实现细节有点疏漏,但在某种意义上,它与fibbanoci序列类似。我认为这个算法最糟糕的运行时间是t(n)=2^n,因为如果n很大,它将分解成两个单独的计算,然后再分解成两个

我有一个我正在尝试实现的算法。我被要求确定一个描述其最坏运行时间的函数。作为输入,它需要一个长度一定的数组(我们称之为n)。那么它的作用是:

if (n==0){ return 0;}
else if(n==1){return A[0];}
else{
     return f(n-1)+f(n-2)
}

抱歉,如果我对实现细节有点疏漏,但在某种意义上,它与fibbanoci序列类似。我认为这个算法最糟糕的运行时间是t(n)=2^n,因为如果n很大,它将分解成两个单独的计算,然后再分解成两个,以此类推。我只是不知道如何正式证明这一点,让我们首先得到运行时的递归

T(0) = T(1) = 1
因为两者都只返回一个数字(一个是数组查找,但这也是常数时间)。对于
n>1
我们有

T(n) = T(n-1) + T(n-2) + 1
因为您计算了
f(n-1)
f(n-2)
并将两个结果相加。这与斐波那契序列本身的重现性几乎相同,
F(n)=F(n-1)+F(n-2)
,结果密切相关

 n | T(n) | F(n)
----------------
 0 |   1  |   0
 1 |   1  |   1
 2 |   3  |   1
 3 |   5  |   2
 4 |   9  |   3
 5 |  15  |   5
 6 |  25  |   8
 7 |  41  |  13
 8 |  67  |  21
 9 | 109  |  34
10 | 177  |  55
11 | 287  |  89
如果你看这些值,你会发现

T(n) = F(n+2) + F(n-1) - 1
如果你需要的话,可以用归纳法证明这一点


因为斐波那契序列的项由
F(n)=(φ^n-(1-φ)^n)给出/√5
,其中
φ=(1+√5) /2
,你可以看到你的
f
的复杂性也是
Θ(φ^n)
,就像斐波那契序列一样。这比
Θ(2^n)
好,但仍然是指数型的,因此使用这种方法的计算只适用于较小的
n

让我们首先得到运行时间的递归

T(0) = T(1) = 1
因为两者都只返回一个数字(一个是数组查找,但这也是常数时间)。对于
n>1
我们有

T(n) = T(n-1) + T(n-2) + 1
因为您计算了
f(n-1)
f(n-2)
并将两个结果相加。这与斐波那契序列本身的重现性几乎相同,
F(n)=F(n-1)+F(n-2)
,结果密切相关

 n | T(n) | F(n)
----------------
 0 |   1  |   0
 1 |   1  |   1
 2 |   3  |   1
 3 |   5  |   2
 4 |   9  |   3
 5 |  15  |   5
 6 |  25  |   8
 7 |  41  |  13
 8 |  67  |  21
 9 | 109  |  34
10 | 177  |  55
11 | 287  |  89
如果你看这些值,你会发现

T(n) = F(n+2) + F(n-1) - 1
如果你需要的话,可以用归纳法证明这一点


因为斐波那契序列的项由
F(n)=(φ^n-(1-φ)^n)给出/√5
,其中
φ=(1+√5) /2
,你可以看到你的
f
的复杂性也是
Θ(φ^n)
,就像斐波那契序列一样。这比
Θ(2^n)
好,但仍然是指数型的,因此使用这种方法的计算只适用于较小的
n

参见谢谢。然而,我想找一点解释,说明你是如何准确地确定这些事情的。我环顾四周,但人们似乎只是开始在没有好的解释的情况下到处乱扔符号和答案。我对这整件事有点陌生,没有快速的答案。为了证明您的结果,您需要了解算法复杂性上下文中的递归关系。关于我链接的问题的公认答案链接到了一个解释它的页面:(参见标题“重复关系”和其他)根据代码显示,没有最坏的情况,您只使用[0],无论n的值是多少。。。给我们看更多谢谢。然而,我想找一点解释,说明你是如何准确地确定这些事情的。我环顾四周,但人们似乎只是开始在没有好的解释的情况下到处乱扔符号和答案。我对这整件事有点陌生,没有快速的答案。为了证明您的结果,您需要了解算法复杂性上下文中的递归关系。关于我链接的问题的公认答案链接到了一个解释它的页面:(参见标题“重复关系”和其他)根据代码显示,没有最坏的情况,您只使用[0],无论n的值是多少。。。告诉我们更多如果[0]==1OP定义不正是斐波那契序列的定义吗?斐波那契计算也添加了这两个子案例。那么为什么会有差异呢?上一次返回中的确切代码略有不同,但复杂程度相同。这只是与其他数组元素的比较。@WillNess无论
a[0]
是什么,序列都将是
a[0]*F(n)
,因此,用朴素的方法计算它的复杂性正是用朴素的方法计算它的复杂性。计算成本
F(n)
这种简单的方法通常被称为
nfib(n)
,可以用上面的斐波那契数来表示;我已编辑以澄清这句话,并对打扰表示歉意。:)@意志力是的,我想对于那些不能读懂我的思想的人来说,这更清楚了,谢谢。如果
A[0]==1
OP的定义不正是斐波那契序列的定义吗?斐波那契计算也添加了这两个子案例。那么为什么会有差异呢?上一次返回中的确切代码略有不同,但复杂程度相同。这只是与其他数组元素的比较。@WillNess无论
a[0]
是什么,序列都将是
a[0]*F(n)
,因此,用朴素的方法计算它的复杂性正是用朴素的方法计算它的复杂性。计算成本
F(n)
这种简单的方法通常被称为
nfib(n)
,可以用上面的斐波那契数来表示;我已编辑以澄清这句话,并对打扰表示歉意。:)@是的,我想这对那些不能读懂我心思的人来说更清楚了,谢谢。