关注的重要标志是什么?

时间:2013-12-01 22:40:58

标签: java algorithm big-o time-complexity

我无法弄清楚这两个人的最小障碍

我想到了第一个的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 ;
}

4 个答案:

答案 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 - 循环内发生的迭代次数。

  1. ex1 = O(log(n)) for - 循环迭代log3(n)

    r = n/30 + n/31 + n/32 + n/33 + ... + n/3log3(n)

  2. 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)

第一个练习:

enter image description here

第二个练习(非常昂贵的算法,应该避免):

请注意,一般案例执行是由c分解的,而唯一的 n!告诉基本案例的数量(ex5(0) == 1)。对两者进行求和将得出确切的递归调用数。

enter image description here