大 o 符号工作

Big o notation work

我是使用 Big-O 表示法的时间复杂度方面的新手 我有三个例子 我试着找出 Big(o)

  • 第一个例子是

     sum = 0;
     for(i=0; i<m/3; i++){
     System.out.println(“*”);
     for(j=0; j<n; j++)
     for(k=0; k<10; k=k+2)
     sum++;
     }
    

    我认为这个是 O(mn),第一个循环工作 m/3 次,第二个循环工作 n 次,第三个循环工作 10 次 然后 O(mn)

  • 第二个例子是

    sum = 100;
    for(i=0; i<n; i++){
    sum++; 
    }
    for(j=10; j<n; j++)
    for(k=1; k<m; k*=2)
     sum++;
    

    Big-O = O(log(m)),其中执行的操作数为 n + ( (n - 10) * log(m) )

  • 第三个例子是

      sum = 0;
      for(i=2; i<n; i++){
      for(j=3; j<n; j+=2){
             sum++;
      }}
     for(k=1; k<m; k*=2)
     sum++;
    

    这里我认为Big-O = log(m)n^2 ???

    正确吗???

  • 这里是:

    1. O(m/3 * n * 5) = O(mn * C) = O(mn)
    2. O(n + (n - 10) * log(m)) = O(n*log(m))
    3. O((n-2)*(n-3)/2 + log(m)) = O(n2 + log(m)) = O( n2)

    下次,请将大括号定义的代码块格式化得更清晰。
    在 3. O(n2 + log(m)) → O(n2) 因为 f(x) = x2 > g(x) = log(x), 当 x → +∞.

    UPD。您的代码(格式稍微好一点):

    sum = 0;
    // let's go from inner most loop: (n - 3)/2 actions or simpler n/2 or just n
    for(i=2; i<n; i++) {
        for(j=3; j<n; j+=2) {
            sum++;
        }
    }
    

    因为在 big-O 中常数无关紧要,即 O(5) = O(1) 或 O(18 * x5) = O(x5).
    例如,这就是为什么 big-O 中的 log 没有基数:O(log2x) = O(log(x) / log(2)) = O(log(x) * Const) = O(log(x)),其中 log - 是自然对数(底数是 e

    我们再来一次:

    sum = 0;    
    // n actions in inner loop n times. So it's O(n^2)
    for(i=2; i<n; i++) {
        for(j=3; j<n; j+=2) {
            sum++;
        }
    }
    // THEN there're another log(m) actions
    for(k=1; k<m; k*=2) {
        sum++;
    }
    

    所以我们求和:O(n2 + log(m)).

    现在 take a look 函数 x2 和 log(x)。如您所见,x2 的增长速度比 log(x) 快得多。通过研究当x → +∞时l(x) = log(x) / x2的极限可以得到证明。它等于零。
    这就是为什么在总和 x2 + log(x) 中第一项占主导地位。所以 [x2 + log(x)] / x2 = 1 + o-small(x),即它们在条件上相等的复杂性。这就是为什么 O(n2 + log(m)) = O(n2).

    原方程有两个不同的变量依赖。如果它们都是独立的,最好 "count" 它们都:O(n2 + log(m)).