O: order of magnitude Look at the loops and to see whether the loops are nested. ◦ One single loop: O(n) ◦ A nested loop: O(n2) ◦ A nested loop in a loop: O(n3) for (int i=0; i<n; i++) for (int j=0; j< n; j++) n2 simple statement for(int k=0; k< n; k++) { simple statement 1 simple statement 2 simple statement 3 simple statement 4 simple statement 5 } Simple statement 6 …… Simple statement 30 5n 25 T(n) = n2 + 5n + 25 Or T(n) = O(f(n)) These exists two constants, n0 and c (>0) and a function f(n) such that all n>n0, cf(n) T(n). Translate as: If n gets sufficiently large, there is some constants c for which processing time will always be less than or equal to cf(n). cf(n) is an upper bound on the performance. The growth rate of f(n) will be determined by the growth rate of the fastest growing term It’s safe to ignore all constants and drop the lower order terms when determining the Big O for an algorithm for (int i=0; i< n-1; i++) { for (int j=i+1; j<n; j++) { Simple statement 1 Simple statement 2 Simple statement 3 } } T(n) = 3(n-1) +3(n-2) + 3(n-3)+…..+3 = 3(n-1+n-2+n-3+….+1) = 3n(n-1)/2 = 1.5n2 -1.5n n0=1, c = 1.5 1.5n2 1.5n2-1.5n for (i=0; i< x.length; i *=2) { // print out i } - The loop body will execute k-1 times with i: 1,2,4,8,16… until 2k > x.length - 2k-1 <= x.length < 2k - K-1 <= log2(x.length) < k - So this loop has O(log2n) 1. for (int i=0; i<n; i++) for (int j=0; j<n; j++) System.out.println(i+” “+j); 2. for (int i=0; i<n; i++) for (int j=0; j<2; j++) System.out.println(i+” “+j); 3. for (int i=0; i<n; i++) for (int j=n-1; j>=i; j--) System.out.println(i+” “+j); 4. for (int i=0; i<n; i++) for (int j=0; j<i; j++) if (j %i == 0) System.out.println(i+” “+j); for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) for (int k=n; k>=1 ; k--) { Int sum = i+j+k; } } } If T(n) is the form of a polynomial of degree d (d is the highest exponent), then it is O(nd). O(1) represents a constant growth rate. This value doesn’t change with the number of inputs. Any finite number of O(1) steps is still O(1) public static boolean areUnique(int[] x) { for(int i=0; i< x.length; i++) { for (int j=0; j<x.length; j++) { if (i != j && x[i] == x[j]) return false; } } return true; } Big O Name O(1) Constant O(log n) Logarithmic O(n) Linear O(n log n) Log-linear O(n2) Quadratic O(n3) Cubic O(2n) Exponential O(n!) Factorial 15