Notes
Slide Show
Outline
1
CS 332: Algorithms
  • Asymptotic Performance
2
Review: Asymptotic Performance
  • Asymptotic performance: How does algorithm behave as the problem size gets very large?
      • Running time
      • Memory/storage requirements
    • Remember that we use the RAM model:
      • All memory equally expensive to access
      • No concurrent operations
      • All reasonable instructions take unit time
        • Except, of course, function calls
      • Constant word size
        • Unless we are explicitly manipulating bits
3
Review: Running Time
  • Number of primitive steps that are executed
    • Except for time of executing a function call most statements roughly require the same amount of time
    • We can be more exact if need be
  • Worst case vs. average case
4
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
5
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
6
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
7
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
8
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
9
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
10
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
11
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
12
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
13
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
14
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
15
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
16
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
17
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
18
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
19
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
20
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
21
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
22
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
23
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
24
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
25
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
26
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
27
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
28
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
29
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
30
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
31
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
32
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
33
An Example: Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
34
Animating Insertion Sort
  • Check out the Animator, a java applet at:
    http://www.cs.hope.edu/~alganim/animator/Animator.html


  • Try it out with random, ascending, and descending inputs
35
Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
36
Insertion Sort
  • InsertionSort(A, n) {
    for i = 2 to n {
    key = A[i]
    j = i - 1;
    while (j > 0) and (A[j] > key) {
    A[j+1] = A[j]
    j = j - 1
    }
    A[j+1] = key
    }
  • }
37
Insertion Sort
  • Statement Effort
  • InsertionSort(A, n) {
  • for i = 2 to n { c1n
  • key = A[i] c2(n-1)
  • j = i - 1; c3(n-1)
  • while (j > 0) and (A[j] > key) { c4T
  • A[j+1] = A[j] c5(T-(n-1))
  • j = j - 1 c6(T-(n-1))
  • } 0
  • A[j+1] = key c7(n-1)
  • } 0
  • }
  • T = t2 + t3 + … + tn where ti is number of while expression evaluations for the  ith for loop iteration
38
Analyzing Insertion Sort
  • T(n) = c1n + c2(n-1) + c3(n-1) + c4T + c5(T - (n-1)) + c6(T - (n-1)) + c7(n-1)
          = c8T + c9n + c10
  • What can T be?
    • Best case -- inner loop body never executed
      • ti = 1 è T(n) is a linear function
    • Worst case -- inner loop body executed for all previous elements
      • ti = i è T(n) is a quadratic function
    • Average case
      • ???
39
Analysis
  • Simplifications
    • Ignore actual and abstract statement costs
    • Order of growth is the interesting measure:
      • Highest-order term is what counts
        • Remember, we are doing asymptotic analysis
        • As the input size grows larger it is the high order term that dominates

40
Upper Bound Notation
  • We say InsertionSort’s run time is O(n2)
    • Properly we should say run time is in O(n2)
    • Read O as “Big-O” (you’ll also hear it as “order”)
  • In general a function
    • f(n) is O(g(n)) if there exist positive constants c and n0 such that f(n) £ c × g(n) for all n ³ n0
  • Formally
    • O(g(n)) = { f(n): $ positive constants c and n0 such that f(n) £ c × g(n) " n ³ n0
41
Insertion Sort Is O(n2)
  • Proof
    • Suppose runtime is  an2 + bn + c
      • If any of  a, b, and c are less than 0 replace the constant with its absolute value
    • an2 + bn + c £ (a + b + c)n2 + (a + b + c)n + (a + b + c)
    • £ 3(a + b + c)n2 for n ³ 1
    • Let c’ = 3(a + b + c) and let n0 = 1
  • Question
    • Is InsertionSort O(n3)?
    • Is InsertionSort O(n)?
42
Big O Fact
  • A polynomial of degree k is O(nk)
  • Proof:
    • Suppose f(n) = bknk + bk-1nk-1 + … + b1n + b0
      • Let ai = | bi |
    • f(n) £ aknk + ak-1nk-1 + … + a1n + a0
43
Lower Bound Notation
  • We say InsertionSort’s run time is W(n)
  • In general a function
    • f(n) is W(g(n)) if $ positive constants c and n0 such that 0 £ c×g(n) £ f(n)  " n ³ n0
  • Proof:
    • Suppose run time is an + b
      • Assume a and b are positive (what if b is negative?)
    • an £ an + b
44
Asymptotic Tight Bound
  • A function f(n) is Q(g(n)) if $ positive constants c1, c2, and n0 such that

    c1 g(n)
    £ f(n) £ c2 g(n) " n ³ n0


  • Theorem
    • f(n) is Q(g(n)) iff f(n) is both O(g(n)) and W(g(n))
    • Proof: someday
45
Practical Complexity
46
Practical Complexity
47
Practical Complexity
48
Practical Complexity
49
Practical Complexity
50
Other Asymptotic Notations
  • A function f(n) is o(g(n)) if $ positive constants c and n0 such that
    f(n) < c g(n)
    " n ³ n0
  • A function f(n) is w(g(n)) if $ positive constants c and n0 such that
    c g(n) < f(n)
    " n ³ n0
  • Intuitively,
51
Up Next
  • Solving recurrences
    • Substitution method
    • Master theorem