I used this set of slides for the lecture on Complexity I gave at the University of Zurich for the 1st year students following the course of Formale Grundlagen der Informatik.
3. memory
bandwidth
Computation requires resources
time
...
4.
5. 1 public long factorial (int n) {
2 long factorial = 1;
3 int i = 1;
4 while ( i ≤ n ) {
5 factorial = factorial * i;
6 i = i + 1;
7 }
8 return factorial
9 }
6. 1 public long factorial (int n) {
2 long factorial = 1; 1
3 int i = 1; 1
4 while ( i ≤ n ) { 4
5 factorial = factorial * i; 4
6 i = i + 1; 3
7 }
8 return factorial 1
9 }
7. 1 public long factorial (int n) {
2 long factorial = 1; 1 1
3 int i = 1; 1 1
4 while ( i ≤ n ) { 4 n
5 factorial = factorial * i; 4 n
6 i = i + 1; 3 n
7 }
8 return factorial 1 1
9 }
8. 1 public long factorial (int n) {
2 long factorial = 1; 1 1
3 int i = 1; 1 1
4 while ( i ≤ n ) { 4 n
5 factorial = factorial * i; 4 n
6 i = i + 1; 3 n
7 }
8 return factorial 1 1
9 }
f(n) = 1+1+4*n+4*n+3*n+1 = 11*n+3
9. Big O Notation
f: N -> N
g: N -> N
f ∈ O(g)
∃ c, n0 :
(c,n0∈N) ∧ (c>0) :
(∀n : n∈N ∧ n>n0 : f(n) ≤ c*g(n))
10. Big O Notation
f: N -> N
g: N -> N
f ∈ O(g)
∃ c, n0 :
(c,n0∈N) ∧ (c>0) :
(∀n : n∈N ∧ n>n0 : f(n) ≤ c*g(n))
f: N % N, f(n)=11*n+3.
f ∈ O(n)
14. N log N N log N N2 2N N!
10 3 33 100 1024 2*106
20 4 86 400 106 2*1018
100 7 664 10’000 1031 10157
1’000 10 10’000 106
10 2 s =
1.
10’000 13 130’000 108 10 4 s = 7 minutes
2.
10 5 s = 8 hours
1.1 day
100’000 17 106 1010
10 s =
6 s
1.6 we
10 s =
7 eks
3.8 mo
10 s =
8 nths
1’000’000 1’000 2*107 1012 3.1 yea
10 s =
9 rs
3.1 dec
10 10 s a
= 3.1 c des
10 11 s enturie
= neve s
r :)
17. a b c d e f g
a 0 2 3 0 0 0 0
a e b 0 0 1 0 0 0 0
3 5 3
2 c 0 0 0 2 0 0 0
2 c d g
d 0 0 0 0 5 4 0
1 4 3 e 0 0 0 0 0 0 3
b f
f 0 0 0 0 0 0 3
g 0 0 0 0 0 0 0
18. a b c d e f g
a 0 2 3 0 0 0 0
a e b 0 0 1 0 0 0 0
3 5 3
2 c 0 0 0 2 0 0 0
2 c d g
d 0 0 0 0 5 4 0
1 4 3 e 0 0 0 0 0 0 3
b f
f 0 0 0 0 0 0 3
g 0 0 0 0 0 0 0
procedure FloydWarshall ()
for k := 1 to n
for i := 1 to n
for j := 1 to n
path[i][j] = min ( path[i][j], path[i][k]+path[k][j] );
25. Worst case: n steps
Best case: 1 step
Average case: n/2 steps
4 2 5 1 6 3
ch
: Line ar sear
E xample
26. Best case estimation
f: N -> N
g: N -> N
f ∈ Ω(g)
∃ c, n0 :
(c,n0∈N) ∧ (c>0) :
(∀n : n∈N ∧ n>n0 : f(n) ≥ c*g(n))
27. Best case estimation
f: N -> N
g: N -> N
f ∈ Ω(g)
∃ c, n0 :
(c,n0∈N) ∧ (c>0) :
(∀n : n∈N ∧ n>n0 : f(n) ≥ c*g(n))
(3n2+6n+9)*log(1+2n) ≤ 36 n2 * log n
(3n2+6n+9)*log(1+2n) ∈ O(n2 * log n)
28. Best case estimation
f: N -> N
g: N -> N
f ∈ Ω(g)
∃ c, n0 :
(c,n0∈N) ∧ (c>0) :
(∀n : n∈N ∧ n>n0 : f(n) ≥ c*g(n))
(3n2+6n+9)*log(1+2n) ≤ 36 n2 * log n
(3n2+6n+9)*log(1+2n) ∈ O(n2 * log n)
(3n2+6n+9)*log(1+2n) ≥ n2 * log n
(3n2+6n+9)*log(1+2n) ∈ Ω(n2 * log n)
29. Average case estimation
f: N -> N
g: N -> N
f ∈ θ(g)
∃ c 1, c 2, n 0 :
(c1,c2,n0∈N) ∧ (c1>0) ∧ (c2>0):
(∀n : n∈N ∧ n≥n0 : c1*g(n) ≤ f(n) ≤ c2*g(n))
30. Average case estimation
f: N -> N
g: N -> N
f ∈ θ(g)
∃ c 1, c 2, n 0 :
(c1,c2,n0∈N) ∧ (c1>0) ∧ (c2>0):
(∀n : n∈N ∧ n≥n0 : c1*g(n) ≤ f(n) ≤ c2*g(n))
(3n2+6n+9)*log(1+2n) ∈ O(n2 * log n)
31. Average case estimation
f: N -> N
g: N -> N
f ∈ θ(g)
∃ c 1, c 2, n 0 :
(c1,c2,n0∈N) ∧ (c1>0) ∧ (c2>0):
(∀n : n∈N ∧ n≥n0 : c1*g(n) ≤ f(n) ≤ c2*g(n))
(3n2+6n+9)*log(1+2n) ∈ O(n2 * log n)
(3n2+6n+9)*log(1+2n) ∈ Ω(n2 * log n)
32. Average case estimation
f: N -> N
g: N -> N
f ∈ θ(g)
∃ c 1, c 2, n 0 :
(c1,c2,n0∈N) ∧ (c1>0) ∧ (c2>0):
(∀n : n∈N ∧ n≥n0 : c1*g(n) ≤ f(n) ≤ c2*g(n))
(3n2+6n+9)*log(1+2n) ∈ O(n2 * log n)
(3n2+6n+9)*log(1+2n) ∈ Ω(n2 * log n)
(3n2+6n+9)*log(1+2n) ∈ θ(n2 * log n)
33. boolean f ( int[][] a , int n ) {
for ( int i = 0 ; i < n ; i++ ) {
for ( int j = i + 1 ; j < n ; j++ ) {
if ( a[i][j] == 0 ) {return false;}
}
return true;
}
}
E xample
34. boolean f ( int[][] a , int n ) {
for ( int i = 0 ; i < n ; i++ ) {
for ( int j = i + 1 ; j < n ; j++ ) {
if ( a[i][j] == 0 ) {return false;}
}
return true;
}
}
f ∈ O(n2)
f ∈ Ω(1)
f ∈ θ(n2)
E xample