MCS231Week9

advertisement


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
Download