我无法弄清楚这两个人的最小障碍
我想到了第一个的log3(n) 和O(n!)为第二,但我不确定,因为我还没有真正理解这个主题
public int ex1 ( int n ) {
int r = 0 ;
for ( int i = 1 ; i < n ; i++) {
r += n ;
n = n / 3 ;
}
return r ;
}
public static int ex5 ( int n ) {
int r = 1 ;
for ( int i = 0 ; i < n ; i ++) {
r += ex5 ( n - 1 ) ;
}
return r ;
}
答案 0 :(得分:4)
ex5的输出值对应于sequence A000522 at oeis.org,其增加为a(n)= Sum_ {k = 0..n} n!/ k! (或n!到第一近似值)。由于这个函数被编码的可怕方式,这等于函数的时间复杂度。
更好的算法如下:
public static int ex5 ( int n ) {
return (n) ? 1 + n * ex5(n-1) : 1;
}
这显然是 O(n ^ 2) O(n)(对不起,已经很晚了,我需要睡觉!)。
编辑:正如其他人所说,ex1的复杂性是O(log_3(n)),或简称为O(log(n)),因为log_3(n)= log(n )/ log(3),log(3)在任何基数中都是常数。
答案 1 :(得分:0)
第一个将执行到i < log_3(N)
,这可以说是O(log_3(N))
第二个似乎是递归的递归。该函数似乎为每个i!
递归i < N
次。
F(3) = {F(2) + F(1)} + {F(1)}
F(4) = {F(3) + F(2) + F(1)} + {F(2) + F(1)} + {F(1}}
答案 2 :(得分:0)
在每种情况下,您只需要考虑for
- 循环内发生的迭代次数。
ex1 = O(log(n))
for
- 循环迭代log3(n)
次
r = n/30 + n/31 + n/32 + n/33 + ... + n/3log3(n)
ex5 = O(n!)
for循环为n
迭代f(n)
次,每次迭代调用f(n-1)
,因此总迭代次数为{ {1}},其中|f(n)| = n*|f(n-1)|
。递归地使用这个给出:
|f(n)| = # of iterations in f(n)
答案 3 :(得分:0)
第一个练习:
第二个练习(非常昂贵的算法,应该避免):
请注意,一般案例执行是由c分解的,而唯一的 n!告诉基本案例的数量(ex5(0) == 1
)。对两者进行求和将得出确切的递归调用数。