Data Structures & Algorithms Lecture Notes

15 October 2009 • Performance Estimation in Practice


Outline

Remember This?

StringBuilder read

while str = input.readline()
  read.append(str)

for i = 0 to read.length()
  if read.charAt(i) == '<'
    // process tag

And This?

StringBuilder read

while str = input.readline()
  read.append(str)
  for i = 0 to read.length()
    if read.charAt(i) == '<'
      // process tag
      read.setCharAt(i, ' ')

Let's Estimate!

while str = input.readline()
  read.append(str)

for i = 0 to read.length()
  if read.charAt(i) == '<'
    // process tag

Basic Statements

while str = input.readline() : O(1)
  read.append(str) : O(1)

for i = 0 to read.length() : O(1)
  if read.charAt(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 str = input.readline() : O(1)
  read.append(str) : O(1)
  for i = 0 to read.length() : O(1)
    if read.charAt(i) == '<' : O(1)
      // process tag : O(1)
      read.setCharAt(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
  Object data []
  int next-data

  append(T e)

    if next-data ≥ data.length()
      Object new-data [] = 
        new Object [data.length() + 1]
      for i = 0 to data.length() - 1
        new-data[i] = data[i]
      data = new-data

    data[next-data++] = e

Appending Costs

Worst-Case Analysis

if next-data ≥ data.length() : O(1)
  Object new-data [] = new 
    Object [data.length() + 1] : O(1)?/O(n)
  for i = 0 to data.length() - 1 : O(1)
    new-data[i] = data[i] : O(1)
  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
  Object data []
  int next-data
  unsigned a = 50

  append(T e)

    if next-data ≥ data.length()
      Object new-data [] = 
        new Object [data.length() + a]
      for i = 0 to data.length() - 1
        new-data[i] = data[i]
      data = new-data

    data[next-data++] = e

Worst-Case Analysis

 if next-data ≥ data.length() : O(1)
  Object new-data [] = new 
    Object [data.length() + a] : O(n)
  for i = 0 to data.length() - 1 : O(1)
    new-data[i] = data[i] : O(1)
  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

  Object data []
  int next-data

  append(T e)

    if next-data ≥ data.length()
      Object new-data [] = 
        new Object [data.length()*2]
      for i = 0 to data.length() - 1
        new-data[i] = data[i]
      data = new-data

    data[next-data++] = e

Analysis.

Analysis..

Does It?

Summary


This page last modified on 12 October 2009.

Creative
    Commons License