Algorithm 此算法的最坏情况运行时间(如何证明)?
我有一个我正在尝试实现的算法。我被要求确定一个描述其最坏运行时间的函数。作为输入,它需要一个长度一定的数组(我们称之为n)。那么它的作用是: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很大,它将分解成两个单独的计算,然后再分解成两个
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)
,可以用上面的斐波那契数来表示;我已编辑以澄清这句话,并对打扰表示歉意。:)@是的,我想这对那些不能读懂我心思的人来说更清楚了,谢谢。