Computer Algorithms II Lecture Notes

4 October 2007 • Performance Estimation in Practice


Outline

Remember This?

string read

while getline(cin, str)
  read += str

for i = 0 to read.size()
  if read[i] == '<'
    // process tag

And This?

string read

while getline(cin, str)
  read += str
  for i = 0 to read.size()
    if read[i] == '<'
      // process tag
      read[i] = ' '

Let's Estimate!

while getline(cin, str)
  read += str

for i = 0 to read.size()
  if read[i] == '<'
    // process tag

Basic Statements

while getline(cin, str) : O(1)
  read += str : O(1)

for i = 0 to read.size() : O(1)
  if read[i] == '<' : O(1)
    // process tag : O(1)

Compound Statements

while O(1) : O(n)
  O(1)

for O(1)
  if O(1) : O(1)
    O(1)

Iteration Statements

O(n)

for O(1) : O(1)
  O(1)

Statement Sequences

O(n)

O(n)

Second Program

while getline(cin, str) : O(1)
  read += str : O(1)
  for i = 0 to read.size() : O(1)
    if read[i] == '<' : O(1)
      // process tag : O(1)
      read[i] = ' ' : O(1)

Compound Statements

while O(1)
  O(1)
  for O(1)
    if O(1)
      O(1)
      O(1)

while O(1)
  O(1)
  for O(1)
    O(1)

while O(1)
  O(1)
  O(n)

Finishing Up

while O(1) : O(n)
  O(n)

Does It?

Static Arrays vs. Dynamic Data

Dynamic Arrays

Implementation

class sequence
  T * data;
  unsigned next-data, max-data

  append(T e)

    if next-data >= max-data
      new-data = new [++max-data] T
      for i = 0 to next-data - 1
        new-data[i] = data[i]
      delete [] data
      data = new-data

    data[next-data++] = e    

Appending Costs

Worst-Case Analysis

if next-data >= max-data : O(1)
  new-data = new [++max-data] T : O(1)?/O(n)
  for i = 0 to next-data - 1 : O(1)
    new-data[i] = data[i] : O(1)
  delete [] data : O(1)?/O(n)
  data = new-data : O(1)
data[next-data++] = e : O(1)

if O(1)
  O(1) or O(n)
  for O(1) : O(n)
    O(1)
  O(1) or O(n)
O(1)

Worst-Case Appending

if O(1)
  O(1) or O(n)
  O(n)
  O(1) or O(n)
O(1)

if O(1)
  O(n)
O(1)

O(n)
O(1)

O(n)

So?

Sloppy Analysis

Less Sloppy Analysis

Better Behavior

Amortized Sequences

class sequence

  T * data
  unsigned next-data, max-data
  unsigned a = 50

  append(T e)

    if next-data >= max-data
      new-data = new [max-data += a] T
      for i = 0 to next-data - 1
        new-data[i] = data[i]
      delete [] data
      data = new-data

    data[next-data++] = e 

Worst-Case Analysis

if next-data >= max-data : O(1)
  new-data = new [max-data += a] T : O(n)
  for i = 0 to next-data - 1 : O(1)
    new-data[i] = data[i] : O(1)
  delete [] data : O(n)
  data = new-data : O(1)
data[next-data++] = e : O(1)

Amortization Effects

Less Sloppy Analysis.

Less Sloppy Analysis..

Does It?

amortization in effect

amortization in effect

Asymptotically Better Behavior

Multiplicative Sequences

class sequence

  T * data
  unsigned next-data, max-data

  append(T e)

    if next-data >= max-data
      new-data = new [max-data *= 2] T
      for i = 0 to next-data - 1
        new-data[i] = data[i]
      delete [] data
      data = new-data

    data[next-data++] = e 

Analysis.

Analysis..

Does It?


This page last modified on 9 October 2007.

This work's CC license.