Running Time (1.
1)
w Most algorithms transform
Analysis of Algorithms
Input
Algorithm
Output
An algorithm is a step-by-step procedure for
solving a problem in a finite amount of time.
best case
average case
worst case
120
100
Running Time
input objects into output
objects.
w The running time of an
algorithm typically grows
with the input size.
w Average case time is often
difficult to determine.
w We focus on the worst case
running time.
80
60
40
20
Easier to analyze
Crucial to applications such as
games, finance and robotics
1000
2000
3000
Analysis of Algorithms
Experimental Studies ( 1.6)
w Write a program
w It is necessary to implement the
8000
algorithm, which may be difficult
7000
Time (ms)
Limitations of Experiments
9000
implementing the
algorithm
w Run the program with
inputs of varying size and
composition
w Use a method like
System.currentTimeMillis() to
get an accurate measure
of the actual running time
w Plot the results
4000
Input Size
w Results may not be indicative of the
6000
running time on other inputs not included
in the experiment.
w In order to compare two algorithms, the
same hardware and software
environments must be used
5000
4000
3000
2000
1000
0
0
50
100
Input Size
Analysis of Algorithms
Theoretical Analysis
Pseudocode (1.1)
Example: find max
element of an array
of an algorithm
More structured than Algorithm arrayMax(A, n)
English prose
Input array A of n integers
Less detailed than a
Output maximum element of A
program
currentMax A[0]
Preferred notation for
for i 1 to n 1 do
describing algorithms
if A[i] > currentMax then
Hides program design
currentMax A[i]
issues
return currentMax
w High-level description
w Uses a high-level description of the
algorithm instead of an implementation
w Characterizes running time as a
function of the input size, n.
w Takes into account all possible inputs
w Allows us to evaluate the speed of an
algorithm independent of the
hardware/software environment
Analysis of Algorithms
Analysis of Algorithms
w
w
w
w
Analysis of Algorithms
The Random Access Machine
(RAM) Model
Pseudocode Details
w Method call
w Control flow
n
n
n
n
n
if then [else ]
while do
repeat until
for do
Indentation replaces braces
w Method declaration
Algorithm method (arg [, arg])
Input
Output
w A CPU
var.method (arg [, arg])
w Return value
w An potentially unbounded
return expression
w Expressions
bank of memory cells,
each of which can hold an
arbitrary number or
character
Assignment
(like = in Java)
= Equality testing
(like == in Java)
n 2 Superscripts and other
mathematical
formatting allowed
w Memory cells are numbered and accessing
any cell in memory takes unit time.
Analysis of Algorithms
w
w
w
w
performed by an algorithm
Identifiable in pseudocode
Largely independent from the
programming language
Exact definition not important
(we will see why later)
Assumed to take a constant
amount of time in the RAM
model
w By inspecting the pseudocode, we can determine the
w Examples:
n
n
n
maximum number of primitive operations executed by
an algorithm, as a function of the input size
Evaluating an
expression
Assigning a value
to a variable
Indexing into an
array
Calling a method
Returning from a
method
Analysis of Algorithms
Algorithm arrayMax(A, n)
currentMax A[0]
for i 1 to n 1 do
if A[i] > currentMax then
currentMax A[i]
{ increment counter i }
return currentMax
# operations
2
2 +n
2(n 1)
2(n 1)
2(n 1)
1
Total
Estimating Running Time
7n 1
Analysis of Algorithms
10
Growth Rate of Running Time
w Algorithm arrayMax executes 7n 1 primitive
w Changing the hardware/ software
operations in the worst case. Define:
environment
a = Time taken by the fastest primitive operation
b = Time taken by the slowest primitive operation
w Let T(n) be worst-case time of arrayMax. Then
a (7n 1) T(n) b(7n 1)
Affects T(n) by a constant factor, but
Does not alter the growth rate of T(n)
w The linear growth rate of the running
w Hence, the running time T(n) is bounded by two
linear functions
Analysis of Algorithms
Analysis of Algorithms
Counting Primitive
Operations (1.1)
Primitive Operations
w Basic computations
11
time T(n) is an intrinsic property of
algorithm arrayMax
Analysis of Algorithms
12
Growth Rates
Constant Factors
functions:
n
n
Linear n
Quadratic n2
Cubic n 3
T (n )
w In a log-log chart,
the slope of the line
corresponds to the
growth rate of the
function
1E+30
1E+28
1E+26
1E+24
1E+22
1E+20
1E+18
1E+16
1E+14
1E+12
1E+10
1E+8
1E+6
1E+4
1E+2
1E+0
1E+0
w The growth rate is
Cubic
not affected by
Quadratic
constant factors or
lower-order terms
Linear
w Examples
T ( n)
w Growth rates of
102 n + 105 is a linear
function
105 n2 + 108 n is a
quadratic function
1E+26
1E+24
1E+22
1E+20
1E+18
1E+16
1E+14
1E+12
1E+10
1E+8
1E+6
1E+4
1E+2
1E+0
Quadratic
Quadratic
Linear
Linear
1E+0
1E+2
1E+4
1E+6
1E+8
1E+2
1E+4
1E+10
Analysis of Algorithms
13
f(n) cg(n) for n n0
w Example: 2n + 10 is O(n)
n
n
n
n
2n + 10 cn
(c 2) n 10
n 10/(c 2)
Pick c = 3 and n 0 = 10
1,000,000
3n
w Example: the function
2n+10
n2
n
n
n
10
10
100
n 2 cn
nc
The above inequality
cannot be satisfied
since c must be a
constant
100n
10n
n
10,000
1,000
1,000
100
10
100
1,000
n
15
Analysis of Algorithms
16
Big-Oh and Growth Rate
w The big-Oh notation gives an upper bound on the
7n-2 is O(n)
need c > 0 and n 0 1 such that 7n-2 cn for n n 0
this is true for c = 7 and n 0 = 1
growth rate of a function
w The statement f(n) is O(g(n)) means that the growth
rate of f(n) is no more than the growth rate of g(n)
+ 20n2 + 5
3n 3 + 20n2 + 5 is O(n3 )
need c > 0 and n 0 1 such that 3n3 + 20n 2 + 5 cn3 for n n 0
this is true for c = 4 and n 0 = 21
log n + log log n
3 log n + log log n is O(log n)
need c > 0 and n 0 1 such that 3 log n + log log n clog n for n n 0
this is true for c = 4 and n 0 = 2
Analysis of Algorithms
7n-2
n3
is not O(n)
10
1
More Big-Oh Examples
n 3n 3
14
n^2
100,000
Analysis of Algorithms
1E+10
Big-Oh Example
10,000
g(n), we say that f(n) is 1,000
O(g(n)) if there are
positive constants
100
c and n0 such that
1E+8
Analysis of Algorithms
Big-Oh Notation (1.2)
w Given functions f(n) and
1E+6
n
17
w We can use the big-Oh notation to rank functions
according to their growth rate
g(n) grows more
f(n) grows more
Same growth
f(n) is O(g(n))
g(n) is O(f(n))
Yes
No
Yes
No
Yes
Yes
Analysis of Algorithms
18
Big-Oh Rules
Asymptotic Algorithm Analysis
w The asymptotic analysis of an algorithm determines
w If is f(n) a polynomial of degree d, then f(n) is
O(n d), i.e.,
n
n
Drop lower-order terms
Drop constant factors
Say 2n is O(n) instead of 2n is
O(n2 )
w Use the simplest expression of the class
n
Analysis of Algorithms
eventually dropped anyhow, we can disregard them
when counting primitive operations
19
Computing Prefix Averages
asymptotic analysis with
two algorithms for prefix
averages
w The i-th prefix average of
an array X is average of the
first (i + 1) elements of X:
A[i] = (X[0] + X[1] + + X[i])/(i+1)
w Computing the array A of
35
quadratic time by applying the definition
X
A
30
Algorithm prefixAverages1(X, n)
Input array X of n integers
Output array A of prefix averages of X #operations
A new array of n integers
n
for i 0 to n 1 do
n
s X[0]
n
for j 1 to i do
1 + 2 + + (n 1)
s s + X[j]
1 + 2 + + (n 1)
A[i] s / (i + 1)
n
return A
1
25
20
15
10
0
1
Analysis of Algorithms
21
Arithmetic Progression
There is a simple visual
proof of this fact
w Thus, algorithm
prefixAverages1 runs in
O(n 2) time
20
Prefix Averages (Quadratic)
prefix averages of another
array X has applications to
financial analysis
Analysis of Algorithms
w The following algorithm computes prefix averages in
w We further illustrate
prefixAverages1 is
O(1 + 2 + + n)
w The sum of the first n
integers is n(n + 1) / 2
We determine that algorithm arrayMax executes at most
7n 1 primitive operations
We say that algorithm arrayMax runs in O(n) time
w Since constant factors and lower-order terms are
Say 3n + 5 is O(n) instead of 3n + 5 is O(3n)
w The running time of
We find the worst-case number of primitive operations
executed as a function of the input size
We express this function with big-Oh notation
w Example:
w Use the smallest possible class of functions
n
the running time in big-Oh notation
w To perform the asymptotic analysis
22
Prefix Averages (Linear)
w The following algorithm computes prefix averages in
linear time by keeping a running sum
6
5
4
3
2
1
0
Analysis of Algorithms
Analysis of Algorithms
6
23
Algorithm prefixAverages2(X, n)
Input array X of n integers
Output array A of prefix averages of X
A new array of n integers
s0
for i 0 to n 1 do
s s + X[i]
A[i] s / (i + 1)
return A
#operations
n
1
n
n
n
1
w Algorithm prefixAverages2 runs in O(n) time
Analysis of Algorithms
24
Relatives of Big-Oh
Math you need to Review
w Summations (Sec. 1.3.1)
w Logarithms and Exponents (Sec. 1.3.2)
w big-Omega
w
w
log b(xy) = logbx + logby
log b (x/y) = log bx - log by
log bxa = alogbx
log ba = logx a/log x b
w properties of exponentials:
a(b+c) = aba c
abc = (ab)c
ab /ac = a(b-c)
Proof techniques (Sec. 1.3.3) b = a loga b
b c = a c*log a b
Basic probability (Sec. 1.3.4)
Analysis of Algorithms
25
Analysis of Algorithms
26
Example Uses of the
Relatives of Big-Oh
Intuition for Asymptotic
Notation
Big-Oh
n f(n) is O(g(n)) if f(n) is asymptotically less than or equal to g(n)
big-Omega
n f(n) is (g(n)) if f(n) is asymptotically greater than or equal to g(n)
big-Theta
n f(n) is (g(n)) if f(n) is asymptotically equal to g(n)
little-oh
n f(n) is o(g(n)) if f(n) is asymptotically strictly less than g(n)
little-omega
n f(n) is (g(n)) if is asymptotically strictly greater than g(n)
Analysis of Algorithms
f(n) is (g(n)) if there is a constant c > 0
and an integer constant n0 1 such that
f(n) cg(n) for n n0
w big-Theta
n f(n) is (g(n)) if there are constants c > 0 and c > 0 and an
integer constant n 0 1 such that cg(n) f(n) cg(n) for n n0
w little-oh
n f(n) is o(g(n)) if, for any constant c > 0, there is an integer
constant n 0 0 such that f(n) cg(n) for n n 0
w little-omega
n f(n) is (g(n)) if, for any constant c > 0, there is an integer
constant n 0 0 such that f(n) cg(n) for n n 0
n
w properties of logarithms:
27
5n 2 is (n2 )
f(n) is (g(n)) if there is a constant c > 0 and an integer constant n 0 1
such that f(n) cg(n) for n n0
let c = 5 and n0 = 1
5n 2 is (n)
f(n) is (g(n)) if there is a constant c > 0 and an integer constant n 0 1
such that f(n) cg(n) for n n0
let c = 1 and n0 = 1
2
5n is (n)
f(n) is (g(n)) if, for any constant c > 0, there is an integer constant n0
0 such that f(n) cg(n) for n n0
need 5n02 cn0 given c, the n0 that satifies this is n0 c/5 0
Analysis of Algorithms
28
The Stack ADT (2.1.1)
Elementary Data
Structures
The Stack ADT stores
arbitrary objects
Insertions and deletions
follow the last-in first-out
scheme
Think of a spring-loaded
plate dispenser
Main stack operations:
Stacks, Queues, & Lists
Amortized analysis
Trees
Auxiliary stack
push(object): inserts an
element
object pop(): removes and
returns the last inserted
element
operations:
object top(): returns the
last inserted element
without removing it
integer size(): returns the
number of elements
stored
boolean isEmpty():
indicates whether no
elements are stored
Elementary Data Structures
Array-based Stack (2.1.1)
Applications of Stacks
A simple way of
Direct applications
Page-visited history in a Web browser
Undo sequence in a text editor
Chain of method calls in the Java Virtual
Machine or C++ runtime environment
Indirect applications
Auxiliary data structure for algorithms
Component of other data structures
Elementary Data Structures
Algorithm pop():
if isEmpty() then
throw EmptyStackException
else
tt1
return S[t + 1]
implementing the
Stack ADT uses an
array
We add elements
Algorithm push(o)
from left to right
if t = S.length 1 then
A variable t keeps
throw FullStackException
track of the index of
else
the top element
tt+1
(size is t+1)
S[t] o
S
0 1 2
t
Elementary Data Structures
Comparison of the
Strategies
Growable Array-based
Stack (1.5)
In a push operation, when
the array is full, instead of
throwing an exception, we Algorithm push(o)
if t = S.length 1 then
can replace the array with
A new array of
a larger one
size
How large should the new
for i 0 to t do
array be?
A[i] S[i]
incremental strategy:
increase the size by a
constant c
doubling strategy: double
the size
Elementary Data Structures
SA
tt+1
S[t] o
We compare the incremental strategy and
the doubling strategy by analyzing the total
time T(n) needed to perform a series of n
push operations
We assume that we start with an empty
stack represented by an array of size 1
We call amortized time of a push operation
the average time taken by a push over the
series of operations, i.e., T(n)/n
Elementary Data Structures
Analysis of the
Incremental Strategy
Direct Analysis of the
Doubling Strategy
We replace the array k = log2 n
We replace the array k = n/c times
The total time T(n) of a series of n push
times
operations is proportional to
n + c + 2c + 3c + 4c + + kc =
n + c(1 + 2 + 3 + + k) =
n + ck(k + 1)/2
Since c is a constant, T(n) is O(n + k2), i.e.,
O(n2)
The amortized time of a push operation is O(n)
Elementary Data Structures
The total time T(n) of a series
of n push operations is
proportional to
n + 1 + 2 + 4 + 8 + + 2k =
n + 2k + 1 1 = 2n 1
T(n) is O(n)
The amortized time of a push
operation is O(1)
geometric series
2
1
1
8
Elementary Data Structures
Accounting Method Analysis
of the Doubling Strategy
Amortization Scheme for
the Doubling Strategy
The accounting method determines the amortized
Consider again the k phases, where each phase consisting of twice
running time with a system of credits and debits
We view a computer as a coin-operated device requiring
1 cyber-dollar for a constant amount of computing.
We set up a scheme for charging operations. This
is known as an amortization scheme.
The scheme must give us always enough money to
pay for the actual cost of the operation.
The total cost of the series of operations is no more
than the total amount charged.
(amortized time) (total $ charged) / (# operations)
Elementary Data Structures
operations:
the first-in first-out scheme
Insertions are at the rear of the
queue and removals are at the
front of the queue
Main queue operations:
enqueue(object): inserts an
element at the end of the
queue
object dequeue(): removes and
returns the element at the front
of the queue
object front(): returns the
element at the front without
removing it
integer size(): returns the
number of elements stored
boolean isEmpty(): indicates
whether no elements are
stored
Exceptions
$
$
$
$
$
$
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7
We charge $3 for a push. The $2 saved for a regular push are
stored in the second half of the array. Thus, we will have
2(i/2)=i cyber-dollars saved at then end of phase i.
Therefore, each push runs in O(1) amortized time; n pushes run
in O(n) time.
Elementary Data Structures
10
Direct applications
11
Waiting lines
Access to shared resources (e.g., printer)
Multiprogramming
Indirect applications
Attempting the execution of
dequeue or front on an
empty queue throws an
EmptyQueueException
Elementary Data Structures
for the array growth for the beginning of the next phase.
Applications of Queues
The Queue ADT stores arbitrary Auxiliary queue
objects
array-growing push of the next phase.
At the end of phase i we want to have saved i cyber-dollars, to pay
The Queue ADT (2.1.2)
Insertions and deletions follow
as many pushes as the one before.
At the end of a phase we must have saved enough to pay for the
Auxiliary data structure for algorithms
Component of other data structures
Elementary Data Structures
12
Singly Linked List
Queue with a Singly Linked List
A singly linked list is a
concrete data structure
consisting of a sequence
of nodes
Each node stores
The front element is stored at the first node
The rear element is stored at the last node
The space used is O(n) and each operation of the
element
link to the next node
We can implement a queue with a singly linked list
next
Queue ADT takes O(1) time
node
elem
nodes
Elementary Data Structures
elements
13
List ADT (2.2.2)
Elementary Data Structures
Doubly Linked List
A doubly linked list provides a natural
The List ADT models a
sequence of positions
storing arbitrary objects
It allows for insertion
and removal in the
middle
Query methods:
isFirst(p), isLast(p)
first(), last()
before(p), after(p)
node
trailer
elements
Elementary Data Structures
16
Tree ADT (2.3.1)
We use positions to abstract
ComputersRUs
tree is an abstract model
of a hierarchical
structure
Sales
Manufacturing
R&D
A tree consists of nodes
with a parent-child
relation
US
International
Laptops
Desktops
Applications:
nodes/positions
15
In computer science, a
elem
header
Trees (2.3)
Organization charts
File systems
Europe
Programming
environments
next
Special trailer and header nodes
replaceElement(p, o),
swapElements(p, q)
insertBefore(p, o),
insertAfter(p, o),
insertFirst(o),
insertLast(o)
remove(p)
Elementary Data Structures
element
link to the previous node
link to the next node
Update methods:
prev
implementation of the List ADT
Nodes implement Position and store:
Accessor methods:
14
nodes
Generic methods:
Asia
Elementary Data Structures
Canada
17
integer size()
boolean isEmpty()
objectIterator elements()
positionIterator positions()
Accessor methods:
Query methods:
boolean isInternal(p)
boolean isExternal(p)
boolean isRoot(p)
Update methods:
swapElements(p, q)
object replaceElement(p, o)
Additional update methods
position root()
position parent(p)
positionIterator children(p)
may be defined by data
structures implementing the
Tree ADT
Elementary Data Structures
18
Preorder Traversal (2.3.2)
A traversal visits the nodes of a
Algorithm preOrder(v)
visit(v)
for each child w of v
preorder (w)
tree in a systematic manner
In a preorder traversal, a node is
visited before its descendants
Application: print a structured
document
1
Postorder Traversal (2.3.2)
cs16/
1. Motivations
2. Methods
4
1.2 Avidity
2.2 Ponzi
Scheme
2.3 Bank
Robbery
h1c.doc
3K
h1nc.doc
2K
internal nodes: operators
external nodes: operands
node left child and right child
binary tree is either
a tree consisting of a single node,
or
a tree whose root has an ordered
pair of children, each of which is a
binary tree
Elementary Data Structures
22
Binary tree associated with a decision process
internal nodes: questions with yes/no answer
external nodes: decisions
Example: dining decision
Want a fast meal?
How about coffee?
Elementary Data Structures
No
Yes
Alternative recursive definition: a
expression (2 (a 1) + (3 b))
We call the children of an internal
Example: arithmetic expression tree for the
Decision Tree
Binary tree associated with an arithmetic expression
arithmetic expressions
decision processes
searching
Each internal node has two
children
The children of a node are an
ordered pair
21
Arithmetic Expression Tree
20
Applications:
following properties:
The call for v costs $(cv + 1), where cv is the
number of children of v
For the call for v, charge one cyber-dollar to v and
charge one cyber-dollar to each child of v.
Each node (except the root) gets charged twice:
once for its own call and once for its parents call.
Therefore, traversal time is O(n).
Elementary Data Structures
Elementary Data Structures
A binary tree is a tree with the
of an n-node tree is proportional to the sum,
taken over each node v in the tree, of the
time needed for the recursive call for v.
6
Robot.java
20K
Stocks.java
25K
Binary Trees (2.3.3)
Time taken in preorder or postorder traversal
DDR.java
10K
19
Amortized Analysis of
Tree Traversal
todo.txt
1K
programs/
Elementary Data Structures
homeworks/
References
2.1 Stock
Fraud
Algorithm postOrder(v)
for each child w of v
postOrder (w)
visit(v)
node is visited after its
descendants
Application: compute space
used by files in a directory and
its subdirectories
9
Make Money Fast!
1.1 Greed
In a postorder traversal, a
23
On expense account?
Yes
No
Yes
No
Starbucks
In N Out
Antoine's
Dennys
Elementary Data Structures
24
Properties of Binary Trees
Notation
Inorder Traversal
In an inorder traversal a
Properties:
n number of nodes
e number of
external nodes
i number of internal
nodes
h height
e=i+1
n = 2e 1
hi
h (n 1)/2
e 2h
h log2 e
h log2 (n + 1) 1
x(v) = inorder rank of v
y(v) = depth of v
6
4
3
Elementary Data Structures
on the left (preorder)
from below (inorder)
on the right (postorder)
traversal
Element
Parent node
Sequence of children
nodes
Element
Parent node
Left child node
Right child node
Node objects implement
the Position ADT
B
F
E
C
Elementary Data Structures
28
Linked Data Structure for
Binary Trees
by an object storing
((2 (a 1)) + (3 b))
A node is represented
the Position ADT
Elementary Data Structures
27
Node objects implement
Linked Data Structure for
Representing Trees (2.3.4)
an object storing
Elementary Data Structures
A node is represented by
print operand or operator
when visiting node
print ( before traversing left
subtree
print ) after traversing right
subtree
Algorithm printExpression(v)
if isInternal (v)
print(()
inOrder (leftChild (v))
print(v.element ())
if isInternal (v)
inOrder (rightChild (v))
print ())
Specialization of an inorder
26
Printing Arithmetic Expressions
Elementary Data Structures
Generic traversal of a binary tree
Includes a special cases the preorder, postorder and inorder traversals
Walk around the tree and visit each node three times:
7
5
25
Euler Tour Traversal
Algorithm inOrder(v)
if isInternal (v)
inOrder (leftChild (v))
visit(v)
if isInternal (v)
inOrder (rightChild (v))
node is visited after its left
subtree and before its right
subtree
Application: draw a binary
tree
E
29
D
C
Elementary Data Structures
E
30
Array-Based Representation of
Binary Trees
nodes are stored in an array
1
A
3
B
let rank(node) be defined as follows:
4
rank(root) = 1
if node is the left child of parent(node),
rank(node) = 2*rank(parent(node))
if node is the right child of parent(node),
rank(node) = 2*rank(parent(node))+1
Elementary Data Structures
5
E
7
C
10
11
G
H
31
Outline and Reading
The Stack ADT (2.1.1)
Applications of Stacks (2.1.1)
Array-based implementation (2.1.1)
Growable array-based stack (1.5)
Stacks
Stacks
Abstract Data Types (ADTs)
An abstract data
type (ADT) is an
abstraction of a
data structure
An ADT specifies:
Data stored
Operations on the
data
Error conditions
associated with
operations
The Stack ADT
Example: ADT modeling a
simple stock trading system
The data stored are buy/sell
orders
The operations supported are
order buy(stock, shares, price)
order sell(stock, shares, price)
void cancel(order)
The Stack ADT stores
arbitrary objects
Insertions and deletions
follow the last-in first-out
scheme
Think of a spring-loaded
plate dispenser
Main stack operations:
Error conditions:
Buy/sell a nonexistent stock
Cancel a nonexistent order
Stacks
Exceptions
push(object): inserts an
element
object pop(): removes and
returns the last inserted
element
Auxiliary stack
operations:
object top(): returns the
last inserted element
without removing it
integer size(): returns the
number of elements
stored
boolean isEmpty():
indicates whether no
elements are stored
Stacks
Applications of Stacks
Attempting the
execution of an
operation of ADT may
sometimes cause an
error condition, called
an exception
Exceptions are said to
be thrown by an
operation that cannot
be executed
Stacks
In the Stack ADT,
operations pop and
top cannot be
performed if the
stack is empty
Attempting the
execution of pop or
top on an empty
stack throws an
EmptyStackException
5
Direct applications
Page-visited history in a Web browser
Undo sequence in a text editor
Chain of method calls in the Java Virtual
Machine
Indirect applications
Auxiliary data structure for algorithms
Component of other data structures
Stacks
Method Stack in the JVM
Array-based Stack
The Java Virtual Machine (JVM) main() {
int i = 5;
keeps track of the chain of
foo(i);
active methods with a stack
}
When a method is called, the
JVM pushes on the stack a
foo(int j) {
frame containing
int k;
Local variables and return value
k = j+1;
Program counter, keeping track of
bar(k);
the statement being executed
}
When a method ends, its frame
is popped from the stack and
bar(int m) {
control is passed to the method
on top of the stack
}
bar
PC = 1
m=6
foo
PC = 3
j=5
k=6
main
PC = 2
i=5
Stacks
t
Stacks
Not intrinsic to the
Stack ADT
0 1 2
Let n be the number of elements in the stack
The space used is O(n)
Each operation runs in time O(1)
Limitations
The maximum size of the stack must be defined a
priori and cannot be changed
Trying to push a new element into a full stack
causes an implementation-specific exception
t
Stacks
Computing Spans
7
We show how to use a stack 6
as an auxiliary data structure 5
in an algorithm
4
Given an an array X, the span
3
S[i] of X[i] is the maximum
2
number of consecutive
elements X[j] immediately
1
preceding X[i] and such that 0
X[j] X[i]
Spans have applications to
financial analysis
0 1 2
Performance
Algorithm push(o)
if t = S.length 1 then
throw FullStackException
else
tt+1
Limitation of the arrayS[t] o
based implementation
Algorithm pop()
if isEmpty() then
throw EmptyStackException
else
tt1
return S[t + 1]
Performance and Limitations
The array storing the
stack elements may
become full
A push operation will
then throw a
FullStackException
Algorithm size()
return t + 1
Array-based Stack (cont.)
A simple way of
implementing the
Stack ADT uses an
array
We add elements
from left to right
A variable keeps
track of the index of
the top element
E.g., stock at 52-week high
Stacks
Stacks
10
Quadratic Algorithm
X
S
6
1
3
1
4
2
5
3
2
1
11
Algorithm spans1(X, n)
Input array X of n integers
Output array S of spans of X
S new array of n integers
for i 0 to n 1 do
s1
while s i X[i s] X[i]
ss+1
S[i] s
return S
n
n
n
1 + 2 + + (n 1)
1 + 2 + + (n 1)
n
1
Algorithm spans1 runs in O(n2) time
Stacks
12
Computing Spans with a Stack
We keep in a stack the
indices of the elements
visible when looking
back
We scan the array from
left to right
Let i be the current index
We pop indices from the
stack until we find index j
such that X[i] < X[j]
We set S[i] i j
We push x onto the stack
Each index of the
array
7
6
5
4
3
2
1
0
0 1 2 3 4 5 6 7
Stacks
13
Growable Array-based Stack
incremental strategy:
increase the size by a
constant c
doubling strategy: double
the size
tt+1
S[t] o
Stacks
15
Incremental Strategy Analysis
The statements in
the while-loop are
executed at most
n times
Algorithm spans2
runs in O(n) time
#
n
1
n
n
n
n
n
n
n
1
Stacks
14
We compare the incremental strategy and
the doubling strategy by analyzing the total
time T(n) needed to perform a series of n
push operations
We assume that we start with an empty
stack represented by an array of size 1
We call amortized time of a push operation
the average time taken by a push over the
series of operations, i.e., T(n)/n
Stacks
16
Doubling Strategy Analysis
We replace the array k = n/c times
The total time T(n) of a series of n push
operations is proportional to
n + c + 2c + 3c + 4c + + kc =
n + c(1 + 2 + 3 + + k) =
n + ck(k + 1)/2
Since c is a constant, T(n) is O(n + k2), i.e.,
O(n2)
The amortized time of a push operation is O(n)
Stacks
Is pushed into the
stack exactly one
Is popped from
the stack at most
once
Algorithm spans2(X, n)
S new array of n integers
A new empty stack
for i 0 to n 1 do
while (A.isEmpty()
X[top()] X[i] ) do
j A.pop()
if A.isEmpty() then
S[i] i + 1
else
S[i] i j
A.push(i)
return S
Comparison of the Strategies
In a push operation, when Algorithm push(o)
the array is full, instead of
if t = S.length 1 then
throwing an exception, we
A new array of
can replace the array with
size
a larger one
for i 0 to t do
A[i] S[i]
How large should the new
SA
array be?
Linear Algorithm
17
We replace the array k = log2 n
times
The total time T(n) of a series
of n push operations is
proportional to
n + 1 + 2 + 4 + 8 + + 2k =
n + 2k + 1 1 = 2n 1
T(n) is O(n)
The amortized time of a push
operation is O(1)
Stacks
geometric series
2
1
1
8
18
Stack Interface in Java
Java interface
corresponding to
our Stack ADT
Requires the
definition of class
EmptyStackException
Different from the
built-in Java class
java.util.Stack
Array-based Stack in Java
public interface Stack {
public class ArrayStack
implements Stack {
public int size();
public boolean isEmpty();
// holds the stack elements
private Object S[ ];
public Object top()
throws EmptyStackException;
// index to top element
private int top = -1;
public void push(Object o);
public Object pop()
throws EmptyStackException;
}
Stacks
19
// constructor
public ArrayStack(int capacity) {
S = new Object[capacity]);
}
public Object pop()
throws EmptyStackException {
if isEmpty()
throw new EmptyStackException
(Empty stack: cannot pop);
Object temp = S[top];
// facilitates garbage collection
S[top] = null;
top = top 1;
return temp;
}
Stacks
20
Vectors
6/8/2002 2:14 PM
Outline and Reading
The Vector ADT (2.2.1)
Array-based implementation (2.2.1)
Vectors
6/8/2002 2:14 PM
Vectors
The Vector ADT
The Vector ADT
extends the notion of
array by storing a
sequence of arbitrary
objects
An element can be
accessed, inserted or
removed by specifying
its rank (number of
elements preceding it)
An exception is
thrown if an incorrect
rank is specified (e.g.,
a negative rank)
6/8/2002 2:14 PM
6/8/2002 2:14 PM
Vectors
Applications of Vectors
Main vector operations:
object elemAtRank(integer r):
returns the element at rank r
without removing it
object replaceAtRank(integer r,
object o): replace the element at
rank with o and return the old
element
insertAtRank(integer r, object o):
insert a new element o to have
rank r
object removeAtRank(integer r):
removes and returns the element
at rank r
Additional operations size() and
isEmpty()
Vectors
Array-based Vector
Direct applications
Sorted collection of objects (elementary
database)
Indirect applications
Auxiliary data structure for algorithms
Component of other data structures
6/8/2002 2:14 PM
Vectors
Insertion
In operation insertAtRank(r, o), we need to make
room for the new element by shifting forward the
n r elements V[r], , V[n 1]
In the worst case (r = 0), this takes O(n) time
Use an array V of size N
A variable n keeps track of the size of the vector
(number of elements stored)
Operation elemAtRank(r) is implemented in O(1)
time by returning V[r]
V
V
0 1 2
0 1 2
0 1 2
o
r
V
0 1 2
V
6/8/2002 2:14 PM
Vectors
6/8/2002 2:14 PM
Vectors
n
6
Vectors
6/8/2002 2:14 PM
Deletion
Performance
In operation removeAtRank(r), we need to fill the
hole left by the removed element by shifting
backward the n r 1 elements V[r + 1], , V[n 1]
In the worst case (r = 0), this takes O(n) time
V
0 1 2
o
r
0 1 2
V
0 1 2
r
Vectors
The space used by the data structure is O(n)
size, isEmpty, elemAtRank and replaceAtRank run in
O(1) time
insertAtRank and removeAtRank run in O(n) time
If we use the array in a circular fashion,
insertAtRank(0) and removeAtRank(0) run in
O(1) time
In an insertAtRank operation, when the array
is full, instead of throwing an exception, we
can replace the array with a larger one
6/8/2002 2:14 PM
In the array based implementation of a Vector
n
7
6/8/2002 2:14 PM
Vectors
Queues
6/8/2002 2:16 PM
Outline and Reading
The Queue ADT (2.1.2)
Implementation with a circular array
(2.1.2)
Growable array-based queue
Queue interface in Java
Queues
6/8/2002 2:16 PM
Queues
The Queue ADT
The Queue ADT stores arbitrary
objects
Insertions and deletions follow
the first-in first-out scheme
Insertions are at the rear of the
queue and removals are at the
front of the queue
Main queue operations:
enqueue(object): inserts an
element at the end of the
queue
object dequeue(): removes and
returns the element at the front
of the queue
6/8/2002 2:16 PM
6/8/2002 2:16 PM
Queues
Applications of Queues
Auxiliary queue
operations:
object front(): returns the
element at the front without
removing it
integer size(): returns the
number of elements stored
boolean isEmpty(): indicates
whether no elements are
stored
Exceptions
Queues
Array-based Queue
Waiting lists, bureaucracy
Access to shared resources (e.g., printer)
Multiprogramming
Indirect applications
Attempting the execution of
dequeue or front on an
empty queue throws an
EmptyQueueException
Direct applications
Auxiliary data structure for algorithms
Component of other data structures
6/8/2002 2:16 PM
Queues
Queue Operations
Use an array of size N in a circular fashion
Two variables keep track of the front and rear
We use the
modulo operator
(remainder of
division)
f index of the front element
r index immediately past the rear element
Array location r is kept empty
Algorithm size()
return (N f + r) mod N
Algorithm isEmpty()
return (f = r)
normal configuration
Q
0 1 2
wrapped-around configuration
6/8/2002 2:16 PM
0 1 2
Q
0 1 2
0 1 2
f
Queues
6/8/2002 2:16 PM
Queues
Queues
6/8/2002 2:16 PM
Queue Operations (cont.)
Operation enqueue
throws an exception if
the array is full
This exception is
implementationdependent
Queue Operations (cont.)
Algorithm enqueue(o)
if size() = N 1 then
throw FullQueueException
else
Q[r] o
r (r + 1) mod N
Q
0 1 2
0 1 2
Growable Array-based Queue
Queues
0 1 2
6/8/2002 2:16 PM
Java interface
corresponding to
our Queue ADT
Requires the
definition of class
EmptyQueueException
No corresponding
built-in Java class
O(n) with the incremental strategy
O(1) with the doubling strategy
6/8/2002 2:16 PM
r
f
Queues
Queue Interface in Java
In an enqueue operation, when the array is
full, instead of throwing an exception, we
can replace the array with a larger one
Similar to what we did for an array-based
stack
The enqueue operation has amortized
running time
0 1 2
Q
f
Queues
Algorithm dequeue()
if isEmpty() then
throw EmptyQueueException
else
o Q[f]
f (f + 1) mod N
return o
6/8/2002 2:16 PM
Operation dequeue
throws an exception
if the queue is empty
This exception is
specified in the
queue ADT
public interface Queue {
public int size();
public boolean isEmpty();
public Object front()
throws EmptyQueueException;
public void enqueue(Object o);
public Object dequeue()
throws EmptyQueueException;
}
6/8/2002 2:16 PM
Queues
10
Sequences
6/8/2002 2:15 PM
Outline and Reading
Singly linked list
Position ADT and List ADT (2.2.2)
Doubly linked list ( 2.2.2)
Sequence ADT ( 2.2.3)
Implementations of the sequence ADT
( 2.2.3)
Iterators (2.2.3)
Lists and Sequences
6/8/2002 2:15 PM
Sequences
Singly Linked List
We can implement a stack with a singly linked list
The top element is stored at the first node of the list
The space used is O(n) and each operation of the
Stack ADT takes O(1) time
next
element
link to the next node
Sequences
Stack with a Singly Linked List
A singly linked list is a
concrete data structure
consisting of a sequence
of nodes
Each node stores
6/8/2002 2:15 PM
node
elem
nodes
6/8/2002 2:15 PM
Sequences
elements
3
Queue with a Singly Linked List
We can implement a queue with a singly linked list
6/8/2002 2:15 PM
Position ADT
The Position ADT models the notion of
place within a data structure where a
single object is stored
It gives a unified view of diverse ways
of storing data, such as
The front element is stored at the first node
The rear element is stored at the last node
The space used is O(n) and each operation of the
Queue ADT takes O(1) time
r
nodes
Sequences
a cell of an array
a node of a linked list
Just one method:
object element(): returns the element
stored at the position
elements
6/8/2002 2:15 PM
Sequences
6/8/2002 2:15 PM
Sequences
Sequences
6/8/2002 2:15 PM
List ADT
Doubly Linked List
The List ADT models a
sequence of positions
storing arbitrary objects
It establishes a
before/after relation
between positions
Generic methods:
size(), isEmpty()
isFirst(p), isLast(p)
first(), last()
before(p), after(p)
replaceElement(p, o),
swapElements(p, q)
insertBefore(p, o),
insertAfter(p, o),
insertFirst(o),
insertLast(o)
remove(p)
prev
element
link to the previous node
link to the next node
Update methods:
Query methods:
A doubly linked list provides a natural
implementation of the List ADT
Nodes implement Position and store:
Accessor methods:
next
elem
node
Special trailer and header nodes
nodes/positions
header
trailer
elements
6/8/2002 2:15 PM
Sequences
Insertion
6/8/2002 2:15 PM
Sequences
Deletion
We visualize operation insertAfter(p, X), which returns position q
We visualize remove(p), where p = last()
p
D
p
A
X
p
A
6/8/2002 2:15 PM
q
B
Sequences
Performance
The space used by a list with n elements is
O(n)
The space used by each position of the list
is O(1)
All the operations of the List ADT run in
O(1) time
Operation element() of the
Position ADT runs in O(1) time
6/8/2002 2:15 PM
6/8/2002 2:15 PM
Sequences
10
Sequence ADT
In the implementation of the List ADT
by means of a doubly linked list
Sequences
11
The Sequence ADT is the
union of the Vector and
List ADTs
Elements accessed by
List-based methods:
Rank, or
Position
Generic methods:
size(), isEmpty()
Vector-based methods:
elemAtRank(r),
replaceAtRank(r, o),
insertAtRank(r, o),
removeAtRank(r)
6/8/2002 2:15 PM
first(), last(),
before(p), after(p),
replaceElement(p, o),
swapElements(p, q),
insertBefore(p, o),
insertAfter(p, o),
insertFirst(o),
insertLast(o),
remove(p)
Bridge methods:
Sequences
atRank(r), rankOf(p)
12
Sequences
6/8/2002 2:15 PM
Applications of Sequences
Array-based Implementation
The Sequence ADT is a basic, generalpurpose, data structure for storing an ordered
collection of elements
Direct applications:
Generic replacement for stack, queue, vector, or
list
small database (e.g., address book)
Element
Rank
Indices f and l
keep track of
first and last
positions
Indirect applications:
Building block of more complex data structures
elements
We use a
circular array
storing
positions
A position
object stores:
0
Sequences
13
Sequence Implementations
Operation
size, isEmpty
atRank, rankOf, elemAtRank
first, last, before, after
replaceElement, swapElements
replaceAtRank
insertAtRank, removeAtRank
insertFirst, insertLast
insertAfter, insertBefore
remove
6/8/2002 2:15 PM
Sequences
Array
1
1
1
1
1
n
1
n
n
3
positions
S
f
6/8/2002 2:15 PM
6/8/2002 2:15 PM
Sequences
14
Iterators
List
1
n
1
1
n
n
1
1
1
An iterator abstracts the
process of scanning through
a collection of elements
Methods of the ObjectIterator
ADT:
object object()
boolean hasNext()
object nextObject()
reset()
6/8/2002 2:15 PM
ObjectIterator elements()
Two notions of iterator:
Extends the concept of
Position by adding a traversal
capability
Implementation with an array
or singly linked list
15
An iterator is typically
associated with an another
data structure
We can augment the Stack,
Queue, Vector, List and
Sequence ADTs with method:
Sequences
snapshot: freezes the
contents of the data
structure at a given time
dynamic: follows changes to
the data structure
16
Trees
6/8/2002 2:15 PM
Outline and Reading
Tree ADT (2.3.1)
Preorder and postorder traversals (2.3.2)
BinaryTree ADT (2.3.3)
Inorder traversal (2.3.3)
Euler Tour traversal (2.3.3)
Template method pattern
Data structures for trees (2.3.4)
Java implementation (http://jdsl.org)
Trees
Make Money Fast!
Stock
Fraud
6/8/2002 2:15 PM
Ponzi
Scheme
Bank
Robbery
Trees
What is a Tree
Organization charts
File systems
Europe
Programming
environments
6/8/2002 2:15 PM
Asia
Canada
Trees
Tree ADT
integer size()
boolean isEmpty()
objectIterator elements()
positionIterator positions()
Accessor methods:
position root()
position parent(p)
positionIterator children(p)
6/8/2002 2:15 PM
Root: node without parent (A)
Internal node: node with at least
one child (A, B, C, F)
External node (a.k.a. leaf ): node
without children (E, I, J, K, G, H, D)
Ancestors of a node: parent,
grandparent, grand-grandparent,
etc.
Depth of a node: number of
ancestors
E
Height of a tree: maximum depth
of any node (3)
Descendant of a node: child,
I
grandchild, grand-grandchild, etc.
6/8/2002 2:15 PM
Subtree: tree consisting of
a node and its
descendants
A
subtree
J
Trees
Preorder Traversal
We use positions to abstract
nodes
Generic methods:
Trees
Tree Terminology
In computer science, a
ComputersRUs
tree is an abstract model
of a hierarchical
structure
Sales
Manufacturing
R&D
A tree consists of nodes
with a parent-child
relation
US
International
Laptops
Desktops
Applications:
6/8/2002 2:15 PM
Trees
Query methods:
boolean isInternal(p)
boolean isExternal(p)
boolean isRoot(p)
Update methods:
swapElements(p, q)
object replaceElement(p, o)
A traversal visits the nodes of a
tree in a systematic manner
In a preorder traversal, a node is
visited before its descendants
Application: print a structured
document
1
Additional update methods
may be defined by data
structures implementing the
Tree ADT
Make Money Fast!
1. Motivations
9
2. Methods
1.1 Greed
1.2 Avidity
6/8/2002 2:15 PM
Algorithm preOrder(v)
visit(v)
for each child w of v
preorder (w)
2.1 Stock
Fraud
Trees
2.2 Ponzi
Scheme
References
8
2.3 Bank
Robbery
6
Trees
6/8/2002 2:15 PM
Postorder Traversal
In a postorder traversal, a
node is visited after its
descendants
Application: compute space
used by files in a directory and
its subdirectories
9
Binary Tree
Algorithm postOrder(v)
for each child w of v
postOrder (w)
visit(v)
cs16/
homeworks/
todo.txt
1K
programs/
h1c.doc
3K
h1nc.doc
2K
DDR.java
10K
6/8/2002 2:15 PM
Stocks.java
25K
Trees
Trees
I
8
No
On expense account?
Yes
No
Yes
No
Starbucks
Spikes
Al Forno
Caf Paragon
6/8/2002 2:15 PM
Trees
10
BinaryTree ADT
Properties:
e = i + 1
n = 2e 1
h i
h (n 1)/2
h
e 2
h log2 e
h log2 (n + 1) 1
The BinaryTree ADT
extends the Tree
ADT, i.e., it inherits
all the methods of
the Tree ADT
Additional methods:
Trees
internal nodes: questions with yes/no answer
external nodes: decisions
How about coffee?
Properties of Binary Trees
6/8/2002 2:15 PM
Yes
n number of nodes
e number of
external nodes
i number of internal
nodes
h height
Example: dining decision
Notation
Want a fast meal?
6/8/2002 2:15 PM
Trees
Binary tree associated with a decision process
Example: arithmetic expression tree for the
expression (2 (a 1) + (3 b))
a tree consisting of a single node,
or
a tree whose root has an ordered
pair of children, each of which is a
binary tree
6/8/2002 2:15 PM
arithmetic expressions
decision processes
searching
Decision Tree
internal nodes: operators
external nodes: operands
Applications:
Each internal node has two
children
The children of a node are an
ordered pair
We call the children of an internal
node left child and right child
Alternative recursive definition: a
binary tree is either
Robot.java
20K
Binary tree associated with an arithmetic expression
Arithmetic Expression Tree
A binary tree is a tree with the
following properties:
11
Update methods
may be defined by
data structures
implementing the
BinaryTree ADT
position leftChild(p)
position rightChild(p)
position sibling(p)
6/8/2002 2:15 PM
Trees
12
Trees
6/8/2002 2:15 PM
Inorder Traversal
In an inorder traversal a
node is visited after its left
subtree and before its right
subtree
Application: draw a binary
tree
Print Arithmetic Expressions
Algorithm inOrder(v)
if isInternal (v)
inOrder (leftChild (v))
visit(v)
if isInternal (v)
inOrder (rightChild (v))
x(v) = inorder rank of v
y(v) = depth of v
6
2
4
3
Trees
recursive method returning
the value of a subtree
when visiting an internal
node, combine the values
of the subtrees
13
Algorithm evalExpr(v)
if isExternal (v)
return v.element ()
else
x evalExpr(leftChild (v))
y evalExpr(rightChild (v))
operator stored at v
return x y
((2 (a 1)) + (3 b))
1
Trees
14
Euler Tour Traversal
Generic traversal of a binary tree
Includes a special cases the preorder, postorder and inorder traversals
Walk around the tree and visit each node three times:
on the left (preorder)
from below (inorder)
on the right (postorder)
6/8/2002 2:15 PM
Trees
15
Template Method Pattern
Generic algorithm that
can be specialized by
redefining certain steps
Implemented by means of
an abstract Java class
Visit methods that can be
redefined by subclasses
Template method eulerTour
Recursively called on the
left and right children
A Result object with fields
leftResult, rightResult and
finalResult keeps track of
the output of the
recursive calls to eulerTour
6/8/2002 2:15 PM
6/8/2002 2:15 PM
Specialization of a postorder
traversal
print operand or operator
when visiting node
print ( before traversing left
subtree
print ) after traversing right
subtree
Evaluate Arithmetic Expressions
6/8/2002 2:15 PM
Algorithm printExpression(v)
if isInternal (v)
print(()
inOrder (leftChild (v))
print(v.element ())
if isInternal (v)
inOrder (rightChild (v))
print ())
Specialization of an inorder
traversal
Trees
16
Specializations of EulerTour
public abstract class EulerTour {
protected BinaryTree tree;
protected void visitExternal(Position p, Result r) { }
protected void visitLeft(Position p, Result r) { }
protected void visitBelow(Position p, Result r) { }
protected void visitRight(Position p, Result r) { }
protected Object eulerTour(Position p) {
Result r = new Result();
if tree.isExternal(p) { visitExternal(p, r); }
else {
visitLeft(p, r);
r.leftResult = eulerTour(tree.leftChild(p));
visitBelow(p, r);
r.rightResult = eulerTour(tree.rightChild(p));
visitRight(p, r);
return r.finalResult;
}
Trees
6/8/2002 2:15 PM
17
We show how to
specialize class
EulerTour to evaluate
an arithmetic
expression
Assumptions
public class EvaluateExpression
extends EulerTour {
protected void visitExternal(Position p, Result r) {
r.finalResult = (Integer) p.element();
}
protected void visitRight(Position p, Result r) {
Operator op = (Operator) p.element();
r.finalResult = op.operation(
(Integer) r.leftResult,
(Integer) r.rightResult
);
}
External nodes store
Integer objects
Internal nodes store
Operator objects
supporting method
operation (Integer, Integer)
6/8/2002 2:15 PM
Trees
18
Trees
6/8/2002 2:15 PM
Data Structure for Trees
A node is represented by
an object storing
Element
Parent node
Sequence of children
nodes
A node is represented
by an object storing
6/8/2002 2:15 PM
Tree interface
BinaryTree interface
extending Tree
Classes implementing Tree
and BinaryTree and
providing
Trees
19
expandExternal(v)
removeAboveExternal(w)
6/8/2002 2:15 PM
Trees
Trees
20
JDSL was developed at
Browns Center for Geometric
Computing
See the JDSL documentation
and tutorials at http://jdsl.org
InspectableBinaryTree
InspectableTree
BinaryTree
Tree
InspectableTree
Inspectable versions of the
interfaces do not have
update methods
InspectableBinaryTree
Tree classes in JDSL
removeAboveExternal(w)
JDSL is the Library of Data
Structures in Java
Tree interfaces in JDSL
6/8/2002 2:15 PM
Constructors
Update methods
Print methods
Trees in JDSL
expandExternal(v)
Examples of updates for
binary trees
Java Implementation
Node objects implement
the Position ADT
D
C
Element
Parent node
Left child node
Right child node
Node objects implement
the Position ADT
Data Structure for Binary Trees
21
NodeBinaryTree
NodeTree
6/8/2002 2:15 PM
Tree
BinaryTree
Trees
22
Heaps
4/5/2002 14:4
Priority Queue
ADT ( 2.4.1)
A priority queue stores a
Heaps and Priority Queues
2
5
9
Heaps and Priority Queues
total order relation
Reflexive property:
xx
Antisymmetric property:
xy yxx=y
Transitive property:
xyyzxz
Heaps and Priority Queues
The running time of this
sorting method depends on
the priority queue
implementation
A comparator encapsulates
the action of comparing two
objects according to a given
total order relation
A generic priority queue
uses an auxiliary
comparator
The comparator is external
to the keys being compared
When the priority queue
needs to compare two keys,
it uses its comparator
Standby flyers
Auctions
Stock market
Methods of the Comparator
ADT, all with Boolean
return type
isLessThan(x, y)
isLessThanOrEqualTo(x,y)
isEqualTo(x,y)
isGreaterThan(x, y)
isGreaterThanOrEqualTo(x,y)
isComparable(x)
Heaps and Priority Queues
Implementation with an
Algorithm PQ-Sort(S, C)
Input sequence S, comparator C
for the elements of S
Output sequence S sorted in
increasing order according to C
P priority queue with
comparator C
while S.isEmpty ()
e S.remove (S. first ())
P.insertItem(e, e)
while P.isEmpty()
e P.removeMin()
S.insertLast(e)
Heaps and Priority Queues
Applications:
Sequence-based Priority Queue
We can use a priority
Insert the elements one
by one with a series of
insertItem(e, e)
operations
Remove the elements in
sorted order with a series
of removeMin()
operations
minKey(k, o)
returns, but does not
remove, the smallest key of
an item
minElement()
returns, but does not
remove, the element of an
item with smallest key
size(), isEmpty()
Heaps and Priority Queues
Sorting with a
Priority Queue ( 2.4.2)
queue to sort a set of
comparable elements
Comparator ADT ( 2.4.1)
Keys in a priority Mathematical concept of
insertItem(k, o)
inserts an item with key k
and element o
removeMin()
removes the item with
smallest key and returns its
element
Total Order Relation
queue can be
arbitrary objects
on which an order
is defined
Two distinct items
in a priority queue
can have the
same key
Additional methods
collection of items
An item is a pair
(key, element)
Main methods of the Priority
Queue ADT
unsorted list
Performance:
Implementation with a
sorted list
1
Performance:
insertItem takes O(1) time
since we can insert the item
at the beginning or end of
the sequence
removeMin, minKey and
minElement take O(n) time
since we have to traverse
the entire sequence to find
the smallest key
Heaps and Priority Queues
insertItem takes O(n) time
since we have to find the
place where to insert the
item
removeMin, minKey and
minElement take O(1) time
since the smallest key is at
the beginning of the
sequence
Heaps
4/5/2002 14:4
Selection-Sort
Insertion-Sort
Insertion-sort is the variation of PQ-sort where the
priority queue is implemented with a sorted
sequence
Selection-sort is the variation of PQ-sort where the
priority queue is implemented with an unsorted
sequence
4
Inserting the elements into the priority queue with n
insertItem operations takes O(n) time
Removing the elements in sorted order from the priority
queue with n removeMin operations takes time
proportional to
1 + 2 + + n
Heap-Order: for every
internal node v other than
the root,
key(v) key(parent(v))
Complete Binary Tree: let h
be the height of the heap
The last node of a heap
is the rightmost internal
node of depth h 1
2
6
Insertion-sort runs in O(n2) time
last node
Proof: (we apply the complete binary tree property)
Let h be the height of a heap storing n keys
Since there are 2i keys at depth i = 0, , h 2 and at least one key
at depth h 1, we have n 1 + 2 + 4 + + 2h2 + 1
Thus, n 2h1 , i.e., h log n + 1
h2
2h2
h1
Heaps and Priority Queues
10
Insertion into a
Heap (2.4.3)
can use a heap to implement a priority queue
store a (key, element) item at each internal node
keep track of the position of the last node
simplicity, we show only the keys in the pictures
(2, Sue)
(6, Mark)
Method insertItem of the
priority queue ADT
corresponds to the
insertion of a key k to
the heap
The insertion algorithm
consists of three steps
(7, Anna)
Heaps and Priority Queues
Theorem: A heap storing n keys has height O(log n)
Heaps and Priority Queues
(5, Pat)
Heaps and Priority Queues
depth keys
0
1
Heaps and Priority Queues
(9, Jeff)
Removing the elements in sorted order from the priority
queue with a series of n removeMin operations takes O(n)
time
5
9
2i nodes of depth i
at depth h 1, the internal
nodes are to the left of the
external nodes
We
We
We
For
Height of a Heap (2.4.3)
for i = 0, , h 1, there are
Inserting the elements into the priority queue with n
insertItem operations takes time proportional to
What is a heap (2.4.3)
Heaps and Priority Queues
storing keys at its internal
nodes and satisfying the
following properties:
1 + 2 + + n
Selection-sort runs in O(n2) time
A heap is a binary tree
Running time of Insertion-sort:
Running time of Selection-sort:
11
Find the insertion node z
(the new last node)
Store k at z and expand z
into an internal node
Restore the heap-order
property (discussed next)
2
5
9
z
7
insertion node
2
5
9
Heaps and Priority Queues
6
7
12
Heaps
4/5/2002 14:4
Upheap
Removal from a Heap (2.4.3)
After the insertion of a new key k, the heap-order property may be
Method removeMin of
violated
Algorithm upheap restores the heap-order property by swapping k
along an upward path from the insertion node
Upheap terminates when the key k reaches the root or a node
whose parent has a key smaller than or equal to k
Since a heap has height O(log n), upheap runs in O(log n) time
the priority queue ADT
corresponds to the
removal of the root key
from the heap
The removal algorithm
consists of three steps
Heaps and Priority Queues
13
Downheap
w
last node
7
Heaps and Priority Queues
14
Updating the Last Node
After replacing the root key with the key k of the last node, the
heap-order property may be violated
Algorithm downheap restores the heap-order property by
swapping key k along a downward path from the root
Upheap terminates when key k reaches a leaf or a node whose
children have keys greater than or equal to k
Since a heap has height O(log n), downheap runs in O(log n) time
7
5
Replace the root key with
the key of the last node w
Compress w and its
children into a leaf
Restore the heap-order
property (discussed next)
2
5
The insertion node can be found by traversing a path of O(log n)
nodes
Go up until a left child or the root is reached
If a left child is reached, go to the right child
Go down left until a leaf is reached
Similar algorithm for updating the last node after a removal
5
6
Heaps and Priority Queues
15
Heaps and Priority Queues
16
Vector-based Heap
Implementation (2.4.3)
Heap-Sort (2.4.4)
We can represent a heap with n
Consider a priority
queue with n items
implemented by means
of a heap
the space used is O(n)
methods insertItem and
removeMin take O(log n)
time
methods size, isEmpty,
minKey, and minElement
take time O(1) time
Using a heap-based
priority queue, we can
sort a sequence of n
elements in O(n log n)
time
The resulting algorithm
is called heap-sort
Heap-sort is much
faster than quadratic
sorting algorithms, such
as insertion-sort and
selection-sort
Heaps and Priority Queues
17
keys by means of a vector of
length n + 1
For the node at rank i
the left child is at rank 2i
the right child is at rank 2i + 1
2
5
Links between nodes are not
explicitly stored
The leaves are not represented
The cell of at rank 0 is not used
Operation insertItem corresponds
to inserting at rank n + 1
Operation removeMin corresponds
to removing at rank n
Yields in-place heap-sort
Heaps and Priority Queues
18
Heaps
4/5/2002 14:4
Bottom-up Heap
Construction (2.4.3)
Merging Two Heaps
We are given two two
heaps and a key k
We create a new heap
with the root node
storing k and with the
two heaps as subtrees
We perform downheap
to restore the heaporder property
3
8
2
5
7
3
8
2
5
2
3
8
We can construct a heap
storing n given keys in
using a bottom-up
construction with log n
phases
In phase i, pairs of
heaps with 2i 1 keys are
merged into heaps with
2i+11 keys
6
19
Example
Heaps and Priority Queues
20
Example (contd.)
25
15
15
25
16
2i 1
2i+11
Heaps and Priority Queues
16
2i 1
12
12
23
23
11
20
16
15
27
20
Heaps and Priority Queues
5
15
16
4
25
21
Example (contd.)
11
12
27
9
23
6
12
11
20
23
9
27
20
Heaps and Priority Queues
22
Example (end)
10
7
15
16
4
25
6
12
11
27
15
23
20
16
5
25
8
12
11
23
9
27
20
4
4
15
16
5
25
8
12
11
Heaps and Priority Queues
23
9
27
15
20
23
16
7
25
10
8
12
11
Heaps and Priority Queues
23
9
27
20
24
Heaps
4/5/2002 14:4
Analysis
We visualize the worst-case time of a downheap with a proxy path
that goes first right and then repeatedly goes left until the bottom
of the heap (this path may differ from the actual downheap path)
Since each node is traversed by at most two proxy paths, the total
number of nodes of the proxy paths is O(n)
Thus, bottom-up heap construction runs in O(n) time
Bottom-up heap construction is faster than n successive insertions
and speeds up the first phase of heap-sort
Heaps and Priority Queues
25
Priority Queues
6/8/2002 2:00 PM
Outline and Reading
PriorityQueue ADT (2.4.1)
Total order relation (2.4.1)
Comparator ADT (2.4.1)
Sorting with a priority queue (2.4.2)
Selection-sort (2.4.2)
Insertion-sort (2.4.2)
Priority Queues
6/8/2002 2:00 PM
Sell
100
IBM
$122
Sell
300
IBM
$120
Buy 500
IBM
$119
Buy 400
IBM
$118
Priority Queues
Priority Queue ADT
insertItem(k, o)
inserts an item with key k
and element o
removeMin()
removes the item with
smallest key and returns its
element
6/8/2002 2:00 PM
minKey(k, o)
returns, but does not
remove, the smallest key of
an item
minElement()
returns, but does not
remove, the element of an
item with smallest key
size(), isEmpty()
Applications:
Priority Queues
Standby flyers
Auctions
Stock market
Comparator ADT
A comparator encapsulates
the action of comparing two
objects according to a given
total order relation
A generic priority queue
uses an auxiliary
comparator
The comparator is external
to the keys being compared
When the priority queue
needs to compare two keys,
it uses its comparator
6/8/2002 2:00 PM
Priority Queues
Total Order Relation
Additional methods
A priority queue stores a
collection of items
An item is a pair
(key, element)
Main methods of the Priority
Queue ADT
6/8/2002 2:00 PM
Keys in a priority
queue can be
arbitrary objects
on which an order
is defined
Two distinct items
in a priority queue
can have the
same key
6/8/2002 2:00 PM
Mathematical concept
of total order relation
Reflexive property:
xx
Antisymmetric property:
xyyxx=y
Transitive property:
xyyzxz
Priority Queues
Sorting with a Priority Queue
Methods of the Comparator
ADT, all with Boolean
return type
Priority Queues
isLessThan(x, y)
isLessThanOrEqualTo(x,y)
isEqualTo(x,y)
isGreaterThan(x, y)
isGreaterThanOrEqualTo(x,y)
isComparable(x)
We can use a priority
queue to sort a set of
comparable elements
1. Insert the elements one
by one with a series of
insertItem(e, e)
operations
2. Remove the elements in
sorted order with a series
of removeMin()
operations
The running time of this
sorting method depends on
the priority queue
implementation
6/8/2002 2:00 PM
Algorithm PQ-Sort(S, C)
Input sequence S, comparator C
for the elements of S
Output sequence S sorted in
increasing order according to C
P priority queue with
comparator C
while S.isEmpty ()
e S.remove (S. first ())
P.insertItem(e, e)
while P.isEmpty()
e P.removeMin()
S.insertLast(e)
Priority Queues
Priority Queues
6/8/2002 2:00 PM
Sequence-based Priority Queue
Implementation with an
unsorted sequence
Implementation with a
sorted sequence
Store the items of the
priority queue in a list-based
sequence, in arbitrary order
Performance:
6/8/2002 2:00 PM
Selection-sort is the variation of PQ-sort where the
priority queue is implemented with an unsorted
sequence
Running time of Selection-sort:
Store the items of the
priority queue in a
sequence, sorted by key
Performance:
insertItem takes O(1) time
since we can insert the item
at the beginning or end of
the sequence
removeMin, minKey and
minElement take O(n) time
since we have to traverse
the entire sequence to find
the smallest key
insertItem takes O(n) time
since we have to find the
place where to insert the
item
removeMin, minKey and
minElement take O(1) time
since the smallest key is at
the beginning of the
sequence
Priority Queues
Insertion-Sort
Inserting the elements into the priority queue with n
insertItem operations takes time proportional to
1 + 2 + + n
2.
Removing the elements in sorted order from the priority
queue with a series of n removeMin operations takes
O(n) time
1 + 2 + + n
Selection-sort runs in O(n2) time
6/8/2002 2:00 PM
Priority Queues
Priority Queues
Instead of using an
external data structure,
we can implement
selection-sort and
insertion-sort in-place
A portion of the input
sequence itself serves as
the priority queue
For in-place insertion-sort
Insertion-sort runs in O(n2) time
6/8/2002 2:00 PM
1. Inserting the elements into the priority queue with n
insertItem operations takes O(n) time
2. Removing the elements in sorted order from the priority
queue with n removeMin operations takes time
proportional to
In-place Insertion-sort
Insertion-sort is the variation of PQ-sort where the
priority queue is implemented with a sorted
sequence
Running time of Insertion-sort:
1.
Selection-Sort
We keep sorted the initial
portion of the sequence
We can use
swapElements instead of
modifying the sequence
6/8/2002 2:00 PM
Priority Queues
5
10
Dictionaries
4/5/2002 15:1
Dictionary ADT (2.5.1)
The dictionary ADT models a
searchable collection of keyelement items
The main operations of a
dictionary are searching,
inserting, and deleting items
Multiple items with the same
key are allowed
Applications:
Dictionaries and Hash Tables
0
1
2
3
4
025-612-0001
981-101-0002
451-229-0004
address book
credit card authorization
mapping host names (e.g.,
cs16.net) to internet addresses
(e.g., 128.148.34.101)
Dictionary ADT methods:
findElement(k): if the
dictionary has an item with
key k, returns its element,
else, returns the special
element NO_SUCH_KEY
insertItem(k, o): inserts item
(k, o) into the dictionary
removeElement(k): if the
dictionary has an item with
key k, removes it from the
dictionary and returns its
element, else returns the
special element
NO_SUCH_KEY
size(), isEmpty()
keys(), Elements()
Dictionaries and Hash Tables
A log file is a dictionary implemented by means of an unsorted
sequence
Example:
insertItem takes O(1) time since we can insert the new item at the
beginning or at the end of the sequence
findElement and removeElement take O(n) time since in the worst
case (the item is not found) we traverse the entire sequence to
look for an item with the given key
The log file is effective only for dictionaries of small size or for
dictionaries on which insertions are the most common
operations, while searches and removals are rarely performed
(e.g., historical record of logins to a workstation)
Dictionaries and Hash Tables
A hash function h maps keys of a given type to
integers in a fixed interval [0, N 1]
We store the items of the dictionary in a sequence (based on a
doubly-linked lists or a circular array), in arbitrary order
Performance:
Hash Functions and
Hash Tables (2.5.2)
Log File (2.5.1)
Dictionaries and Hash Tables
h(x) = x mod N
is a hash function for integer keys
The integer h(x) is called the hash value of key x
A hash table for a given key type consists of
Hash function h
Array (called table) of size N
When implementing a dictionary with a hash table,
the goal is to store item (k, o) at index i = h(k)
Example
Dictionaries and Hash Tables
Hash Functions ( 2.5.3)
We design a hash table for
0
1
2
3
4
A hash function is
025-612-0001
981-101-0002
9997
9998
9999
The hash code map is
applied first, and the
usually specified as the
compression map is
composition of two
applied next on the
functions:
result, i.e.,
h(x) = h2(h1(x))
Hash code map:
The goal of the hash
h1: keys integers
function is to
Compression map:
disperse the keys in
h2: integers [0, N 1]
an apparently random
451-229-0004
a dictionary storing items
(SSN, Name), where SSN
(social security number) is a
nine-digit positive integer
Our hash table uses an
array of size N = 10,000 and
the hash function
h(x) = last four digits of x
200-751-9998
way
Dictionaries and Hash Tables
Dictionaries and Hash Tables
Dictionaries
4/5/2002 15:1
Hash Code Maps (2.5.3)
Memory address:
We reinterpret the memory
address of the key object as
an integer (default hash code
of all Java objects)
Good in general, except for
numeric and string keys
Component sum:
We partition the bits of
the key into components
of fixed length (e.g., 16
or 32 bits) and we sum
the components
(ignoring overflows)
Suitable for numeric keys
of fixed length greater
than or equal to the
number of bits of the
integer type (e.g., long
and double in Java)
Integer cast:
Hash Code Maps (cont.)
We reinterpret the bits of the
key as an integer
Suitable for keys of length
less than or equal to the
number of bits of the integer
type (e.g., byte, short, int
and float in Java)
Dictionaries and Hash Tables
h2 (y) = (ay + b) mod N
a and b are
nonnegative integers
such that
a mod N 0
Otherwise, every
integer would map to
the same value b
Polynomial p(z) can be
evaluated in O(n) time
using Horners rule:
The following
polynomials are
successively computed,
each from the previous
one in O(1) time
p0(z) = an1
pi (z) = ani1 + zpi1(z)
(i = 1, 2, , n 1)
We have p(z) = pn1(z)
Dictionaries and Hash Tables
025-612-0001
451-229-0004
981-101-0004
Chaining is simple,
but requires
additional memory
outside the table
Dictionaries and Hash Tables
Consider a hash table A
that uses linear probing
findElement(k)
h(x) = x mod 13
Insert keys 18, 41,
22, 44, 59, 32, 31,
73, in this order
We start at cell h(k)
We probe consecutive
locations until one of the
following occurs
An item with key k is
0 1 2 3 4 5 6 7 8 9 10 11 12
found, or
An empty cell is found,
or
41
18 44 59 32 22 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
Dictionaries and Hash Tables
0
1
2
3
4
10
Search with Linear Probing
Example:
different elements are
mapped to the same
cell
Chaining: let each
cell in the table point
to a linked list of
elements that map
there
Linear Probing (2.5.5)
colliding item is placed in a
different cell of the table
Linear probing handles
collisions by placing the
colliding item in the next
(circularly) available table cell
Each table cell inspected is
referred to as a probe
Colliding items lump together,
causing future collisions to
cause a longer sequence of
probes
Collisions occur when
Divide (MAD):
Dictionaries and Hash Tables
Open addressing: the
We partition the bits of the
key into a sequence of
components of fixed length
(e.g., 8, 16 or 32 bits)
a0 a1 an1
We evaluate the polynomial
p(z) = a0 + a1 z + a2 z2 +
+ an1zn1
at a fixed value z, ignoring
overflows
Especially suitable for strings
(e.g., the choice z = 33 gives
at most 6 collisions on a set
of 50,000 English words)
Collision Handling
( 2.5.5)
Multiply, Add and
h2 (y) = y mod N
The size N of the
hash table is usually
chosen to be a prime
The reason has to do
with number theory
and is beyond the
scope of this course
Compression
Maps (2.5.4)
Division:
Polynomial accumulation:
11
N cells have been
unsuccessfully probed
Algorithm findElement(k)
i h(k)
p0
repeat
c A[i]
if c =
return NO_SUCH_KEY
else if c.key () = k
return c.element()
else
i (i + 1) mod N
pp+1
until p = N
return NO_SUCH_KEY
Dictionaries and Hash Tables
12
Dictionaries
4/5/2002 15:1
Updates with Linear Probing
To handle insertions and
deletions, we introduce a
special object, called
AVAILABLE, which replaces
deleted elements
removeElement(k)
Double Hashing
Double hashing uses a
insert Item(k, o)
We search for an item with
key k
A cell i is found that is
either empty or stores
AVAILABLE, or
N cells have been
unsuccessfully probed
If such an item (k, o) is
found, we replace it with the
special item AVAILABLE
and we return element o
Else, we return
NO_SUCH_KEY
We store item (k, o) in
cell i
Dictionaries and Hash Tables
13
k
18
41
22
44
59
32
31
73
table storing integer
keys that handles
collision with double
hashing
N = 13
h(k) = k mod 13
d(k) = 7 k mod 7
Insert keys 18, 41,
22, 44, 59, 32, 31,
73, in this order
3
1
6
5
4
3
4
4
5
2
9
5
7
6
5
8
31
41
18 32 59 73 22 44
0 1 2 3 4 5 6 7 8 9 10 11 12
15
Universal
Hashing ( 2.5.6)
1, 2, , q
14
The expected running
time of all the dictionary
ADT operations in a
hash table is O(1)
In practice, hashing is
very fast provided the
load factor is not close
to 100%
Applications of hash
tables:
small databases
compilers
browser caches
Dictionaries and Hash Tables
16
Proof of Universality (Part 1)
A family of hash functions
is universal if, for any
0<i,j<M-1,
Pr(h(j)=h(k)) < 1/N.
Choose p as a prime
between M and 2M.
Randomly select 0<a<p
and 0<b<p, and define
h(k)=(ak+b mod p) mod N
q<N
q is a prime
The possible values for
d2(k) are
insertions and removals on a
hash table take O(n) time
The worst case occurs when
all the keys inserted into the
dictionary collide
The load factor = n/N
affects the performance of a
hash table
Assuming that the hash
values are like random
numbers, it can be shown
that the expected number of
probes for an insertion with
open addressing is
1 / (1 )
0 1 2 3 4 5 6 7 8 9 10 11 12
Dictionaries and Hash Tables
In the worst case, searches,
10
Performance of
Hashing
h (k ) d (k ) Probes
5
2
9
5
7
6
5
8
compression map for the
secondary hash function:
d2(k) = q k mod q
where
Dictionaries and Hash Tables
Example of Double Hashing
Consider a hash
Common choice of
secondary hash function
d(k) and handles
collisions by placing an
item in the first available
cell of the series
(i + jd(k)) mod N
for j = 0, 1, , N 1
The secondary hash
function d(k) cannot
have zero values
The table size N must be
a prime to allow probing
of all the cells
We throw an exception
if the table is full
We start at cell h(k)
We probe consecutive
cells until one of the
following occurs
Theorem: The set of
all functions, h, as
defined here, is
universal.
Dictionaries and Hash Tables
Let f(k) = ak+b mod p
Let g(k) = k mod N
So h(k) = g(f(k)).
f causes no collisions:
Let f(k) = f(j).
Suppose k<j. Then
So a(j-k) is a multiple of p
But both are less than p
So a(j-k) = 0. I.e., j=k.
(contradiction)
Thus, f causes no collisions.
aj + b
ak + b
aj + b
p = ak + b p p
p
aj + b ak + b
a ( j k ) =
p
p p
17
Dictionaries and Hash Tables
18
Dictionaries
4/5/2002 15:1
Proof of Universality (Part 2)
If f causes no collisions, only g can make h cause collisions.
Fix a number x. Of the p integers y=f(k), different from x,
the number such that g(y)=g(x) is at most
p / N 1
Since there are p choices for x, the number of hs that will
cause a collision between j and k is at most
p( p 1)
p ( p / N 1)
N
There are p(p-1) functions h. So probability of collision is
p( p 1) / N 1
at most
p ( p 1)
Therefore, the set of possible h functions is universal.
Dictionaries and Hash Tables
19
Dictionaries
6/8/2002 2:01 PM
Outline and Reading
Dictionary ADT (2.5.1)
Log file (2.5.1)
Binary search (3.1.1)
Lookup table (3.1.1)
Binary search tree (3.1.2)
Dictionaries
6
<
2
>
4 =
6/8/2002 2:01 PM
Dictionaries
6/8/2002 2:01 PM
Dictionary ADT
Dictionary ADT methods:
address book
credit card authorization
mapping host names (e.g.,
cs16.net) to internet addresses
(e.g., 128.148.34.101)
6/8/2002 2:01 PM
findElement(k): if the
dictionary has an item with
key k, returns its element,
else, returns the special
element NO_SUCH_KEY
insertItem(k, o): inserts item
(k, o) into the dictionary
removeElement(k): if the
dictionary has an item with
key k, removes it from the
dictionary and returns its
element, else returns the
special element
NO_SUCH_KEY
size(), isEmpty()
keys(), Elements()
Dictionaries
similar to the high-low game
at each step, the number of candidate items is halved
terminates after a logarithmic number of steps
Performance:
l
0
0
11
14
16
18
19
11
14
16
18
19
11
14
16
18
19
11
14
16
18
m
1
m
1
1
3
3
h
4
We store the items of the dictionary in an array-based sequence,
sorted by key
We use an external comparator for the keys
Performance:
l
0
Dictionaries
A lookup table is a dictionary implemented by means of a sorted
sequence
insertItem takes O(1) time since we can insert the new item at the
beginning or at the end of the sequence
findElement and removeElement take O(n) time since in the worst
case (the item is not found) we traverse the entire sequence to
look for an item with the given key
The log file is effective only for dictionaries of small size or for
dictionaries on which insertions are the most common
operations, while searches and removals are rarely performed
(e.g., historical record of logins to a workstation)
Example: findElement(7)
0
We store the items of the dictionary in a sequence (based on a
doubly-linked lists or a circular array), in arbitrary order
Lookup Table
Binary search performs operation findElement(k) on a dictionary
implemented by means of an array-based sequence, sorted by key
A log file is a dictionary implemented by means of an unsorted
sequence
6/8/2002 2:01 PM
Binary Search
Dictionaries
Log File
The dictionary ADT models a
searchable collection of keyelement items
The main operations of a
dictionary are searching,
inserting, and deleting items
Multiple items with the same
key are allowed
Applications:
Search (3.1.3)
Insertion (3.1.4)
Deletion (3.1.5)
Performance (3.1.6)
19
findElement takes O(log n) time, using binary search
insertItem takes O(n) time since in the worst case we have to shift
n/2 items to make room for the new item
removeElement take O(n) time since in the worst case we have to
shift n/2 items to compact the items after the removal
The lookup table is effective only for dictionaries of small size or
for dictionaries on which searches are the most common
operations, while insertions and removals are rarely performed
(e.g., credit card authorizations)
l=m =h
6/8/2002 2:01 PM
Dictionaries
6/8/2002 2:01 PM
Dictionaries
Dictionaries
6/8/2002 2:01 PM
Binary Search Tree
A binary search tree is a
binary tree storing keys
(or key-element pairs)
at its internal nodes and
satisfying the following
property:
Search
An inorder traversal of a
binary search trees
visits the keys in
increasing order
6
Let u, v, and w be three
nodes such that u is in
the left subtree of v and
w is in the right subtree
of v. We have
key(u) key(v) key(w)
External nodes do not
store items
6/8/2002 2:01 PM
Dictionaries
Insertion
6
<
2
>
>
w
6
Dictionaries
We consider the case where
the key k to be removed is
stored at a node v whose
children are both internal
we find the internal node w
that follows v in an inorder
traversal
we copy key(w) into node v
we remove node w and its
left child z (which must be a
leaf) by means of operation
removeAboveExternal(z)
Example: remove 3
6/8/2002 2:01 PM
Dictionaries
>
4 v
8
5
6
2
9
5
10
Performance
1
3
8
6
Consider a dictionary
with n items
implemented by means
of a binary search tree
of height h
1
5
8
6
Dictionaries
6/8/2002 2:01 PM
<
Deletion (cont.)
Dictionaries
To perform operation
removeElement(k), we
search for key k
Assume key k is in the tree,
and let let v be the node
storing k
If node v has a leaf child w,
we remove v and w from the
tree with operation
removeAboveExternal(w)
Example: remove 4
6/8/2002 2:01 PM
Deletion
To perform operation
insertItem(k, o), we search
for key k
Assume k is not already in
the tree, and let let w be
the leaf reached by the
search
We insert k at node w and
expand w into an internal
node
Example: insert 5
6/8/2002 2:01 PM
Algorithm findElement(k, v)
To search for a key k,
if T.isExternal (v)
we trace a downward
return NO_SUCH_KEY
path starting at the root
if
k < key(v)
The next node visited
return findElement(k, T.leftChild(v))
depends on the
else if k = key(v)
outcome of the
return element(v)
comparison of k with
else { k > key(v) }
the key of the current
return findElement(k, T.rightChild(v))
node
6
If we reach a leaf, the
<
key is not found and we
2
9
return NO_SUCH_KEY
>
8
Example:
1
4 =
findElement(4)
11
the space used is O(n)
methods findElement ,
insertItem and
removeElement take
O(h) time
The height h is O(n) in
the worst case and
O(log n) in the best
case
6/8/2002 2:01 PM
Dictionaries
12
Dictionaries
4/5/2002 15:1
Ordered Dictionaries
Binary Search Trees
order.
New operations:
<
2
Keys are assumed to come from a total
4 =
>
Binary Search Trees
closestKeyBefore(k)
closestElemBefore(k)
closestKeyAfter(k)
closestElemAfter(k)
Binary Search Trees
Binary Search (3.1.1)
Lookup Table (3.1.1)
Binary search performs operation findElement(k) on a dictionary
implemented by means of an array-based sequence, sorted by key
A lookup table is a dictionary implemented by means of a sorted
sequence
similar to the high-low game
at each step, the number of candidate items is halved
terminates after O(log n) steps
Example: findElement(7)
Performance:
11
14
16
18
19
l
0
11
14
16
18
19
11
14
16
18
19
11
14
16
18
19
l=m =h
Binary Search Trees
A binary search tree is a
binary tree storing keys
(or key-element pairs)
at its internal nodes and
satisfying the following
property:
Let u, v, and w be three
nodes such that u is in
the left subtree of v and
w is in the right subtree
of v. We have
key(u) key(v) key(w)
findElement takes O(log n) time, using binary search
insertItem takes O(n) time since in the worst case we have to shift
n/2 items to make room for the new item
removeElement take O(n) time since in the worst case we have to
shift n/2 items to compact the items after the removal
The lookup table is effective only for dictionaries of small size or
for dictionaries on which searches are the most common
operations, while insertions and removals are rarely performed
(e.g., credit card authorizations)
Binary Search
Tree (3.1.2)
We store the items of the dictionary in an array-based sequence,
sorted by key
We use an external comparator for the keys
Binary Search Trees
Search (3.1.3)
An inorder traversal of a
binary search trees
visits the keys in
increasing order
6
2
1
9
4
External nodes do not
store items
Binary Search Trees
To search for a key k,
we trace a downward
path starting at the root
The next node visited
depends on the
outcome of the
comparison of k with
the key of the current
node
If we reach a leaf, the
key is not found and we
return NO_SUCH_KEY
Example:
findElement(4)
Algorithm findElement(k, v)
if T.isExternal (v)
return NO_SUCH_KEY
if k < key(v)
return findElement(k, T.leftChild(v))
else if k = key(v)
return element(v)
else { k > key(v) }
return findElement(k, T.rightChild(v))
<
2
1
Binary Search Trees
6
9
>
4 =
Dictionaries
4/5/2002 15:1
Insertion (3.1.4)
Deletion (3.1.5)
6
<
To perform operation
insertItem(k, o), we search
for key k
Assume k is not already in
the tree, and let let w be
the leaf reached by the
search
We insert k at node w and
expand w into an internal
node
Example: insert 5
>
removeElement(k), we
search for key k
Assume key k is in the tree,
and let let v be the node
storing k
If node v has a leaf child w,
we remove v and w from the
tree with operation
removeAboveExternal(w)
Example: remove 4
>
w
6
Deletion (cont.)
We consider the case where
we find the internal node w
that follows v in an inorder
traversal
we copy key(w) into node v
we remove node w and its
left child z (which must be a
leaf) by means of operation
removeAboveExternal(z)
Example: remove 3
4 v
8
5
6
2
Binary Search Trees
9
5
Consider a dictionary
8
6
with n items
implemented by means
of a binary search tree
of height h
1
5
the space used is O(n)
methods findElement ,
insertItem and
removeElement take O(h)
time
The height h is O(n) in
8
6
Binary Search Trees
>
Performance (3.1.6)
1
the key k to be removed is
stored at a node v whose
children are both internal
Binary Search Trees
<
To perform operation
9
the worst case and
O(log n) in the best
case
Binary Search Trees
10
Red-Black Trees
4/10/2002 11:1
AVL Tree Definition
AVL trees are
AVL Trees
v
balanced.
An AVL Tree is a
17
48
n(1)
nodes of an AVL tree of height h.
17
78
32
50
48
n(h) > 2n(h-2), n(h) > 4n(h-4), n(h) > 8n(n-6), (by induction),
n(h) > 2in(h-2i)
Solving the base case we get: n(h) > 2 h/2-1
Taking logarithms: h < 2log n(h) +2
Thus the height of an AVL tree is O(log n)
44
2
48
62
b=x
54
after insertion
4
17
32
1
1
a=z
case 2: double rotation
(a right rotation about c,
then a left rotation about a)
c=y
T0
b=x
unbalanced...
2
1
4
62
T0
T3
T2
T1
b=x
44
c=y
4
3
17
32
a=z
88
54
T2
c=x
7
1
50
48
64
78
2 y
T3
b=y
case 1: single rotation
(a left rotation about a)
62
88
Insertion Example, continued
the three
a=z
50
AVL Trees
let (a,b,c) be an inorder listing of x, y, z
perform the rotations needed to make b the topmost node of
T3
32
before insertion
Trinode Restructuring
T2
88
T1
c=z
78
AVL Trees
T1
17
a=y
one AVL subtree of height n-1 and another of height n-2.
c=x
Insertion is as in a binary search tree
Always done by expanding an external node.
Example:
44
44
That is, n(h) = 1 + n(h-1) + n(h-2)
Knowing n(h-1) > n(h-2), we get n(h) > 2n(h-2). So
T0
An example of an AVL tree where the
heights are shown next to the nodes:
Insertion in an AVL Tree
We easily see that n(1) = 1 and n(2) = 2
For n > 2, an AVL tree of height h contains the root node,
b=y
AVL Trees
Fact: The height of an AVL tree storing n keys is O(log n).
Proof: Let us bound n(h): the minimum number of internal
a=z
62
...balanced
1
1
2 y
2
48
50
4 x
z6
62
78
54
7
88
T2
T0
T1
T2
T3
AVL Trees
Height of an AVL Tree
(other two cases
are symmetrical)
88
50
1
n(2)
32
children of v can
differ by at most 1.
AVL Trees
78
1
such that for every
internal node v of T,
the heights of the
binary search tree
6
3
44
T0
T1
T3
T2
5
AVL Trees
T0
T1
T3
Red-Black Trees
4/10/2002 11:1
Restructuring
(as Single Rotations)
Restructuring
(as Double Rotations)
Single Rotations:
double rotations:
a=z
single rotation
b=y
c=x
T0
T1
double rotation
a=z
c=x
T0
T1
T3
T2
T0
T3
T2
T1
single rotation
b=y
T3
T2
T1
a=x
T3
c=z
T3
T2
T1
17
48
54
before deletion of 32
48
78
54
using a linked-structure binary tree
find is O(log n)
height of tree is O(log n), no restructures needed
insert is O(log n)
initial find is O(log n)
Restructuring up the tree, maintaining heights is O(log n)
remove is O(log n)
initial find is O(log n)
Restructuring up the tree, maintaining heights is O(log n)
AVL Trees
T0
8
62
17
11
c=x
78
54
44
b=y
62
48
after deletion
a single restructure is O(1)
T1
44
50
Running Times for
AVL Trees
T2
up the tree from w. Also, let y be the child of z with the larger
height, and let x be the child of y with the larger height.
We perform restructure(x) to restore balance at z.
As this restructuring may upset the balance of another node
higher in the tree, we must continue checking for balance until
the root of T is reached
88
AVL Trees
T3
AVL Trees
a=z
50
88
c=z
Let z be the first unbalanced node encountered while travelling
62
78
b=x
Rebalancing after a Removal
means the node removed will become an empty
external node. Its parent, w, may cause an imbalance.
Example:
44
44
50
T3
T1
Removal begins as in a binary search tree, which
62
T0
T2
T0
Removal in an AVL Tree
17
T2
T1
b=x
AVL Trees
32
c=y
a=y
a=y
b=y
a=x
T0
T0
double rotation
c=z
c=z
b=x
a=z
c=y
b=x
T3
T2
b=y
a=z
17
50
48
88
AVL Trees
78
88
54
10
(2,4) Trees
6/8/2002 2:08 PM
Outline and Reading
Multi-way search tree (3.3.1)
(2,4) Trees
Definition
Search
(2,4) tree (3.3.2)
9
2 5 7
10 14
Definition
Search
Insertion
Deletion
Comparison of dictionary implementations
6/8/2002 2:08 PM
(2,4) Trees
Multi-Way Search Tree
Each internal node has at least two children and stores d 1
key-element items (ki, oi), where d is the number of children
For a node with children v1 v2 vd storing keys k1 k2 kd1
(2,4) Trees
keys in the subtree of v1 are less than k1
keys in the subtree of vi are between ki1 and ki (i = 2, , d 1)
keys in the subtree of vd are greater than kd1
We can extend the notion of inorder traversal from binary trees
to multi-way search trees
Namely, we visit item (ki, oi) of node v between the recursive
traversals of the subtrees of v rooted at children vi and vi + 1
An inorder traversal of a multi-way search tree visits the keys in
increasing order
11
The leaves store no items and serve as placeholders
11
2 6 8
2 6 8
27
24
24
15
Multi-Way Inorder Traversal
A multi-way search tree is an ordered tree such that
6/8/2002 2:08 PM
32
1
30
4
3
6
5
12
15
27
32
14
10
18
30
11
13
15
6/8/2002 2:08 PM
(2,4) Trees
Multi-Way Searching
k = ki (i = 1, , d 1): the search terminates successfully
k < k1: we continue the search in child v1
ki1 < k < ki (i = 2, , d 1): we continue the search in child vi
k > kd1: we continue the search in child vd
2 6 8
Node-Size Property: every internal node has at most four children
Depth Property: all the external nodes have the same depth
Depending on the number of children, an internal node of a
(2,4) tree is called a 2-node, 3-node or 4-node
10 15 24
24
15
A (2,4) tree (also called 2-4 tree or 2-3-4 tree) is a multi-way
search with the following properties
Reaching an external node terminates the search unsuccessfully
Example: search for 30
11
17
(2,4) Trees
(2,4) Tree
Similar to search in a binary search tree
A each internal node with children v1 v2 vd and keys k1 k2 kd1
6/8/2002 2:08 PM
19
16
27
32
2 8
12
18
27
32
30
6/8/2002 2:08 PM
(2,4) Trees
6/8/2002 2:08 PM
(2,4) Trees
(2,4) Trees
6/8/2002 2:08 PM
Height of a (2,4) Tree
Insertion
We insert a new item (k, o) at the parent v of the leaf reached by
searching for k
Theorem: A (2,4) tree storing n items has height O(log n)
Proof:
Let h be the height of a (2,4) tree with n items
Since there are at least 2i items at depth i = 0, , h 1 and no
items at depth h, we have
n 1 + 2 + 4 + + 2h1 = 2h 1
Thus, h log (n + 1)
We preserve the depth property but
We may cause an overflow (i.e., node v may become a 5-node)
Example: inserting key 30 causes an overflow
10 15 24
Searching in a (2,4) tree with n items takes O(log n) time
depth items
0
1
1
h1
2h1
0
(2,4) Trees
v" is a 2-node with key k4 and children v4 v5
The overflow may propagate to the parent node u
15 24 32
15 24
v'
27 30 32 35
12
6/8/2002 2:08 PM
18
27 30
v"
35
v1 v2 v3 v4
v1 v2 v3 v4 v5
(2,4) Trees
3. while overflow(v)
if isRoot(v)
create a new empty root above v
v split(v)
6/8/2002 2:08 PM
Tree T has O(log n)
height
Step 1 takes O(log n)
time because we visit
O(log n) nodes
Step 2 takes O(1) time
Step 3 takes O(log n)
time because each split
takes O(1) time and we
perform O(log n) splits
Thus, an insertion in a
(2,4) tree takes O(log n)
time
(2,4) Trees
10
Deleting an item from a node v may cause an underflow, where
node v becomes a 1-node with one child and no keys
To handle an underflow at node v with parent u, we consider two
cases
Case 1: the adjacent siblings of v are 2-nodes
10 15 24
12
18
27 32 35
Fusion operation: we merge v with an adjacent sibling w and move
an item from u to the merged node v'
After a fusion, the underflow may propagate to the parent u
u
10 15 27
6/8/2002 2:08 PM
Underflow and Fusion
We reduce deletion of an item to the case where the item is at the
node with leaf children
Otherwise, we replace the item with its inorder successor (or,
equivalently, with its inorder predecessor) and delete the latter item
Example: to delete key 24, we replace it with 27 (inorder successor)
2 8
2. We add the new item (k, o) at node v
v5
Deletion
2 8
27 30 32 35
18
Let T be a (2,4) tree
with n items
1. We search for key k to locate the
insertion node v
key k3 is inserted into the parent u of v (a new root may be created)
18
27 32 35
(2,4) Trees
Algorithm insertItem(k, o)
let v1 v5 be the children of v and k1 k4 be the keys of v
node v is replaced nodes v' and v"
v' is a 3-node with keys k1 k2 and children v1 v2 v3
12
12
18
Analysis of Insertion
We handle an overflow at a 5-node v with a split operation:
2 8
6/8/2002 2:08 PM
Overflow and Split
12
10 15 24
6/8/2002 2:08 PM
2 8
12
(2,4) Trees
18
2 5 7
9 14
10
2 5 7
9
10 14
v'
32 35
11
6/8/2002 2:08 PM
(2,4) Trees
12
(2,4) Trees
6/8/2002 2:08 PM
Underflow and Transfer
Analysis of Deletion
To handle an underflow at node v with parent u, we consider
two cases
Case 2: an adjacent sibling w of v is a 3-node or a 4-node
Let T be a (2,4) tree with n items
Transfer operation:
1. we move a child of w to v
2. we move an item from u to v
3. we move an item from w to u
After a transfer, no underflow occurs
u
4 9
2
6 8
4 8
6/8/2002 2:08 PM
Tree T has O(log n) height
In a deletion operation
(2,4) Trees
13
We visit O(log n) nodes to locate the node from
which to delete the item
We handle an underflow with a series of O(log n)
fusions, followed by at most one transfer
Each fusion and transfer takes O(1) time
Thus, deleting an item from a (2,4) tree takes
O(log n) time
6/8/2002 2:08 PM
(2,4) Trees
14
Implementing a Dictionary
Comparison of efficient dictionary implementations
Search
Hash
Table
Skip List
(2,4)
Tree
6/8/2002 2:08 PM
Insert
Delete
expected
expected
expected
Notes
no ordered dictionary
methods
simple to implement
log n
log n
log n
high prob.
high prob.
high prob.
randomized insertion
simple to implement
complex to implement
log n
log n
log n
worst-case
worst-case
worst-case
(2,4) Trees
15
Red-Black Trees
6/8/2002 2:20 PM
Outline and Reading
From (2,4) trees to red-black trees (3.3.3)
Red-black tree ( 3.3.3)
Red-Black Trees
3
4
Definition
Height
Insertion
restructuring
recoloring
Deletion
restructuring
recoloring
adjustment
6/8/2002 2:20 PM
Red-Black Trees
From (2,4) to Red-Black Trees
same logarithmic time performance
simpler implementation with a single node type
Red-Black Trees
Red-Black Tree
A red-black tree is a representation of a (2,4) tree by means of a
binary tree whose nodes are colored red or black
In comparison with its associated (2,4) tree, a red-black tree has
6/8/2002 2:20 PM
A red-black tree can also be defined as a binary
search tree that satisfies the following properties:
2 6 7
Root Property: the root is black
External Property: every leaf is black
Internal Property: the children of a red node are black
Depth Property: all the leaves have the same black depth
9
4
5
3
6/8/2002 2:20 PM
OR
6
5
Red-Black Trees
The height of a red-black tree is at most twice the height of
its associated (2,4) tree, which is O(log n)
The search algorithm for a binary search tree is the
same as that for a binary search tree
By the above theorem, searching in a red-black tree
takes O(log n) time
Red-Black Trees
21
12
7
6/8/2002 2:20 PM
Red-Black Trees
Insertion
Theorem: A red-black tree storing n items has height
O(log n)
Proof:
6/8/2002 2:20 PM
Height of a Red-Black Tree
15
To perform operation insertItem(k, o), we execute the insertion
algorithm for binary search trees and color red the newly inserted
node z unless it is the root
We preserve the root, external, and depth properties
If the parent v of z is black, we also preserve the internal property and
we are done
Else (v is red ) we have a double red (i.e., a violation of the internal
property), which requires a reorganization of the tree
Example where the insertion of 4 causes a double red:
6
3
6/8/2002 2:20 PM
6
8
3
4
Red-Black Trees
Red-Black Trees
6/8/2002 2:20 PM
Remedying a Double Red
Restructuring
Consider a double red with child z and parent v, and let w be
the sibling of v
Case 1: w is black
Case 2: w is red
The double red is an incorrect
replacement of a 4-node
Restructuring: we change the
4-node replacement
4
2
The double red corresponds
to an overflow
Recoloring: we perform the
equivalent of a split
4
2
4 6 7
A restructuring remedies a child-parent double red when the
parent red node has a black sibling
It is equivalent to restoring the correct replacement of a 4-node
The internal property is restored and the other properties are
preserved
z
6
4
v
v
w
7
7
2
4
z
w
2
6
4 6 7
2 4 6 7
.. 2 ..
.. 2 ..
6/8/2002 2:20 PM
Red-Black Trees
Restructuring (cont.)
6
6
4
4
.. 2 ..
6/8/2002 2:20 PM
Red-Black Trees
Recoloring
A recoloring remedies a child-parent double red when the parent
red node has a red sibling
The parent v and its sibling w become black and the grandparent u
becomes red, unless it is the root
It is equivalent to performing a split on a 5-node
The double red violation may propagate to the grandparent u
There are four restructuring configurations depending on
whether the double red nodes are left or right children
4 6 7
2
4
6
4
2
4
2
4
2
6/8/2002 2:20 PM
Red-Black Trees
Analysis of Insertion
Algorithm insertItem(k, o)
1. We search for key k to locate
the insertion node z
2. We add the new item (k, o) at
node z and color z red
3. while doubleRed(z)
if isBlack(sibling(parent(z)))
z restructure(z)
return
else { sibling(parent(z) is red }
z recolor(z)
6/8/2002 2:20 PM
Red-Black Trees
6/8/2002 2:20 PM
6 7
Red-Black Trees
10
Deletion
Recall that a red-black tree
has O(log n) height
Step 1 takes O(log n) time
because we visit O(log n)
nodes
Step 2 takes O(1) time
Step 3 takes O(log n) time
because we perform
2 4 6 7
O(log n) recolorings, each
taking O(1) time, and
at most one restructuring
taking O(1) time
To perform operation remove(k), we first execute the deletion
algorithm for binary search trees
Let v be the internal node removed, w the external node removed,
and r the sibling of w
If either v of r was red, we color r black and we are done
Else (v and r were both black) we color r double black, which is a
violation of the internal property requiring a reorganization of the tree
Example where the deletion of 8 causes a double black:
6
Thus, an insertion in a redblack tree takes O(log n) time
11
6/8/2002 2:20 PM
v
w
Red-Black Trees
12
Red-Black Trees
6/8/2002 2:20 PM
Remedying a Double Black
Red-Black Tree Reorganization
The algorithm for remedying a double black node w with sibling
y considers three cases
Case 1: y is black and has a red child
We perform a restructuring, equivalent to a transfer , and we are
done
Case 2: y is black and its children are both black
We perform a recoloring, equivalent to a fusion, which may
propagate up the double black violation
Case 3: y is red
We perform an adjustment, equivalent to choosing a different
representation of a 3-node, after which either Case 1 or Case 2
applies
Deletion in a red-black tree takes O(log n) time
6/8/2002 2:20 PM
Red-Black Trees
13
Insertion
remedy double red
Red-black tree action
(2,4) tree action
result
restructuring
change of 4-node
representation
double red removed
recoloring
split
double red removed
or propagated up
Deletion
remedy double black
Red-black tree action
(2,4) tree action
result
restructuring
transfer
double black removed
recoloring
fusion
double black removed
or propagated up
adjustment
change of 3-node
representation
restructuring or
recoloring follows
6/8/2002 2:20 PM
Red-Black Trees
14
Skip Lists
4/5/2002 15:3
Outline and Reading
What is a skip list (3.5)
Operations
Skip Lists
Search (3.5.1)
Insertion (3.5.2)
Deletion (3.5.2)
S3
S2
S0
10
15
S1
15
23
15
23
Implementation
Analysis (3.5.3)
+
36
Space usage
Search and update times
4/5/2002 15:30
Skip Lists
What is a Skip List
4/5/2002 15:30
We search for a key x in a a skip list as follows:
lists S0, S1 , , Sh such that
S2
S1
S0
31
23
12
23
26
4/5/2002 15:30
31
34
31
34
64
44
56
64
78
Skip Lists
performs coin tosses (i.e.,
uses random bits) to control
its execution
It contains statements of the
type
S3
S2
S1
S0
+
3
b random()
if b = 0
do A
else { b = 1}
do B
4/5/2002 15:30
the coins are unbiased, and
the coin tosses are
independent
of a randomized algorithm is
often large but has very low
probability (e.g., it occurs
when all the coin tosses give
heads)
We use a randomized
algorithm to insert items into
a skip list
Skip Lists
23
12
23
26
4/5/2002 15:30
31
34
31
34
64
44
56
64
78
Skip Lists
To insert an item (x, o) into a skip list, we use a randomized
algorithm:
The worst-case running time
Its running time depends on
the outcomes of the coin
tosses
running time of a
randomized algorithm under
the following assumptions
+
31
Insertion
We analyze the expected
Example: search for 78
Randomized Algorithms
A randomized algorithm
We start at the first position of the top list
At the current position p, we compare x with y key(after(p))
x = y: we return element(after(p))
x > y: we scan forward
x < y: we drop down
If we try to drop down past the bottom list, we return NO_SUCH_KEY
Each list Si contains the special keys + and
List S0 contains the keys of S in nondecreasing order
Each list is a subsequence of the previous one, i.e.,
S0 S1 Sh
List Sh contains only the two special keys
We show how to use a skip list to implement the dictionary ADT
S3
Search
A skip list for a set S of distinct (key, element) items is a series of
Skip Lists
We repeatedly toss a coin until we get tails, and we denote with i
the number of times the coin came up heads
If i h, we add to the skip list new lists Sh+1, , Si +1, each
containing only the two special keys
We search for x in the skip list and find the positions p0, p1 , , pi
of the items with largest key less than x in each list S0, S1, , Si
For j 0, , i, we insert item (x, o) into list Sj after position pj
Example: insert key 15, with i = 2
p2
S2
p1
S1
S0
p0
10
4/5/2002 15:30
23
23
36
S3
S2
15
S1
15
23
S0
15
23
Skip Lists
10
+
+
+
36
6
Skip Lists
4/5/2002 15:3
Deletion
Implementation
To remove an item with key x from a skip list, we proceed as
We can implement a skip list
with quad-nodes
follows:
We search for x in the skip list and find the positions p0, p1 , , pi
of the items with key x, where position pj is in list Sj
We remove positions p0, p1 , , pi from the lists S0, S1, , Si
We remove all but one list containing only the two special keys
A quad-node stores:
Example: remove key 34
S3
34
S1
S0
p2
S2
12
23
34
23
34
p1
p0
45
4/5/2002 15:30
S2
S1
S0
+
+
23
12
23
Consider a skip list with n
items
By Fact 1, we insert an item
in list Si with probability 1/2i
By Fact 2, the expected size
of list Si is n/2i
The expected number of
Fact 1: The probability of getting i
consecutive heads when
flipping a coin is 1/2i
Fact 2: If each of n items is
present in a set with
probability p, the expected size
of the set is np
nodes used by the skip list is
h
n
1
2i = n 2i < 2n
i =0
i =0
Thus, the expected space
usage of a skip list with n
items is O(n)
Skip Lists
Search and Update Times
The search time in a skip list
is proportional to
PLUS_INF and MINUS_INF,
and we modify the key
comparator to handle them
4/5/2002 15:30
Skip Lists
the destination key does not
belong to a higher list
The drop-down steps are
bounded by the height of the
skip list and thus are O(log n)
with high probability
To analyze the scan-forward
steps, we use yet another
probabilistic fact:
Fact 4: The expected number of
coin tosses required in order
to get tails is 2
A scan-forward step is
associated with a former coin
toss that gave tails
By Fact 4, in each list the
expected number of scanforward steps is 2
Thus, the expected number of
scan-forward steps is O(log n)
We conclude that a search in a
skip list takes O(log n)
expected time
The analysis of insertion and
deletion gives similar results
Skip Lists
Consider a skip list with n
The running time of the
search an insertion
algorithms is affected by the
height h of the skip list
We show that with high
probability, a skip list with n
items has height O(log n)
We use the following
additional probabilistic fact:
Fact 3: If each of n events has
probability p, the probability
that at least one event
occurs is at most np
4/5/2002 15:30
items
By Fact 1, we insert an item in
list Si with probability 1/2i
By Fact 3, the probability that
list Si has at least one item is
at most n/2i
By picking i = 3log n, we have
that the probability that S3log n
has at least one item is
at most
n/23log n = n/n3 = 1/n2
Thus a skip list with n items
has height at most 3log n with
probability at least 1 1/n2
Skip Lists
10
Summary
When we scan forward in a list,
the number of drop-down
steps, plus
the number of scan-forward
steps
4/5/2002 15:30
quad-node
before
after
below
after
Height
depends on the random bits
used by each invocation of the
insertion algorithm
We use the following two basic
probabilistic facts:
node
node
node
node
45
Skip Lists
The space used by a skip list
the
the
the
the
Also, we define special keys
Space Usage
4/5/2002 15:30
item
link to
link to
link to
link to
11
A skip list is a data
structure for
dictionaries that uses a
randomized insertion
algorithm
In a skip list with n
items
The expected space used
is O(n)
The expected search,
insertion and deletion
time is O(log n)
4/5/2002 15:30
Using a more complex
probabilistic analysis,
one can show that
these performance
bounds also hold with
high probability
Skip lists are fast and
simple to implement in
practice
Skip Lists
12
Red-Black Trees
4/5/2002 15:2
Splay Trees are
Binary Search Trees
Splay Trees
(10,A)
(35,R)
BST Rules:
3
4
items stored only at internal
nodes
keys stored at nodes in the
left subtree of v are less
than or equal to the key
stored at v
keys stored at nodes in the
right subtree of v are
greater than or equal to the
key stored at v
(14,J)
(7,T)
(1,Q)
(1,C)
(5,H)
all the keys in the yellow
region are 20
Example Searching in a BST,
continued
(20,Z)
(10,A)
(21,O)
(8,N)
(5,H)
(1,Q)
(40,X)
(1,C)
(10,U)
Splaying:
start with
node x
is x the
root?
splaying moves a node to the root using rotations
left rotation
yes
stop
is x a child of
the root?
no
T1
T2
is x a left-left
grandchild?
is x a right-right
grandchild?
yes
is x a right-left
grandchild?
T2
T1
is x the left
child of the
root?
T3
T3
yes
(structure of tree above y
is not modified)
T2
T3
(structure of tree above x
is not modified)
Splay Trees
T1
zig
right-rotate
about the root
T2
5
(6,Y)
left-left grandchild means x is a left child of its
parent, which is itself a left child of its parent
p is xs parent; g is ps parent
a left rotation about x
T1
(10,U)
x is a
yes
no
zig
(40,X)
no
y
T3
(37,P)
(36,L)
(5,G)
yes
makes the right child y of a node x
into xs parent; x becomes the left
child of y
(21,O)
Splay Trees
new operation: splay
a right rotation about y
(7,P)
(5,I)
(5,H)
(2,R)
Splay Trees do Rotations after
Every Operation (Even Search)
makes the left child x of a node y into
ys parent; y becomes the right child
of x
(14,J)
(8,N)
(6,Y)
Splay Trees
(35,R)
(7,T)
(5,G)
(5,I)
right rotation
(10,A)
(37,P)
(36,L)
(7,P)
(2,R)
an internal node.
(35,R)
(14,J)
(7,T)
(1,C)
(6,Y)
(5,I)
search for key 8, ends at
(1,Q)
(10,U)
(5,G)
(20,Z)
the tree to found item
or an external node.
Example: Search for
time with key 11.
(40,X)
Splay Trees
Searching in a Splay Tree:
Starts the Same as in a BST
Search proceeds down
(37,P)
(36,L)
(7,P)
(2,R)
return the keys in order
Splay Trees
(21,O)
(8,N)
An inorder traversal will
all the keys in the blue
region are 20
(20,Z)
note that two keys of
equal value may be wellseparated
yes
is x a left-right
grandchild?
left-rotate about
the root
yes
Splay Trees
zig-zig
right-rotate about g,
right-rotate about p
zig-zig
left-rotate about g,
left-rotate about p
zig-zag
left-rotate about p,
right-rotate about g
zig-zag
right-rotate about p,
left-rotate about g
6
Red-Black Trees
4/5/2002 15:2
Splaying Example
Visualizing the
Splaying Cases
zig-zag
let x = (8,N)
x is the right child of its parent,
which is the left child of the
grandparent
left-rotate around p, then rightrotate around g
z
z
y
y
T4
T1
T1
T4
T2
T2
T2
T3
T4
T1
T1
T2
T2
T3
(1,C)
T4
(7,P)
(21,O)
(14,J)
(10,U)
(5,G)
(6,Y)
(40,X)
(1,C)
(after first rotation)
(10,A)
(21,O)
(7,P)
1.
(before applying
rotation)
(1,Q)
(5,H)
(6,Y)
(after second
rotation)
x is not yet the root, so
we splay again 8
(6,Y)
(5,I)
(8,N)
2.
(20,Z)
(20,Z)
(10,A)
before
(35,R)
(14,J)
(7,T)
(1,Q)
(21,O)
(8,N)
(5,H)
(7,P)
(14,J)
(21,O)
(10,U)
(5,G)
(5,G)
(40,X)
(6,Y)
(5,I)
(36,L)
(40,X)
(1,Q)
(35,R)
(37,P)
(14,J)
(7,T)
(37,P)
(8,N)
(1,C)
(5,H)
(7,P)
(2,R)
x is the root, so stop
(10,U)
(5,I)
(21,O)
(1,C)
(36,L)
(35,R)
(8,N)
(5,H)
(2,R)
after first splay
(5,G)
(7,P)
(21,O)
(36,L)
(10,U)
(5,G)
(5,I)
(6,Y)
(6,Y)
after second
splay
Splay Trees
10
Splay Trees & Ordered
Dictionaries
Splay Tree Definition
which nodes are splayed after each operation?
a splay tree is a binary search tree where a
node is splayed after it is accessed (for a
search or update)
method
deepest internal node accessed is splayed
splaying costs O(h), where h is height of the tree
which is still O(n) worst-case
findElement
insertElement
O(h) rotations, each of which is O(1)
removeElement
Splay Trees
(10,A)
(37,P)
(6,Y)
Splay Trees
(40,X)
(10,U)
(7,P)
(40,X)
(14,J)
(7,T)
(35,R)
(10,A)
(5,H)
(37,P)
(36,L)
(20,Z)
(10,A)
(after rotation)
(40,X)
3.
(5,G)
before, the depth of the shallowest leaf is(1,C)
3 and the deepest is 7
after, the depth of shallowest leaf is 1
(2,R)
and deepest is 8
(1,Q)
(1,C)
(37,P)
(36,L)
(14,J)
(10,U)
(2,R)
tree might not be more balanced
e.g. splay (40,X)
(7,T)
(5,I)
(35,R)
(20,Z)
(2,R)
(40,X)
(7,T)
Example Result
of Splaying
(37,P)
(36,L)
(36,L)
(5,G)
(10,A)
(8,N)
(1,Q)
(5,H)
(35,R)
(8,N)
(5,I)
(6,Y)
Splay Trees
right-rotate around root
(10,U)
(7,P)
(5,G)
(37,P)
now x is the left child of the root
(2,R)
(5,H)
(20,Z)
2.
(2,R)
Splaying Example, Continued
(5,H)
(1,C)
(7,P)
(5,I)
Splay Trees
(20,Z)
(21,O)
(10,U)
(7,T)
T3
T4
(before
rotating)
(40,X)
(35,R)
(14,J)
(8,N)
(1,Q)
T4
T2
T3
1.
(37,P)
(36,L)
g
p
(1,C)
(8,N)
(10,A)
zig
T1
(21,O)
(20,Z)
T3
(1,Q)
(1,Q)
(5,I)
zig-zig
(35,R)
(14,J)
(7,T)
(2,R)
T3
(7,T)
(10,A)
g
p
T1
(20,Z)
11
splay node
if key found, use that node
if key not found, use parent of ending external node
use the new node containing the item inserted
use the parent of the internal node that was actually
removed from the tree (the parent of the node that the
removed item was swapped with)
Splay Trees
12
Red-Black Trees
4/5/2002 15:2
Amortized Analysis of
Splay Trees
Cost per zig
Running time of each operation is proportional to time
for splaying.
Define rank(v) as the logarithm (base 2) of the number
of nodes in subtree rooted at v.
Costs: zig = $1, zig-zig = $2, zig-zag = $2.
Thus, cost for playing a node at depth d = $d.
Imagine that we store rank(v) cyber-dollars at each
node v of the splay tree (just for the sake of analysis).
zig-zig
T4
T1
T1
T2
T3
T1
Doing a zig at x costs at most rank(x) - rank(x):
T2
T1
cost = rank(x) + rank(y) - rank(y) - rank(x)
< rank(x) - rank(x).
14
at most 3(rank(r) - rank(x)) - d + 2:
Proof: Splaying x takes d/2 splaying substeps:
d /2
cost cost i
i =1
(3( rank i ( x ) rank i 1 ( x )) 2) + 2
x
z
T4
T4
d /2
zig-zag
y
T3
rooted at r:
T4
3(rank(x) - rank(x)) - 2.
Proof: See Theorem 3.9, Page 192.
z
T2
Cost of splaying a node x at depth d of a tree
z
T2
Doing a zig-zig or zig-zag at x costs at most
T1
T2
Cost of Splaying
y
T1
T3
T3
Splay Trees
13
Cost per zig-zig and zig-zag
x
T4
Splay Trees
zig
x
i =1
y
T2
T3
= 3( rank ( r ) rank 0 ( x )) 2(d / d ) + 2
T4
3( rank ( r ) rank ( x )) d + 2.
T3
Splay Trees
15
Performance of
Splay Trees
Recall: rank of a node is logarithm of its size.
Thus, amortized cost of any splay operation is
O(log n).
In fact, the analysis goes through for any
reasonable definition of rank(x).
This implies that splay trees can actually
adapt to perform searches on frequentlyrequested items much faster than O(log n) in
some cases. (See Theorems 3.10 and 3.11.)
Splay Trees
17
Splay Trees
16
Locators
5/15/2002 11:36 AM
Outline and Reading
3 a
Locators (2.4.4)
Locator-based methods (2.4.4)
Implementation
Positions vs. Locators
Locators
1 g
5/15/2002 11:36 AM
4 e
Locators
Locators
Application example:
key
element
position (or rank) of
the item in the
underlying structure
binary search tree
with locators
5/15/2002 11:36 AM
When an order is placed,
a locator to it is returned
Given a locator, an order
can be canceled or
modified
Locators
insert(k, o): inserts the item
(k, o) and returns a locator
for it
min(): returns the locator of
an item with smallest key
remove(l): remove the item
with locator l
replaceKey(l, k): replaces
the key of the item with
locator l
replaceElement(l, o):
replaces with o the element
of the item with locator l
5/15/2002 11:36 AM
locators(): returns an iterator
over the locators of the items
in the priority queue
Locator-based dictionary
methods:
insert(k, o): inserts the item
(k, o) and returns its locator
find(k): if the dictionary
contains an item with key k,
returns its locator, else return
the special locator
NO_SUCH_KEY
remove(l): removes the item
with locator l and returns its
element
locators(), replaceKey(l, k),
replaceElement(l, o)
Locators
Positions vs. Locators
6 d
3 a
Position
9 b
In turn, the position
(or array cell) stores
the locator
Example:
number of shares
Implementation
The locator is an
object storing
Locator-based priority queue
methods:
the price
the element is the
key(): returns the key of the
item associated with the locator
element(): returns the element
of the item associated with the
locator
5/15/2002 11:36 AM
Orders to purchase and
sell a given stock are
stored in two priority
queues (sell orders and
buy orders)
the key of an order is
claim check
reservation number
Methods of the locator ADT:
Locators
Locator-based Methods
A locators identifies and tracks a
(key, element) item within a data
structure
A locator sticks with a specific
item, even if that element
changes its position in the data
structure
Intuitive notion:
5/15/2002 11:36 AM
1 g
Locators
4 e
Locator
represents a place in a
data structure
related to other positions in
the data structure (e.g.,
previous/next or
parent/child)
implemented as a node or
an array cell
Position-based ADTs (e.g.,
sequence and tree) are
fundamental data storage
schemes
8 c
5/15/2002 11:36 AM
identifies and tracks a (key,
element) item
unrelated to other locators in
the data structure
implemented as an object
storing the item and its
position in the underlying
structure
Key-based ADTs (e.g., priority
queue and dictionary) can be
augmented with locator-based
methods
Locators
Merge Sort
4/9/2002 10:0
Outline and Reading
Divide-and-conquer paradigm (4.1.1)
Merge-sort (4.1.1)
Merge Sort
7 29 4 2 4 7 9
72 2 7
94 4 9
77
4/9/2002 10:09
22
99
44
Merge Sort
Generic merging and set operations (4.2.1)
Summary of sorting algorithms (4.2.1)
1
Divide-and-Conquer
Divide-and conquer is a
Divide: divide the input data
S in two disjoint subsets S1
and S2
Recur: solve the
subproblems associated
with S1 and S2
Conquer: combine the
solutions for S1 and S2 into a
solution for S
The base case for the
sequence S with n
elements consists of
three steps:
It uses a comparator
It has O(n log n) running
time
Unlike heap-sort
recursion are subproblems of
size 0 or 1
4/9/2002 10:09
Merge Sort
Merge-sort on an input
algorithm based on the
divide-and-conquer
paradigm
Like heap-sort
4/9/2002 10:09
Merge-Sort
Merge-sort is a sorting
general algorithm design
paradigm:
Algorithm
Merging two sorted sequences
Merge-sort tree
Execution example
Analysis
It does not use an
auxiliary priority queue
It accesses data in a
sequential manner
(suitable to sort data on a
disk)
Merge Sort
Divide: partition S into
two sequences S1 and S2
of about n/2 elements
each
Recur: recursively sort S1
and S2
Conquer: merge S1 and
S2 into a unique sorted
sequence
4/9/2002 10:09
Algorithm mergeSort(S, C)
Input sequence S with n
elements, comparator C
Output sequence S sorted
according to C
if S.size() > 1
(S1, S2) partition(S, n/2)
mergeSort(S1, C)
mergeSort(S2, C)
S merge(S1, S2)
Merge Sort
Merging Two Sorted Sequences
Merge-Sort Tree
The conquer step of
An execution of merge-sort is depicted by a binary tree
merge-sort consists
of merging two
sorted sequences A
and B into a sorted
sequence S
containing the union
of the elements of A
and B
Merging two sorted
sequences, each
with n/2 elements
and implemented by
means of a doubly
linked list, takes O(n)
time
4/9/2002 10:09
Algorithm merge(A, B)
Input sequences A and B with
n/2 elements each
Output sorted sequence of A B
unsorted sequence before the execution and its partition
sorted sequence at the end of the execution
S empty sequence
while A.isEmpty() B.isEmpty()
if A.first().element() < B.first().element()
S.insertLast(A.remove(A.first()))
else
S.insertLast(B.remove(B.first()))
while A.isEmpty()
S.insertLast(A.remove(A.first()))
while B.isEmpty()
S.insertLast(B.remove(B.first()))
return S
Merge Sort
each node represents a recursive call of merge-sort and stores
the root is the initial call
the leaves are calls on subsequences of size 0 or 1
7 2
7
9 4 2 4 7 9
2 2 7
77
4/9/2002 10:09
22
4 4 9
99
Merge Sort
44
6
Merge Sort
4/9/2002 10:0
Execution Example
Execution Example (cont.)
Partition
Recursive call, partition
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 2 9 4 2 4 7 9
7 2 2 7
77
22
3 8 6 1 1 3 8 6
9 4 4 9
99
4/9/2002 10:09
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
44
3 8 3 8
33
88
7 29 4 2 4 7 9
6 1 1 6
66
Merge Sort
11
7
Execution Example (cont.)
7 2 2 7
77
22
77
22
99
4/9/2002 10:09
44
3 8 3 8
33
88
6 1 1 6
66
11
9
722 7
77
22
22
4/9/2002 10:09
99
Merge Sort
3 8 3 8
33
99
44
3 8 3 8
33
88
6 1 1 6
66
Merge Sort
11
10
Merge
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
3 8 6 1 1 3 8 6
44
11
3 8 6 1 1 3 8 6
9 4 4 9
4/9/2002 10:09
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
77
66
Execution Example (cont.)
Recursive call, base case
9 4 4 9
88
Merge Sort
7 29 4 2 4 7 9
Execution Example (cont.)
722 7
33
6 1 1 6
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
Merge Sort
7 29 4 2 4 7 9
44
3 8 3 8
Recursive call, base case
3 8 6 1 1 3 8 6
9 4 4 9
99
4/9/2002 10:09
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
722 7
9 4 4 9
Execution Example (cont.)
Recursive call, partition
7 29 4 2 4 7 9
3 8 6 1 1 3 8 6
88
7 29 4 2 4 7 9
6 1 1 6
66
11
11
722 7
77
22
4/9/2002 10:09
3 8 6 1 1 3 8 6
9 4 4 9
99
44
Merge Sort
3 8 3 8
33
88
6 1 1 6
66
11
12
Merge Sort
4/9/2002 10:0
Execution Example (cont.)
Execution Example (cont.)
Recursive call, , base case, merge
Merge
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 29 4 2 4 7 9
722 7
77
3 8 6 1 1 3 8 6
9 4 4 9
22
99
4/9/2002 10:09
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
44
3 8 3 8
33
88
7 29 4 2 4 7 9
6 1 1 6
66
Merge Sort
11
13
Execution Example (cont.)
722 7
77
22
77
22
99
4/9/2002 10:09
44
3 8 3 8
33
88
6 1 1 6
66
Merge Sort
11
15
The overall amount or work done at the nodes of depth i is O(n)
we partition and merge 2i sequences of size n/2i
we make 2i+1 recursive calls
Thus, the total running time of merge-sort is O(n log n)
1
n/2
2i
n/2i
4/9/2002 10:09
Merge Sort
66
Merge Sort
11
14
722 7
77
22
3 8 6 1 1 3 8 6
9 4 4 9
99
3 8 3 8
44
4/9/2002 10:09
33
88
6 1 1 6
66
Merge Sort
Algorithm
Time
selection-sort
O(n2)
insertion-sort
O(n2)
heap-sort
O(n log n)
merge-sort
O(n log n)
depth #seqs size
0
88
11
16
Summary of Sorting Algorithms
at each recursive call we divide in half the sequence,
33
7 29 4 2 4 7 9
The height h of the merge-sort tree is O(log n)
44
6 1 1 6
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
Analysis of Merge-Sort
3 8 3 8
Merge
3 8 6 1 1 3 8 6
9 4 4 9
99
4/9/2002 10:09
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
722 7
9 4 4 9
Execution Example (cont.)
Recursive call, , merge, merge
7 29 4 2 4 7 9
3 8 6 1 1 3 8 6
17
4/9/2002 10:09
Notes
slow
in-place
for small data sets (< 1K)
slow
in-place
for small data sets (< 1K)
fast
in-place
for large data sets (1K 1M)
fast
sequential data access
for huge data sets (> 1M)
Merge Sort
18
Quick-Sort
4/9/2002 10:1
Outline and Reading
Quick-sort (4.3)
Quick-Sort
7 4 9 6 2 2 4 6 7 9
4 2 2 4
7 9 7 9
22
Analysis of quick-sort (4.3.1)
In-place quick-sort (4.8)
Summary of sorting algorithms
99
Quick-Sort
Quick-Sort
We partition an input
sorting algorithm based
on the divide-and-conquer
paradigm:
sequence as follows:
Divide: pick a random
element x (called pivot) and
partition S into
E elements equal x
is at the beginning or at the
end of a sequence, and
hence takes O(1) time
Thus, the partition step of
quick-sort takes O(n) time
G elements greater than x
Recur: sort L and G
Conquer: join L, E and G
Quick-Sort
Quick-Sort Tree
Each node represents a recursive call of quick-sort and stores
Pivot selection
7 2 9 43 7 6 1 1 2 3 4 6 7 8 9
Sorted sequence at the end of the execution
Algorithm partition(S, p)
Input sequence S, position p of pivot
Output subsequences L, E, G of the
elements of S less than, equal to,
or greater than the pivot, resp.
L, E, G empty sequences
x S.remove(p)
while S.isEmpty()
y S.remove(S.first())
if y < x
L.insertLast(y)
else if y = x
E.insertLast(y)
else { y > x }
G.insertLast(y)
return L, E, G
Quick-Sort
Unsorted sequence before the execution and its pivot
Execution Example
An execution of quick-sort is depicted by a binary tree
We remove, in turn, each
element y from S and
We insert y into L, E or G,
depending on the result of
the comparison with the
pivot x
Each insertion and removal
L elements less than x
Quick-Sort
Partition
Quick-sort is a randomized
Algorithm
Partition step
Quick-sort tree
Execution example
The root is the initial call
The leaves are calls on subsequences of size 0 or 1
7 2 9 4 2 4 7 9
3 8 6 1 1 3 8 6
7 4 9 6 2 2 4 6 7 9
4 2 2 4
22
7 9 7 9
22
99
99
Quick-Sort
9 4 4 9
33
88
44
Quick-Sort
Quick-Sort
4/9/2002 10:1
Execution Example (cont.)
Execution Example (cont.)
Partition, recursive call, pivot selection
Partition, recursive call, base case
7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9
2 4 3 1 2 4 7 9
22
3 8 6 1 1 3 8 6
9 4 4 9
99
7 2 9 43 7 6 1 1 2 3 4 6 7 8 9
33
2 4 3 1 2 4 7
88
11
44
7
Execution Example (cont.)
99
33
2 4 3 1 1 2 3 4
88
11
Execution Example (cont.)
99
44
10
Join, join
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
7 9 7 1 1 3 8 6
2 4 3 1 1 2 3 4
99
44
Quick-Sort
99
Quick-Sort
7 2 9 43 7 6 1 1 2 3 4 6 7 8 9
88
88
Execution Example (cont.)
Partition, , recursive call, base case
4 3 3 4
7 9 7 1 1 3 8 6
4 3 3 4
99
Quick-Sort
11
7 2 9 43 7 6 1 1 2 3 4 6 7 8 9
44
2 4 3 1 1 2 3 4
44
Recursive call, pivot selection
3 8 6 1 1 3 8 6
4 3 3 4
88
Quick-Sort
7 2 9 43 7 6 1 1 2 3 4 6 7 8 9
11
33
Execution Example (cont.)
Recursive call, , base case, join
2 4 3 1 1 2 3 4
9 4 4 9
99
Quick-Sort
3 8 6 1 1 3 8 6
11
4 3 3 4
99
11
7 9 7 17 7 9
88
99
44
Quick-Sort
12
Quick-Sort
4/9/2002 10:1
Worst-case Running Time
Expected Running Time
Consider a recursive call of quick-sort on a sequence of size s
The worst case for quick-sort occurs when the pivot is the unique
minimum or maximum element
One of L and G has size n 1 and the other has size 0
The running time is proportional to the sum
n + (n 1) + + 2 + 1
Thus, the worst-case running time of quick-sort is O(n2)
Good call: the sizes of L and G are each less than 3s/4
Bad call: one of L and G has size greater than 3s/4
7 2 9 43 7 6 1
7 2 9 43 7 6 19
7 9 7 1 1
2 4 3 1
Bad call
A call is good with probability 1/2
n1
n1
1/2 of the possible pivots cause good calls:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Bad pivots
Quick-Sort
13
Good pivots
Quick-Sort
Expected Running Time, Part 2
In-Place Quick-Sort
Probabilistic Fact: The expected number of coin tosses required in
Quick-sort can be implemented
For a node of depth i, we expect
In the partition step, we use
order to get k heads is 2k
The amount or work done at the
14
s(r)
s(a)
O(n)
s(b)
O(log n)
nodes of the same depth is O(n)
s(c)
s(d)
s(e)
s(f)
O(n)
Thus, the expected running time
of quick-sort is O(n log n)
total expected time: O(n log n)
Quick-Sort
15
Summary of Sorting Algorithms
Algorithm
Time
Notes
selection-sort
O(n2)
in-place
slow (good for small inputs)
insertion-sort
O(n2)
in-place
slow (good for small inputs)
quick-sort
O(n log n)
expected
in-place, randomized
fastest (good for large inputs)
heap-sort
O(n log n)
in-place
fast (good for large inputs)
merge-sort
O(n log n)
sequential data access
fast (good for huge inputs)
Quick-Sort
17
Algorithm inPlaceQuickSort(S, l, r)
Input sequence S, ranks l and r
Output sequence S with the
elements of rank between l and r
rearranged in increasing order
the elements less than the
if l r
pivot have rank less than h
return
the elements equal to the pivot
i a random integer between l and r
have rank between h and k
x S.elemAtRank(i)
the elements greater than the
pivot have rank greater than k
(h, k) inPlacePartition(x)
The recursive calls consider
inPlaceQuickSort(S, l, h 1)
elements with rank less than h
inPlaceQuickSort(S, k + 1, r)
elements with rank greater
than k
replace operations to rearrange
the elements of the input
sequence such that
time per level
O(n)
expected height
For a node of depth 2log4/3n,
the expected input size is one
The expected height of the
quick-sort tree is O(log n)
Bad pivots
to run in-place
i/2 ancestors are good calls
The size of the input sequence for the current call is at most (3/4)i/2n
Therefore, we have
7294376
Good call
depth time
Quick-Sort
16
(2,4) Trees
4/9/2002 13:1
Comparison-Based
Sorting ( 4.4)
Many sorting algorithms are comparison based.
Sorting Lower Bound
They sort by making comparisons between pairs of objects
Examples: bubble-sort, selection-sort, insertion-sort, heap-sort,
merge-sort, quick-sort, ...
Let us therefore derive a lower bound on the running
time of any algorithm that uses comparisons to sort n
elements, x1, x2, , xn.
no
Is xi < xj?
yes
Sorting Lower Bound
Counting Comparisons
Decision Tree Height
Let us just count comparisons then.
Each possible run of the algorithm corresponds
to a root-to-leaf path in a decision tree
xi < xj ?
xa < xb ?
Sorting Lower Bound
The height of this decision tree is a lower bound on the running time
Every possible input permutation must lead to a separate leaf output.
If not, some input 45 would have same output ordering as
54, which would be wrong.
Since there are n!=1*2**n leaves, the height is at least log (n!)
minimum height (time)
xc < xd ?
xi < xj ?
xa < xb ?
xc < xd ?
log (n!)
xe < xf ?
xk < xl ?
xm < xo ?
xp < xq ?
xe < xf ?
xm < xo ?
xk < xl ?
xp < xq ?
n!
Sorting Lower Bound
The Lower Bound
Any comparison-based sorting algorithms takes at
least log (n!) time
Therefore, any such algorithm takes time at least
n
n 2
log (n!) log = (n / 2) log (n / 2).
2
That is, any comparison-based sorting algorithm must
run in (n log n) time.
Sorting Lower Bound
Sorting Lower Bound
Sequences
4/15/2002 11:5
Set Operations
We represent a set by the
Set union:
sorted sequence of its
elements
By specializing the auxliliary
methods he generic merge
algorithm can be used to
perform basic set
operations:
Sets
Set intersection:
union
intersection
subtraction
The running time of an
operation on sets A and B
should be at most O(nA + nB)
Sets
Storing a Set in a List
Sets
of two sorted lists
A and B
Template method
genericMerge
Auxiliary methods
canonical ordering
Nodes storing set elements in order
aIsLess
bIsLess
bothAreEqual
Runs in O(nA + nB)
time provided the
auxiliary methods
run in O(1) time
Set elements
3
Using Generic Merge
for Set Operations
Any of the set operations can be
implemented using a generic merge
For example:
For intersection: only copy elements that
are duplicated in both list
For union: copy every element from both
lists except for the duplicates
All methods run in linear time.
Sets
Generalized merge Algorithm genericMerge(A, B)
The space used is O(n)
Sets
aIsLess(a, S)
{ do nothing }
bIsLess(b, S)
{ do nothing }
bothAreEqual(a, b, S)
S. insertLast(a)
Generic Merging
We can implement a set with a list
Elements are stored sorted according to some
List
aIsLess(a, S)
S.insertFirst(a)
bIsLess(b, S)
S.insertLast(b)
bothAreEqual(a, b, S)
S. insertLast(a)
S empty sequence
while A.isEmpty() B.isEmpty()
a A.first().element(); b B.first().element()
if a < b
aIsLess(a, S); A.remove(A.first())
else if b < a
bIsLess(b, S); B.remove(B.first())
else { b = a }
bothAreEqual(a, b, S)
A.remove(A.first()); B.remove(B.first())
while A.isEmpty()
aIsLess(a, S); A.remove(A.first())
while B.isEmpty()
bIsLess(b, S); B.remove(B.first())
return S
Sets
Radish-Sort
4/9/2002 13:4
Bucket-Sort ( 4.5.1)
Let be S be a sequence of n
Bucket-Sort and Radix-Sort
1, c
3, a
3, b
7, d
7, g
Algorithm bucketSort(S, N)
Input sequence S of (key, element)
items with keys in the range
[0, N 1]
Output sequence S sorted by
increasing keys
B array of N empty sequences
while S.isEmpty()
f S.first()
(k, o) S.remove(f)
B[k].insertLast((k, o))
for i 0 to N 1
while B[i].isEmpty()
f B[i].first()
(k, o) B[i].remove(f)
S.insertLast((k, o))
(key, element) items with keys
in the range [0, N 1]
Bucket-sort uses the keys as
indices into an auxiliary array B
of sequences (buckets)
Phase 1: Empty sequence S by
moving each item (k, o) into its
bucket B[k]
Phase 2: For i = 0, , N 1, move
the items of bucket B[i] to the
end of sequence S
7, e
Analysis:
0 1 2 3 4 5 6 7 8 9
Phase 1 takes O(n) time
Phase 2 takes O(n + N) time
Bucket-sort takes O(n + N) time
Bucket-Sort and Radix-Sort
Example
Key-type Property
1, c
3, a
7, g
3, b
7, e
Phase 1
1, c
B
3, a
3, b
7, d
7, g
7, e
3, a
3, b
7, d
7, g
Lexicographic Order
Integer keys in the range [a, b]
Put item (k, o) into bucket
B[k a]
String keys from a set D of
possible strings, where D has
constant size (e.g., names of
the 50 U.S. states)
Sort D and compute the rank
The relative order of
any two items with the
same key is preserved
after the execution of
the algorithm
r(k) of each string k of D in
the sorted sequence
Put item (k, o) into bucket
B[r(k)]
Bucket-Sort and Radix-Sort
Lexicographic-Sort
A d-tuple is a sequence of d keys (k1, k2, , kd), where
key ki is said to be the i-th dimension of the tuple
Example:
The Cartesian coordinates of a point in space are a 3-tuple
The lexicographic order of two d-tuples is recursively
defined as follows
(x1, x2, , xd) < (y1, y2, , yd)
x1 = y1 (x2, , xd) < (y2, , yd)
I.e., the tuples are compared by the first dimension,
then by the second dimension, etc.
x1 < y1
Bucket-Sort and Radix-Sort
Extensions
7, e
Bucket-Sort and Radix-Sort
The keys are used as
indices into an array
and cannot be arbitrary
objects
No external comparator
Stable Sort Property
Phase 2
1, c
Properties and Extensions
Key range [0, 9]
7, d
Bucket-Sort and Radix-Sort
Let Ci be the comparator
that compares two tuples by
their i-th dimension
Let stableSort(S, C) be a
stable sorting algorithm that
uses comparator C
Lexicographic-sort sorts a
sequence of d-tuples in
lexicographic order by
executing d times algorithm
stableSort, one per
dimension
Lexicographic-sort runs in
O(dT(n)) time, where T(n) is
the running time of
stableSort
Algorithm lexicographicSort(S)
Input sequence S of d-tuples
Output sequence S sorted in
lexicographic order
for i d downto 1
stableSort(S, Ci)
Example:
(7,4,6) (5,1,5) (2,4,6) (2, 1, 4) (3, 2, 4)
(2, 1, 4) (3, 2, 4) (5,1,5) (7,4,6) (2,4,6)
(2, 1, 4) (5,1,5) (3, 2, 4) (7,4,6) (2,4,6)
(2, 1, 4) (2,4,6) (3, 2, 4) (5,1,5) (7,4,6)
Bucket-Sort and Radix-Sort
Radish-Sort
4/9/2002 13:4
Radix-Sort for
Binary Numbers
Radix-Sort ( 4.5.2)
Radix-sort is a
specialization of
lexicographic-sort that
uses bucket-sort as the
stable sorting algorithm
in each dimension
Radix-sort is applicable
to tuples where the
keys in each dimension i
are integers in the
range [0, N 1]
Radix-sort runs in time
O(d( n + N))
Consider a sequence of n
Algorithm radixSort(S, N)
Input sequence S of d-tuples such
that (0, , 0) (x1, , xd) and
(x1, , xd) (N 1, , N 1)
for each tuple (x1, , xd) in S
Output sequence S sorted in
lexicographic order
for i d downto 1
bucketSort(S, N)
Bucket-Sort and Radix-Sort
Example
Sorting a sequence of 4-bit integers
1001
0010
1001
1001
0001
0010
1110
1101
0001
0010
1101
1001
0001
0010
1001
0001
1101
0010
1101
1101
1110
0001
1110
1110
1110
Bucket-Sort and Radix-Sort
b-bit integers
x = xb 1 x1x0
We represent each element
as a b-tuple of integers in
the range [0, 1] and apply
radix-sort with N = 2
This application of the
radix-sort algorithm runs in
O(bn) time
For example, we can sort a
sequence of 32-bit integers
in linear time
Algorithm binaryRadixSort(S)
Input sequence S of b-bit
integers
Output sequence S sorted
replace each element x
of S with the item (0, x)
for i 0 to b 1
replace the key k of
each item (k, x) of S
with bit xi of x
bucketSort(S, 2)
Bucket-Sort and Radix-Sort
Quick-Sort
4/15/2002 11:4
The Selection Problem
Given an integer k and n elements x1, x2, , xn,
Selection
taken from a total order, find the k-th smallest
element in this set.
Of course, we can sort the set in O(n log n) time
and then index the k-th element.
k=3
7 4 9 6 2 2 4 6 7 9
Can we solve the selection problem faster?
Selection
Selection
Quick-Select ( 4.7)
Partition
Quick-select is a randomized
We partition an input
selection algorithm based on
the prune-and-search
paradigm:
L elements less than x
E elements equal x
G elements greater than x
Search: depending on k, either
answer is in E, or we need to
recurse in either L or G
k < |L|
Each insertion and removal is
k > |L|+|E|
k = k - |L| - |E|
|L| < k < |L|+|E|
(done)
Selection
at the beginning or at the
end of a sequence, and
hence takes O(1) time
Thus, the partition step of
quick-select takes O(n) time
Quick-Select Visualization
Selection
Consider a recursive call of quick-select on a sequence of size s
recursion path
Each node represents a recursive call of quick-select, and
stores k and the remaining sequence
Good call: the sizes of L and G are each less than 3s/4
Bad call: one of L and G has size greater than 3s/4
7 2 9 43 7 6 1
7 2 9 43 7 6 19
k=5, S=(7 4 9 3 2 6 5 1 8)
7 9 7 1 1
2 4 3 1
7294376
Good call
k=2, S=(7 4 9 6 5 8)
Bad call
A call is good with probability 1/2
k=2, S=(7 4 6 5)
1/2 of the possible pivots cause good calls:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
k=1, S=(7 6 5)
Bad pivots
5
Selection
Algorithm partition(S, p)
Input sequence S, position p of pivot
Output subsequences L, E, G of the
elements of S less than, equal to,
or greater than the pivot, resp.
L, E, G empty sequences
x S.remove(p)
while S.isEmpty()
y S.remove(S.first())
if y < x
L.insertLast(y)
else if y = x
E.insertLast(y)
else { y > x }
G.insertLast(y)
return L, E, G
Expected Running Time
An execution of quick-select can be visualized by a
We remove, in turn, each
element y from S and
We insert y into L, E or G,
depending on the result of
the comparison with the
pivot x
Prune: pick a random element x
(called pivot) and partition S into
sequence as in the quick-sort
algorithm:
Good pivots
Selection
Bad pivots
6
Quick-Sort
4/15/2002 11:4
Expected Running Time,
Part 2
Deterministic Selection
Probabilistic Fact #1: The expected number of coin tosses required in
order to get one head is two
Probabilistic Fact #2: Expectation is a linear function:
itself to find a good pivot for quick-select:
Divide S into n/5 sets of 5 each
Find a median in each set
Recursively find the median of the baby medians.
E(X + Y ) = E(X ) + E(Y )
E(cX ) = cE(X )
Let T(n) denote the expected running time of quick-select.
By Fact #2,
T(n) < T(3n/4) + bn*(expected # of calls before a good call)
By Fact #1,
Min size
for L
T(n) < T(3n/4) + 2bn
That is, T(n) is a geometric series:
T(n) < 2bn + 2b(3/4)n + 2b(3/4)2n + 2b(3/4)3n +
So T(n) is O(n).
We can solve the selection problem in O(n) expected
time.
Selection
We can do selection in O(n) worst-case time.
Main idea: recursively use the selection algorithm
Min size
for G
See Exercise C-4.24 for details of analysis.
7
Selection
Merge Sort
4/21/2002 4:43 PM
Outline and Reading
The Greedy Method
The Greedy Method Technique (5.1)
Fractional Knapsack Problem (5.1.1)
Task Scheduling (5.1.2)
Minimum Spanning Trees (7.3) [future lecture]
The Greedy Method
The Greedy Method
Technique
configurations: different choices, collections, or
values to find
objective function: a score assigned to
configurations, which we want to either maximize or
minimize
It works best when applied to problems with the
greedy-choice property:
a globally-optimal solution can always be found by a
series of local improvements from a starting
configuration.
The Greedy Method
Constraint:
b (x / w )
i
The Greedy Method
Does not have greedy-choice property, since $.40 is best made
with two $.20s, but the greedy solution will pick three coins
(which ones?)
The Greedy Method
bi - a positive benefit
wi - a positive weight
Goal: Choose items with maximum total benefit but with
weight at most W.
knapsack
Solution:
Items:
Weight:
Benefit:
Value:
xi W
iS
iS
Example 2: Coins are valued $.30, $.20, $.05, $.01
In this case, we let xi denote the amount we take of item i
Objective: maximize
Has the greedy-choice property, since no amount over $.32 can
be made with a minimum number of coins by omitting a $.32
coin (similarly for amounts over $.08, but under $.32).
Given: A set S of n items, with each item i having
bi - a positive benefit
wi - a positive weight
Goal: Choose items with maximum total benefit but with
weight at most W.
If we are allowed to take fractional amounts, then this is
the fractional knapsack problem.
Example
Given: A set S of n items, with each item i having
Problem: A dollar amount to reach and a collection of
coin amounts to use to get there.
Configuration: A dollar amount yet to return to a
customer plus the coins already returned
Objective function: Minimize number of coins returned.
Greedy solution: Always return the largest coin you can
Example 1: Coins are valued $.32, $.08, $.01
The Fractional Knapsack
Problem
Making Change
The greedy method is a general algorithm
design paradigm, built on the following
elements:
The Greedy Method
($ per ml)
4 ml
8 ml
2 ml
6 ml
1 ml
$12
$32
$40
$30
$50
20
50
The Greedy Method
1
2
6
1
ml
ml
ml
ml
of
of
of
of
5
3
4
2
10 ml
6
Merge Sort
4/21/2002 4:43 PM
The Fractional Knapsack
Algorithm
Greedy choice: Keep taking
item with highest value
(benefit to weight ratio)
Since bi ( xi / wi ) = (bi / wi ) xi
iS
iS
Run time: O(n log n). Why?
Correctness: Suppose there
is a better solution
there is an item i with higher
value than a chosen item j,
but xi<wi, xj>0 and vi<vj
If we substitute some i with j,
we get a better solution
How much of i: min{wi-xi, xj}
Thus, there is no better
solution than the greedy one
Task Scheduling
Given: a set T of n tasks, each having:
Algorithm fractionalKnapsack(S, W)
Input: set S of items w/ benefit bi
and weight wi; max. weight W
Output: amount xi of each item i
to maximize benefit w/ weight
at most W
for each item i in S
xi 0
{value}
vi bi / wi
{total weight}
w0
while w < W
remove item i w/ highest vi
xi min{wi , W - w}
w w + min{wi , W - w}
The Greedy Method
A start time, si
A finish time, fi (where si < fi)
Goal: Perform all the tasks using a minimum number of
machines.
Machine 3
Machine 2
Machine 1
Task Scheduling
Algorithm
The Greedy Method
Example
Greedy choice: consider tasks
by their start time and use as
few machines as possible with
Algorithm taskSchedule(T)
this order.
Input: set T of tasks w/ start time si
Run time: O(n log n). Why?
and finish time fi
Correctness: Suppose there is a
Output: non-conflicting schedule
with minimum number of machines
better schedule.
{no. of machines}
m0
We can use k-1 machines
while T is not empty
The algorithm uses k
remove
task
i
w/
smallest si
Let i be first task scheduled
if theres a machine j for i then
on machine k
schedule i on machine j
Machine i must conflict with
else
k-1 other tasks
mm+1
But that means there is no
schedule i on machine m
non-conflicting schedule
using k-1 machines
The Greedy Method
Given: a set T of n tasks, each having:
A start time, si
A finish time, fi (where si < fi)
[1,4], [1,3], [2,5], [3,7], [4,7], [6,9], [7,8] (ordered by start)
Goal: Perform all tasks on min. number of machines
Machine 3
Machine 2
Machine 1
The Greedy Method
10
Merge Sort
4/26/2002 10:19 AM
Outline and Reading
Divide-and-conquer paradigm (5.2)
Review Merge-sort (4.1.1)
Recurrence Equations (5.2.1)
Divide-and-Conquer
7 29 4 2 4 7 9
72 2 7
77
22
94 4 9
99
44
Divide-and-Conquer
Integer Multiplication (5.2.2)
Divide-and-Conquer
Merge-sort on an input
sequence S with n
elements consists of
three steps:
Divide: divide the input data S in
two or more disjoint subsets S1,
S2,
Recur: solve the subproblems
recursively
Conquer: combine the solutions
for S1, S2, , into a solution for S
The base case for the
recursion are subproblems of
constant size
Analysis can be done using
recurrence equations
Divide-and-Conquer
Recurrence Equation
Analysis
if n < 2
if n 2
Divide: partition S into
two sequences S1 and S2
of about n/2 elements
each
Recur: recursively sort S1
and S2
Conquer: merge S1 and
S2 into a unique sorted
sequence
Algorithm mergeSort(S, C)
Input sequence S with n
elements, comparator C
Output sequence S sorted
according to C
if S.size() > 1
(S1, S2) partition(S, n/2)
mergeSort(S1, C)
mergeSort(S2, C)
S merge(S1, S2)
Divide-and-Conquer
In the iterative substitution, or plug-and-chug, technique, we
iteratively apply the recurrence equation to itself and see if we can
find a pattern:
T (n ) = 2T (n / 2) + bn
= 2( 2T (n / 2 2 )) + b( n / 2)) + bn
= 22 T (n / 22 ) + 2bn
= 23 T (n / 23 ) + 3bn
= 24 T (n / 24 ) + 4bn
= ...
= 2i T (n / 2i ) + ibn
We can therefore analyze the running time of merge-sort by
finding a closed form solution to the above equation.
Iterative Substitution
The conquer step of merge-sort consists of merging two sorted
sequences, each with n/2 elements and implemented by means of
a doubly linked list, takes at most bn steps, for some constant b.
Likewise, the basis case (n < 2) will take at b most steps.
Therefore, if we let T(n) denote the running time of merge-sort:
T (n) =
2T ( n / 2) + bn
Divide-and-Conquer
Merge-Sort Review
Divide-and conquer is a
general algorithm design
paradigm:
Iterative substitution
Recursion trees
Guess-and-test
The master method
Note that base, T(n)=b, case occurs when 2i=n. That is, i = log n.
So,
T (n ) = bn + bn log n
That is, a solution that has T(n) only on the left-hand side.
Thus, T(n) is O(n log n).
Divide-and-Conquer
Divide-and-Conquer
Merge Sort
4/26/2002 10:19 AM
The Recursion Tree
Guess-and-Test Method
Draw the recursion tree for the recurrence relation and look for a
pattern:
b
if n < 2
T (n ) =
2T ( n / 2) + bn if n 2
time
In the guess-and-test method, we guess a closed form solution
and then try to prove it is true by induction:
b
if n < 2
T (n ) =
2T ( n / 2) + bn log n if n 2
Guess: T(n) < cn log n.
depth
Ts
size
bn
n/2
bn
= 2( c(n / 2) log(n / 2)) + bn log n
= cn (log n log 2) + bn log n
2i
n/2i
bn
= cn log n cn + bn log n
T (n ) = 2T (n / 2) + bn log n
Total time = bn + bn log n
Wrong: we cannot make this last line be less than cn log n
(last level plus all previous levels)
Divide-and-Conquer
Guess-and-Test Method,
Part 2
Recall the recurrence equation:
b
T (n ) =
2T ( n / 2) + bn log n
Guess #2: T(n) < cn log2 n.
Many divide-and-conquer recurrence equations have
the form:
if n < 2
T (n) =
aT
n
b
(
/
) + f (n)
if n 2
= 2(c (n / 2) log 2 (n / 2)) + bn log n
1. if f (n) is O (n logb a ), then T (n) is ( n logb a )
= cn log 2 n 2cn log n + cn + bn log n
2. if f (n) is ( n logb a log k n), then T (n) is (n logb a log k +1 n)
cn log 2 n
3. if f ( n) is ( n logb a + ), then T (n) is ( f (n)),
provided af (n / b) f (n) for some < 1.
So, T(n) is O(n log2 n).
In general, to use this method, you need to have a good guess
and you need to be good at induction proofs.
Divide-and-Conquer
Master Method, Example 1
The form:
T (n) =
aT ( n / b) + f (n )
if n < d
if n d
The Master Theorem:
= cn(log n log 2) 2 + bn log n
if c > b.
Master Method
T (n) = 2T (n / 2) + bn log n
Divide-and-Conquer
Divide-and-Conquer
10
Master Method, Example 2
if n < d
if n d
The form: T (n ) =
c
aT ( n / b) + f (n )
The Master Theorem:
if n < d
if n d
The Master Theorem:
1. if f (n) is O( n logb a ), then T (n) is ( n logb a )
1. if f (n) is O( n logb a ), then T (n) is ( n logb a )
2. if f (n) is (n logb a log k n), then T ( n) is (n logb a log k +1 n)
2. if f (n) is (n logb a log k n), then T ( n) is (n logb a log k +1 n)
3. if f (n) is (n logb a + ), then T (n) is ( f (n)),
3. if f (n) is (n logb a + ), then T (n) is ( f (n)),
provided af (n / b) f (n) for some < 1.
Example:
provided af (n / b) f (n) for some < 1.
Example:
T (n) = 4T (n / 2) + n
Solution: logba=2, so case 1 says T(n) is
Divide-and-Conquer
T (n) = 2T (n / 2) + n log n
O(n2).
Solution: logba=1, so case 2 says T(n) is O(n log2 n).
11
Divide-and-Conquer
12
Merge Sort
4/26/2002 10:19 AM
Master Method, Example 3
The form:
T (n) =
aT ( n / b) + f (n )
Master Method, Example 4
if n < d
if n d
The form: T (n ) =
c
aT ( n / b) + f (n )
The Master Theorem:
The Master Theorem:
1. if f (n) is O( n logb a ), then T (n) is ( n logb a )
2. if f (n) is (n
log b a
log n), then T ( n) is (n
k
1. if f (n) is O( n logb a ), then T (n) is ( n logb a )
log b a
log
k +1
2. if f (n) is (n logb a log k n), then T ( n) is (n logb a log k +1 n)
n)
3. if f (n) is (n logb a + ), then T (n) is ( f (n)),
3. if f (n) is (n logb a + ), then T (n) is ( f (n)),
provided af (n / b) f (n) for some < 1.
provided af (n / b) f (n) for some < 1.
Example:
Example:
T (n) = T (n / 3) + n log n
Solution: logba=0, so case 3 says T(n) is O(n log n).
Divide-and-Conquer
T (n) =
aT ( n / b) + f (n )
T (n) = 8T (n / 2) + n 2
Solution: logba=3, so case 1 says T(n) is O(n3).
13
Master Method, Example 5
The form:
if n < d
if n d
Divide-and-Conquer
14
Master Method, Example 6
if n < d
if n d
The form: T (n ) =
c
aT ( n / b) + f (n )
The Master Theorem:
if n < d
if n d
The Master Theorem:
1. if f (n) is O( n logb a ), then T (n) is ( n logb a )
1. if f (n) is O( n logb a ), then T (n) is ( n logb a )
2. if f (n) is (n logb a log k n), then T ( n) is (n logb a log k +1 n)
2. if f (n) is (n logb a log k n), then T ( n) is (n logb a log k +1 n)
3. if f (n) is (n
log b a +
3. if f (n) is (n logb a + ), then T (n) is ( f (n)),
), then T (n) is ( f (n)),
provided af (n / b) f (n) for some < 1.
Example:
provided af (n / b) f (n) for some < 1.
Example:
T (n) = 9T (n / 3) + n 3
Solution: logba=2, so case 3 says T(n) is O(n3).
Divide-and-Conquer
c
aT ( n / b) + f (n )
15
Divide-and-Conquer
if n < d
if n d
Using iterative substitution, let us see if we can find a pattern:
T (n) = aT (n / b) + f (n)
= a (aT (n / b 2 )) + f (n / b)) + bn
= a 2T (n / b 2 ) + af (n / b) + f (n)
1. if f (n) is O( n logb a ), then T (n) is ( n logb a )
= a 3T (n / b 3 ) + a 2 f (n / b 2 ) + af (n / b) + f (n)
= ...
2. if f (n) is (n logb a log k n), then T ( n) is (n logb a log k +1 n)
3. if f (n) is (n
16
Iterative Proof of the
Master Theorem
The Master Theorem:
log b a +
(binary search)
Solution: logba=0, so case 2 says T(n) is O(log n).
Master Method, Example 7
The form: T (n ) =
T ( n ) = T ( n / 2) + 1
), then T (n) is ( f (n)),
= a logb nT (1) +
provided af (n / b) f (n) for some < 1.
(log b n ) 1
i
f (n / bi )
i =0
Example:
T (n) = 2T (n / 2) + log n
(heap construction)
Solution: logba=1, so case 1 says T(n) is O(n).
= n logb aT (1) +
f (n / bi )
We then distinguish the three cases as
17
a
i =0
Divide-and-Conquer
(log b n ) 1
i
The first term is dominant
Each part of the summation is equally dominant
The summation is a geometric series
Divide-and-Conquer
18
Merge Sort
4/26/2002 10:19 AM
An Improved Integer
Multiplication Algorithm
Integer Multiplication
Algorithm: Multiply two n-bit integers I and J.
Divide step: Split I and J into high-order and low-order bits
Algorithm: Multiply two n-bit integers I and J.
Divide step: Split I and J into high-order and low-order bits
Observe that there is a different way to multiply parts:
I = I h 2n / 2 + Il
J = J h 2n / 2 + J l
J = J h 2n / 2 + J l
We can then define I*J by multiplying the parts and adding:
I * J = ( I h 2n / 2 + Il ) * ( J h 2n / 2 + J l )
I * J = I h J h 2 n + [( I h I l )( J l J h ) + I h J h + I l J l ]2 n / 2 + I l J l
= I h J h 2 n + [( I h J l I l J l I h J h + I l J h ) + I h J h + I l J l ]2 n / 2 + I l J l
= I h J h 2n + I h J l 2n / 2 + I l J h 2n / 2 + I l J l
So, T(n) = 4T(n/2) + n, which implies T(n) is O(n2).
But that is no better than the algorithm we learned in grade
school.
= I h J h 2 n + ( I h J l + I l J h )2 n / 2 + I l J l
Divide-and-Conquer
I = I h 2n / 2 + Il
19
So, T(n) = 3T(n/2) + n, which implies T(n) is O(nlog23), by
the Master Theorem.
Thus, T(n) is O(n1.585).
Divide-and-Conquer
20
Merge Sort
4/29/2002 11:40 AM
Outline and Reading
Matrix Chain-Product (5.3.1)
The General Technique (5.3.2)
0-1 Knapsack Problem (5.3.3)
Dynamic Programming
Dynamic Programming
Dynamic Programming
Matrix Chain-Products
Matrix Chain-Products
Matrix Chain-Product:
Dynamic Programming is a general
algorithm design paradigm.
Rather than give the general structure, let us
first give a motivating example:
Matrix Chain-Products
Review: Matrix Multiplication.
C = A*B
A is d e and B is e f
e 1
O(def ) time
e
A
Dynamic Programming
i,j
f
Dynamic Programming
The number of paranethesizations is equal
to the number of binary trees with n nodes
This is exponential!
It is called the Catalan number, and it is
almost 4n.
This is a terrible algorithm!
Dynamic Programming
Idea #1: repeatedly select the product that
uses (up) the most operations.
Counter-example:
Try all possible ways to parenthesize
A=A0*A1**An-1
Calculate number of ops for each one
Pick the one that is best
Running time:
B is 3 100
C is 100 5
D is 5 5
(B*C)*D takes 1500 + 75 = 1575 ops
B*(C*D) takes 1500 + 2500 = 4000 ops
A Greedy Approach
Matrix Chain-Product Alg.:
An Enumeration Approach
Compute A=A0*A1**An-1
Ai is di di+1
Problem: How to parenthesize?
Example
k =0
C[i, j ] = A[i, k ] * B[k , j ]
A is 10 5
B is 5 10
C is 10 5
D is 5 10
Greedy idea #1 gives (A*B)*(C*D), which takes
500+1000+500 = 2000 ops
A*((B*C)*D) takes 500+250+250 = 1000 ops
Dynamic Programming
Merge Sort
4/29/2002 11:40 AM
Another Greedy Approach
A Recursive Approach
Idea #2: repeatedly select the product that uses
the fewest operations.
Counter-example:
A is 101 11
B is 11 9
C is 9 100
D is 100 99
Greedy idea #2 gives A*((B*C)*D)), which takes
109989+9900+108900=228789 ops
(A*B)*(C*D) takes 9999+89991+89100=189090 ops
The greedy approach is not giving us the
optimal value. Dynamic Programming
Recall that Ai is a di di+1 dimensional matrix.
So, a characterizing equation for Ni,j is the following:
N i , j = min{N i ,k + N k +1, j + d i d k +1d j +1}
i k < j
Note that subproblems are not independent--the
subproblems overlap.
Dynamic Programming
N i , j = min{N i ,k + N k +1, j + d i d k +1d j +1}
Dynamic Programming
Find the best parenthesization of Ai*Ai+1**Aj.
Let Ni,j denote the number of operations done by this
subproblem.
The optimal solution for the whole problem is N0,n-1.
Subproblem optimality: The optimal solution can be
defined in terms of optimal subproblems
There has to be a final multiplication (root of the expression
tree) for the optimal solution.
Say, the final multiply is at index i: (A0**Ai)*(Ai+1**An-1).
Then the optimal solution N0,n-1 is the sum of two optimal
subproblems, N0,i and Ni+1,n-1 plus the time for the last multiply.
If the global optimum did not have these optimal
subproblems, we could define an even better optimal
solution.
Dynamic Programming
Since subproblems
Algorithm matrixChain(S):
overlap, we dont
use recursion.
Input: sequence S of n matrices to be multiplied
Output: number of operations in an optimal
Instead, we
paranethization of S
construct optimal
for i 1 to n-1 do
subproblems
bottom-up.
Ni,i 0
for b 1 to n-1 do
Ni,is are easy, so
start with them
for i 0 to n-b-1 do
j i+b
Then do length
2,3, subproblems,
Ni,j +infinity
and so on.
for k i to j-1 do
Running time: O(n3)
Ni,j min{Ni,j , Ni,k +Nk+1,j +di dk+1 dj+1}
A Dynamic Programming
Algorithm Visualization
ik < j
The bottom-up
N 0 1 2
construction fills in the
N array by diagonals
0
1
Ni,j gets values from
pervious entries in i-th
i
row and j-th column
Filling in each entry in
the N table takes O(n)
time.
Total run time: O(n3)
Getting actual
n-1
parenthesization can be
done by remembering
k for each N entry
A Dynamic Programming
Algorithm
The global optimal has to be defined in terms of
optimal subproblems, depending on where the final
multiply is at.
Let us consider all possible places for that final multiply:
A Characterizing
Equation
Define subproblems:
n-1
Dynamic Programming
10
The General Dynamic
Programming Technique
answer
Applies to a problem that at first seems to
require a lot of time (possibly exponential),
provided we have:
11
Simple subproblems: the subproblems can be
defined in terms of a few variables, such as j, k, l,
m, and so on.
Subproblem optimality: the global optimum value
can be defined in terms of optimal subproblems
Subproblem overlap: the subproblems are not
independent, but instead they overlap (hence,
should be constructed bottom-up).
Dynamic Programming
12
Merge Sort
4/29/2002 11:40 AM
The 0/1 Knapsack Problem
Example
Given: A set S of n items, with each item i having
Given: A set S of n items, with each item i having
bi - a positive benefit
wi - a positive weight
Goal: Choose items with maximum total benefit but with
weight at most W.
If we are not allowed to take fractional amounts, then
this is the 0/1 knapsack problem.
In this case, we let T denote the set of items we take
Objective: maximize
Constraint:
w
iT
Weight:
Benefit:
Dynamic Programming
13
A 0/1 Knapsack Algorithm,
First Attempt
Solution:
1
4 in
2 in
2 in
6 in
2 in
$20
$3
$6
$25
$80
5 (2 in)
3 (2 in)
4 (4 in)
9 in
Dynamic Programming
14
A 0/1 Knapsack Algorithm,
Second Attempt
Sk: Set of items numbered 1 to k.
Define B[k] = best selection from Sk.
Problem: does not have subproblem optimality:
Goal: Choose items with maximum total benefit but with
weight at most W.
knapsack
Items:
b
iT
bi - a positive benefit
wi - a positive weight
Consider S={(3,2),(5,4),(8,5),(4,3),10,9)} weight-benefit pairs
Best for S4:
Sk: Set of items numbered 1 to k.
Define B[k,w] = best selection from Sk with
weight exactly equal to w
Good news: this does have subproblem
optimality:
B[k 1, w]
if wk > w
B[k , w] =
B
k
w
B
k
w
w
b
max{
[
1
,
],
[
1
,
]
}
else
k
k
Best for S5:
I.e., best subset of Sk with weight exactly w is
either the best subset of Sk-1 w/ weight w or the
best subset of Sk-1 w/ weight w-wk plus item k.
Dynamic Programming
15
Dynamic Programming
16
The 0/1 Knapsack
Algorithm
Recall definition of B[k,w]:
B[k 1, w]
if wk > w
B[k , w] =
else
max{B[k 1, w], B[k 1, w wk ] + bk }
Algorithm 01Knapsack(S, W):
Since B[k,w] is defined in
Input: set S of items w/ benefit bi
terms of B[k-1,*], we can
and weight wi; max. weight W
Output: benefit of best subset with
reuse the same array
weight at most W
Running time: O(nW).
Not a polynomial-time
algorithm if W is large
This is a pseudo-polynomial
time algorithm
for w 0 to W do
B[w] 0
for k 1 to n do
for w W downto wk do
if B[w-wk]+bk > B[w] then
B[w] B[w-wk]+bk
Dynamic Programming
17
Graphs
5/3/2002 7:41 AM
Outline and Reading
Graphs (6.1)
Graphs
1843
337
43
17
LAX
1233
802
SFO
ORD
Data structures for graphs (6.2)
DFW
5/3/2002 7:41 AM
Graphs
Graph
A vertex represents an airport and stores the three-letter airport code
An edge represents a flight route between two airports and stores the
mileage of the route
SFO
2555
337
HNL
1843
43
17
LAX
1233
5/3/2002 7:41 AM
849
ORD
802
DFW
2
14
PVD
7
138
1120
flight
AA 1206
PVD
unordered pair of vertices (u,v)
e.g., a flight route
ORD
849
miles
PVD
all the edges are directed
e.g., route network
MIA
all the edges are undirected
e.g., flight network
5/3/2002 7:41 AM
Graphs
cslab1b
End vertices (or endpoints) of
an edge
cs.brown.edu
U and V are the endpoints of
a
Edges incident on a vertex
Highway network
Flight network
brown.edu
qwest.net
att.net
Local area network
Internet
Web
Adjacent vertices
John
Graphs
U and V are adjacent
e
W
X has degree 5
h and i are parallel edges
j
Z
i
g
Parallel edges
cox.net
Paul
a, d, and b are incident on V
Degree of a vertex
Self-loop
David
Entity-relationship diagram
5/3/2002 7:41 AM
Databases
ORD
Undirected graph
10
99
math.brown.edu
Printed circuit board
Integrated circuit
Computer networks
ordered pair of vertices (u,v)
first vertex u is the origin
second vertex v is the destination
e.g., a flight
Terminology
Transportation networks
Electronic circuits
Undirected edge
LGA
Graphs
cslab1a
Graphs
Directed graph
Applications
5/3/2002 7:41 AM
Directed edge
V is a set of nodes, called vertices
E is a collection of pairs of vertices, called edges
Vertices and edges are positions and store elements
Example:
Edge list structure
Adjacency list structure
Adjacency matrix structure
Edge Types
A graph is a pair (V, E), where
Definition
Applications
Terminology
Properties
ADT
j is a self-loop
5/3/2002 7:41 AM
Graphs
Graphs
5/3/2002 7:41 AM
Terminology (cont.)
Terminology (cont.)
Cycle
Path
sequence of alternating
vertices and edges
begins with a vertex
ends with a vertex
each edge is preceded and
followed by its endpoints
a
U
c
Simple path
path such that all its vertices
and edges are distinct
P1
X
Graphs
5/3/2002 7:41 AM
Notation
v deg(v) = 2m
Property 2
Graphs
element
reference to position in
vertex sequence
sequence of vertex
objects
Edge sequence
aVertex()
incidentEdges(v)
endVertices(e)
isDirected(e)
origin(e)
destination(e)
opposite(v, e)
areAdjacent(v, w)
sequence of
references to edge
objects of incident
edges
Augmented edge
objects
Vertex sequence
insertVertex(o)
insertEdge(v, w, o)
insertDirectedEdge(v, w, o)
removeVertex(v)
removeEdge(e)
Generic methods
numVertices()
numEdges()
vertices()
edges()
Graphs
10
Edge list structure
Incidence sequence
for each vertex
Edge object
Update methods
Adjacency List Structure
u
Vertex object
element
origin vertex object
destination vertex object
reference to position in
edge sequence
are positions
store elements
5/3/2002 7:41 AM
Edge List Structure
Graphs
Accessor methods
Example
n = 4
m = 6
deg(v) = 3
In an undirected
graph with no selfloops and no
multiple edges
m n (n 1)/2
Proof: each vertex
has degree at most
(n 1)
C1
g
Vertices and edges
number of vertices
number of edges
degree of vertex v
n
m
deg(v)
Proof: each endpoint
is counted twice
Main Methods of the Graph ADT
Property 1
C1=(V,b,X,g,Y,f,W,c,U,a,) is a
simple cycle
C2=(U,c,W,e,X,g,Y,f,W,d,V,a,)
is a cycle that is not simple
Properties
5/3/2002 7:41 AM
Examples
d
C2
cycle such that all its vertices
and edges are distinct
Simple cycle
P1=(V,b,X,h,Z) is a simple path
P2=(U,c,W,e,X,g,Y,f,W,d,V) is a
path that is not simple
5/3/2002 7:41 AM
d
P2
Examples
circular sequence of alternating
vertices and edges
each edge is preceded and
followed by its endpoints
references to
associated
positions in
incidence
sequences of end
vertices
sequence of edge objects
5/3/2002 7:41 AM
Graphs
11
5/3/2002 7:41 AM
Graphs
12
Graphs
5/3/2002 7:41 AM
Adjacency Matrix Structure
a
Edge list structure
Augmented vertex
objects
Performance
n vertices
m edges
no parallel edges
no self-loops
Integer key (index)
associated with
vertex
2D-array adjacency
array
Reference to edge
object for adjacent
vertices
Null for non
nonadjacent
vertices
5/3/2002 7:41 AM
1
0
0
Graphs
1
a
13
Adjacency
List
Adjacency
Matrix
n+m
n+m
n2
incidentEdges(v)
deg(v)
areAdjacent (v, w)
insertVertex(o)
m
1
min(deg(v), deg(w))
1
1
n2
Space
0
Edge
List
insertEdge(v, w, o)
removeVertex(v)
removeEdge(e)
m
1
deg(v)
1
n2
1
5/3/2002 7:41 AM
Graphs
14
Campus Tour
6/8/2002 2:07 PM
Outline and Reading
Overview of the assignment
Review
Campus Tour
Adjacency matrix structure (6.2.3)
Kruskals MST algorithm (7.3.1)
Partition ADT and implementation (4.2.2)
The decorator pattern (6.5.1)
The traveling salesperson problem
Definition
Approximation algorithm (13.4.3)
6/8/2002 2:07 PM
Campus Tour
Graph Assignment
6/8/2002 2:07 PM
Campus Tour
Kruskals Algorithm
The vertices are
partitioned into clouds
We start with one cloud
per vertex
Clouds are merged during
the execution of the
algorithm
Partition ADT:
Reference to edge
object for adjacent
vertices
Null for non
nonadjacent
vertices
Computation and visualization of an approximate traveling
salesperson tour
6/8/2002 2:07 PM
makeSet(o): create set {o}
and return a locator for
object o
find(l): return the set of
the object with locator l
union(A,B): merge sets A
and B
6/8/2002 2:07 PM
1
0
6/8/2002 2:07 PM
0
a
Campus Tour
Example
Algorithm KruskalMSF(G)
Input weighted graph G
Output labeling of the edges of a
minimum spanning forest of G
6
H
C 11
9
C 11
7
10
6/8/2002 2:07 PM
3
D
2
A
Campus Tour
C 11
10
G
9
10
8
5
3
D
10
C 11
Q new heap-based priority queue
for all v G.vertices() do
l makeSet(v) { elementary cloud }
setLocator(v,l)
for all e G.edges() do
Q.insert(weight(e), e)
while Q.isEmpty()
e Q.removeMin()
[u,v] G.endVertices(e)
A find(getLocator(u))
B find(getLocator(v))
if A B
setMSFedge(e)
{ merge clouds }
union(A, B)
Campus Tour
2D-array adjacency
array
Frontend
Integer key (index)
associated with
vertex
Implement the adjacency matrix structure for representing a
graph
Implement Kruskals MST algorithm
Edge list structure
Augmented vertex
objects
Learn and implement the adjacency matrix structure an
Kruskals minimum spanning tree algorithm
Understand and use the decorator pattern and various JDSL
classes and interfaces
Your task
Adjacency Matrix Structure
Goals
Campus Tour
3
D
Campus Tour
6/8/2002 2:07 PM
Example (contd.)
8
B
5
6
H
C 11
C 11
10
3
D
9
C 11
6/8/2002 2:07 PM
st
e
4
four steps
tw
o
B
1
10
Partition implementation
4
ps
10
C 11
Partition Implementation
6
2
10
We perform n makeSet operations, 2m find operations and no
more than n 1 union operations
Label operations
We set vertex labels n times and get them 2m times
Kruskals algorithm runs in time O((n + m) log n) time
provided the graph has no parallel edges and is
represented by the adjacency list structure
6/8/2002 2:07 PM
Campus Tour
Find a polynomial-time algorithm
computing a traveling salesperson
tour or prove that none exists
6/8/2002 2:07 PM
Campus Tour
6
A
The decorator pattern extends
the methods of the Position
ADT to support the handling
of attributes (labels)
DFS: unexplored/visited
label for vertices and
unexplored/ forward/back
labels for edges
Dijkstra and Prim-Jarnik:
distance, locator, and
parent labels for vertices
Kruskal: locator label for
vertices and MSF label for
edges
has(a): tests whether the
position has attribute a
get(a): returns the value of
attribute a
set(a, x): sets to x the value of
attribute a
destroy(a): removes attribute
a and its associated value (for
cleanup purposes)
The decorator pattern can be
implemented by storing a
dictionary of (attribute, value)
items at each position
Campus Tour
10
We can approximate a TSP tour
with a tour of at most twice the
weight for the case of Euclidean
graphs
TSP Approximation
Auxiliary data
Output
6/8/2002 2:07 PM
Traveling Salesperson Problem
A tour of a graph is a spanning cycle
(e.g., a cycle that goes through all
the vertices)
A traveling salesperson tour of a
weighted graph is a tour that is
simple (i.e., no repeated vertices or
edges) and has has minimum weight
No polynomial-time algorithms are
known for computing traveling
salesperson tours
The traveling salesperson problem
(TSP) is a major open problem in
computer science
Examples
We perform m insert operations and m removeMin operations
Partition operations
Campus Tour
Labels are commonly used in
graph algorithms
Methods vertices and edges are called once
Method endVertices is called m times
Priority queue operations
Consider a series of k Partiton
ADT operations that includes
n makeSet operations
Each time we move an
element into a new sequence,
the size of its set at least
doubles
An element is moved at most
log2 n times
Moving an element takes O(1)
time
The total time for the series
of operations is O(k + n log n)
Decorator Pattern
Graph operations
makeSet, find: O(1)
union: O(min(nA, nB))
6/8/2002 2:07 PM
Analysis of Kruskals Algorithm
Amortized analysis
Worst-case running times
Campus Tour
A set is represented the
sequence of its elements
A position stores a reference
back to the sequence itself (for
operation find)
The position of an element in
the sequence serves as locator
for the element in the set
In operation union, we move
the elements of the smaller
sequence into to the larger
sequence
Example of traveling
salesperson tour
(with weight 17)
Approximation algorithm
11
Vertices are points in the plane
Every pair of vertices is connected
by an edge
The weight of an edge is the
length of the segment joining the
points
Compute a minimum spanning tree
Form an Eulerian circuit around the
MST
Transform the circuit into a tour
6/8/2002 2:07 PM
Campus Tour
12
Depth-First Search
5/6/2002 11:46 AM
Outline and Reading
Definitions (6.1)
Depth-First Search
Depth-first search (6.3.1)
Subgraph
Connectivity
Spanning trees and forests
Algorithm
Example
Properties
Analysis
Applications of DFS (6.5)
Depth-First Search
Subgraphs
Depth-First Search
Connectivity
A subgraph S of a graph
G is a graph such that
Path finding
Cycle finding
The vertices of S are a
subset of the vertices of G
The edges of S are a
subset of the edges of G
A graph is
connected if there is
a path between
every pair of
vertices
A connected
component of a
graph G is a
maximal connected
subgraph of G
Subgraph
A spanning subgraph of G
is a subgraph that
contains all the vertices
of G
Spanning subgraph
Depth-First Search
Trees and Forests
T is connected
T has no cycles
This definition of tree is
different from the one of
a rooted tree
Depth-First Search
Depth-First Search
A spanning tree of a
connected graph is a
spanning subgraph that is
a tree
A spanning tree is not
unique unless the graph is
a tree
Spanning trees have
applications to the design
of communication
networks
A spanning forest of a
graph is a spanning
subgraph that is a forest
A forest is an undirected
graph without cycles
The connected
components of a forest
are trees
Non connected graph with two
connected components
4
Spanning Trees and Forests
A (free) tree is an
undirected graph T such
that
Connected graph
Tree
Forest
Graph
Spanning tree
5
Depth-First Search
Depth-First Search
5/6/2002 11:46 AM
Depth-First Search
Depth-first search (DFS)
is a general technique
for traversing a graph
A DFS traversal of a
graph G
Visits all the vertices and
edges of G
Determines whether G is
connected
Computes the connected
components of G
Computes a spanning
forest of G
DFS Algorithm
DFS on a graph with n
vertices and m edges
takes O(n + m ) time
DFS can be further
extended to solve other
graph problems
Find and report a path
between two given
vertices
Find a cycle in the graph
Depth-first search is to
graphs what Euler tour
is to binary trees
Depth-First Search
B
C
C
9
C
Depth-First Search
10
Properties of DFS
Property 1
DFS(G, v) visits all the
vertices and edges in
the connected
component of v
We mark each
intersection, corner
and dead end (vertex)
visited
We mark each corridor
(edge ) traversed
We keep track of the
path back to the
entrance (start vertex)
by means of a rope
(recursion stack)
Depth-First Search
D
C
The DFS algorithm is
similar to a classic
strategy for exploring
a maze
DFS and Maze Traversal
A
D
Depth-First Search
Depth-First Search
A
B
Algorithm DFS(G, v)
Input graph G and a start vertex v of G
Output labeling of the edges of G
in the connected component of v
as discovery edges and back edges
setLabel(v, VISITED)
for all e G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w opposite(v,e)
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
DFS(G, w)
else
setLabel(e, BACK)
Example (cont.)
unexplored vertex
visited vertex
unexplored edge
discovery edge
back edge
Algorithm DFS(G)
Input graph G
Output labeling of the edges of G
as discovery edges and
back edges
for all u G.vertices()
setLabel(u, UNEXPLORED)
for all e G.edges()
setLabel(e, UNEXPLORED)
for all v G.vertices()
if getLabel(v) = UNEXPLORED
DFS(G, v)
Example
A
The algorithm uses a mechanism
for setting and getting labels of
vertices and edges
Property 2
The discovery edges
labeled by DFS(G, v)
form a spanning tree of
the connected
component of v
11
Depth-First Search
12
Depth-First Search
5/6/2002 11:46 AM
Analysis of DFS
Path Finding
Setting/getting a vertex/edge label takes O(1) time
Each vertex is labeled twice
We can specialize the DFS
algorithm to find a path
between two given
vertices u and z using the
template method pattern
We call DFS(G, u) with u
as the start vertex
We use a stack S to keep
track of the path between
the start vertex and the
current vertex
As soon as destination
vertex z is encountered,
we return the path as the
contents of the stack
once as UNEXPLORED
once as VISITED
Each edge is labeled twice
once as UNEXPLORED
once as DISCOVERY or BACK
Method incidentEdges is called once for each vertex
DFS runs in O(n + m) time provided the graph is
represented by the adjacency list structure
Recall that
v deg(v) = 2m
Depth-First Search
13
Algorithm pathDFS(G, v, z)
setLabel(v, VISITED)
S.push(v)
if v = z
return S.elements()
for all e G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w opposite(v,e)
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
S.push(e)
pathDFS(G, w, z)
S.pop(e)
else
setLabel(e, BACK)
S.pop(v)
Depth-First Search
14
Cycle Finding
We can specialize the
DFS algorithm to find a
simple cycle using the
template method pattern
We use a stack S to
keep track of the path
between the start vertex
and the current vertex
As soon as a back edge
(v, w) is encountered,
we return the cycle as
the portion of the stack
from the top to vertex w
Algorithm cycleDFS(G, v, z)
setLabel(v, VISITED)
S.push(v)
for all e G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w opposite(v,e)
S.push(e)
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
pathDFS(G, w, z)
S.pop(e)
else
T new empty stack
repeat
o S.pop()
T.push(o)
until o = w
return T.elements()
S.pop(v)
Depth-First Search
15
Breadth-First Search
5/7/2002 11:06 AM
Outline and Reading
Breadth-first search (6.3.3)
Breadth-First Search
Algorithm
Example
Properties
Analysis
Applications
L0
L1
L2
DFS vs. BFS (6.3.3)
Comparison of applications
Comparison of edge labels
5/7/2002 11:06 AM
Breadth-First Search
5/7/2002 11:06 AM
Breadth-First Search
Breadth-first search
(BFS) is a general
technique for traversing
a graph
A BFS traversal of a
graph G
Visits all the vertices and
edges of G
Determines whether G is
connected
Computes the connected
components of G
Computes a spanning
forest of G
5/7/2002 11:06 AM
L0
L1
L1
C
E
5/7/2002 11:06 AM
L0
L0
L1
L1
Breadth-First Search
L0
C
E
L0
A
C
E
Breadth-First Search
5/7/2002 11:06 AM
Algorithm BFS(G, s)
L0 new empty sequence
L0.insertLast(s)
setLabel(s, VISITED)
i0
while Li.isEmpty()
Li +1 new empty sequence
for all v Li.elements()
for all e G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w opposite(v,e)
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
setLabel(w, VISITED)
Li +1.insertLast(w)
else
setLabel(e, CROSS)
i i +1
Example (cont.)
Algorithm BFS(G)
Input graph G
Output labeling of the edges
and partition of the
vertices of G
for all u G.vertices()
setLabel(u, UNEXPLORED)
for all e G.edges()
setLabel(e, UNEXPLORED)
for all v G.vertices()
if getLabel(v) = UNEXPLORED
BFS(G, v)
L0
unexplored vertex
visited vertex
unexplored edge
discovery edge
cross edge
The algorithm uses a
mechanism for setting and
getting labels of vertices
and edges
Find and report a path
with the minimum
number of edges
between two given
vertices
Find a simple cycle, if
there is one
Breadth-First Search
Example
BFS Algorithm
BFS on a graph with n
vertices and m edges
takes O(n + m ) time
BFS can be further
extended to solve other
graph problems
Breadth-First Search
L1
F
5
L0
C
5/7/2002 11:06 AM
L1
Breadth-First Search
C
E
D
F
L2
L2
L2
L1
C
E
D
F
6
Breadth-First Search
5/7/2002 11:06 AM
Example (cont.)
L0
L1
L2
Notation
L2
Property 3
C
F
Breadth-First Search
once as UNEXPLORED
once as VISITED
once as UNEXPLORED
once as DISCOVERY or CROSS
Recall that
v deg(v) = 2m
5/7/2002 11:06 AM
Breadth-First Search
DFS vs. BFS
Applications
DFS
BFS
Shortest paths
L2
Breadth-First Search
L0
Breadth-First Search
10
Back edge (v,w)
Cross edge (v,w)
w is an ancestor of v in
the tree of discovery
edges
w is in the same level as
v or in the next level in
the tree of discovery
edges
A
C
Compute the connected components of G
Compute a spanning forest of G
Find a simple cycle in G, or report that G is a
forest
Given two vertices of G, find a path in G between
them with the minimum number of edges, or
report that no such path exists
5/7/2002 11:06 AM
Biconnected components
L1
C
E
C
E
L1
11
5/7/2002 11:06 AM
L2
DFS
BFS
Breadth-First Search
L0
L2
DFS
5/7/2002 11:06 AM
DFS vs. BFS (cont.)
Spanning forest, connected
components, paths, cycles
Using the template method pattern, we can
specialize the BFS traversal of a graph G to
solve the following problems in O(n + m) time
Each vertex is inserted once into a sequence Li
Method incidentEdges is called once for each vertex
BFS runs in O(n + m) time provided the graph is
represented by the adjacency list structure
L0
The path of Ts from s to v has i
edges
Every path from s to v in Gs has at
least i edges
5/7/2002 11:06 AM
Applications
Each edge is labeled twice
C
E
L1
For each vertex v in Li
Setting/getting a vertex/edge label takes O(1) time
Each vertex is labeled twice
BFS(G, s) visits all the vertices and
edges of Gs
Property 2
Analysis
Property 1
The discovery edges labeled by
BFS(G, s) form a spanning tree Ts
of Gs
5/7/2002 11:06 AM
Gs: connected component of s
L2
L1
L0
L1
Properties
L0
C
E
D
F
BFS
Breadth-First Search
12
Biconnectivity
5/7/2002 11:09 AM
Outline and Reading
Definitions (6.3.2)
Biconnectivity
Separation vertices and edges
Biconnected graph
Biconnected components
Equivalence classes
Linked edges and link components
SEA
PVD
ORD
SNA
FCO
Algorithms (6.3.2)
MIA
Auxiliary graph
Proxy graph
5/7/2002 11:09 AM
Biconnectivity
Separation Edges and Vertices
Applications
Separation edges and vertices represent single points of failure in a
network and are critical to the operation of the network
Example
SFO
PVD
LAX
5/7/2002 11:09 AM
DFW
HNL
LAX
MIA
Biconnectivity
Biconnected Components
A maximal biconnected subgraph of G, or
A subgraph consisting of a separation edge of G and its end vertices
Interaction of biconnected components
An edge belongs to exactly one biconnected component
A nonseparation vertex belongs to exactly one biconnected component
A separation vertex belongs to two or more biconnected components
Example of a graph with four biconnected components
SFO
ORD
PVD
5/7/2002 11:09 AM
LAX
DFW
Biconnectivity
DFW
MIA
Biconnectivity
Given a set S, a relation R on S is a set of ordered pairs of
elements of S, i.e., R is a subset of SS
An equivalence relation R on S satisfies the following properties
Reflexive: (x,x) R
Symmetric: (x,y) R (y,x) R
Transitive: (x,y) R (y,z) R (x,z) R
An equivalence relation R on S induces a partition of the
elements of S into equivalence classes
Example (connectivity relation among the vertices of a graph):
LGA
HNL
5/7/2002 11:09 AM
Equivalence Classes
Biconnected component of a graph G
PVD
ORD
LGA
LGA
HNL
Graph G has no separation edges and no separation vertices
For any two vertices u and v of G, there are two disjoint
simple paths between u and v (i.e., two simple paths
between u and v that share no other vertices or edges)
For any two vertices u and v of G, there is a simple cycle
containing u and v
Example
DFW, LGA and LAX are separation vertices
(DFW,LAX) is a separation edge
ORD
SFO
Equivalent definitions of a biconnected graph G
Let G be a connected graph
A separation edge of G is an edge whose removal disconnects G
A separation vertex of G is a vertex whose removal disconnects G
Biconnectivity
Biconnected Graph
Definitions
5/7/2002 11:09 AM
RDU
MIA
5
Let V be the set of vertices of a graph G
Define the relation
C = {(v,w) VV such that G has a path from v to w}
Relation C is an equivalence relation
The equivalence classes of relation C are the vertices in each
connected component of graph G
5/7/2002 11:09 AM
Biconnectivity
Biconnectivity
5/7/2002 11:09 AM
Link Relation
Link Components
Edges e and f of connected
graph G are linked if
e = f, or
G has a simple cycle
containing e and f
Equivalence classes of linked edges:
{a} {b, c, d, e, f} {g, i, j}
Proof Sketch:
The reflexive and
symmetric properties
follow from the definition
For the transitive
property, consider two
simple cycles sharing an
edge
5/7/2002 11:09 AM
Theorem:
The link relation on the
edges of a graph is an
equivalence relation
Biconnectivity
Associated with a DFS traversal
of G
The vertices of B are the edges
of G
For each back edge e of G, B has
edges (e,f1), (e,f2) , , (e,fk),
where f1, f2, , fk are the
discovery edges of G that form a
simple cycle with e
Its connected components
correspond to the the link
components of G
5/7/2002 11:09 AM
HNL
i
i
j
d
RDU
DFW
MIA
Biconnectivity
In the worst case, the number of edges of the
auxiliary graph is proportional to nm
DFS on graph G
g
e
f
c
a
DFS on graph G
Auxiliary graph B
Biconnectivity
5/7/2002 11:09 AM
Proxy Graph
Auxiliary graph B
Biconnectivity
10
Proxy Graph (cont.)
Algorithm proxyGraph(G)
Input connected graph G
Output proxy graph F for G
F empty graph
DFS(G, s) { s is any vertex of G}
for all discovery edges e of G
F.insertVertex(e)
setLabel(e, UNLINKED)
for all vertices v of G in DFS visit order
for all back edges e = (u,v)
F.insertVertex(e)
while u s
f discovery edge with dest. u
F.insertEdge(e,f,)
if f getLabel(f) = UNLINKED
setLabel(f, LINKED)
u origin of edge f
else
u s { ends the while loop }
return F
5/7/2002 11:09 AM
PVD
Auxiliary Graph (cont.)
LAX
5/7/2002 11:09 AM
g
b
ORD
SFO
LGA
Auxiliary graph B for a connected
graph G
Auxiliary Graph
The link components of a connected graph G are the equivalence
classes of edges with respect to the link relation
A biconnected component of G is the subgraph of G induced by an
equivalence class of linked edges
A separation edge is a single-element equivalence class of linked
edges
A separation vertex has incident edges in at least two distinct
equivalence classes of linked edge
Biconnectivity
j
d
DFS on graph G
g
b
c
f
d
11
The biconnected components of G
The separation vertices of G
The separation edges of G
5/7/2002 11:09 AM
Biconnectivity
j
d
DFS on graph G
g
Given a graph G with n vertices
and m edges, we can compute the
following in O(n + m) time
Proxy graph F
Spanning forest of the auxiliary
graph B
Has m vertices and O(m) edges
Can be constructed in O(n + m)
time
Its connected components (trees)
correspond to the the link
components of G
Proxy graph F for a connected
graph G
c
a
f
d
Proxy graph F
12
Shortest Path
5/13/2002 10:55 AM
Outline and Reading (6.4)
Reachability (6.4.1)
Directed Graphs
BOS
ORD
Directed DFS
Strong connectivity
JFK
Transitive closure (6.4.2)
SFO
LAX
DFW
The Floyd-Warshall Algorithm
MIA
Directed Acyclic Graphs (DAGs) (6.4.4)
Directed Graphs
Topological Sorting
Directed Graphs
Digraphs
Digraph Properties
C
A digraph is a graph
whose edges are all
directed
Applications
B
A
Directed Graphs
ics51
ics53
ics52
We can specialize the
traversal algorithms (DFS and
BFS) to digraphs by
traversing edges only along
their direction
In the directed DFS
algorithm, we have four
types of edges
ics161
ics141
ics121
ics171
Directed Graphs
discovery edges
back edges
forward edges
cross edges
E
D
C
B
A directed DFS starting a a
vertex s determines the
vertices reachable from s
The good life
ics151
Directed Graphs
Directed DFS
Scheduling: edge (a,b) means task a must be
completed before b can be started
ics23
If G is simple, m < n*(n-1).
If we keep in-edges and out-edges in separate
adjacency lists, we can perform listing of inedges and out-edges in time proportional to
their size.
Digraph Application
ics22
Each edge goes in one direction:
Edge (a,b) goes from a to b, but not b to a.
ics21
A graph G=(V,E) such that
D
one-way streets
flights
task scheduling
ics131
Directed Graphs
Shortest Path
5/13/2002 10:55 AM
Strong Connectivity
Reachability
Each vertex can reach all other vertices
DFS tree rooted at v: vertices reachable
from v via directed paths
E
D
F
Directed Graphs
Strong Connectivity
Algorithm
a
G:
If theres a w not visited, print no.
d
Let G be G with edges reversed.
Perform a DFS from v in G.
c
a
G:
c
d
Running time: O(n+m).
Directed Graphs
e
b
f
9
B
C
B
C
A
We can perform
DFS starting at
each vertex
{a,c,g}
{f,d,e,b}
Directed Graphs
Computing the
Transitive Closure
Transitive Closure
Directed Graphs
Maximal subgraphs such that each vertex can reach
all other vertices in the subgraph
Can also be done in O(n+m) time using DFS, but is
more complicated (similar to biconnectivity).
If theres a w not visited, print no.
Else, print yes.
Given a digraph G, the
transitive closure of G is the
digraph G* such that
G* has the same vertices
as G
if G has a directed path
from u to v (u v), G*
has a directed edge from
u to v
The transitive closure
provides reachability
information about a digraph
Strongly Connected
Components
Pick a vertex v in G.
Perform a DFS from v in G.
Directed Graphs
C
A
10
If there's a way to get
from A to B and from
B to C, then there's a
way to get from A to C.
O(n(n+m))
Alternatively ... Use
dynamic programming:
The Floyd-Warshall
Algorithm
G*
11
Directed Graphs
12
Shortest Path
5/13/2002 10:55 AM
Floyd-Warshall
Transitive Closure
Floyd-Warshalls Algorithm
Idea #1: Number the vertices 1, 2, , n.
Idea #2: Consider paths that use only
vertices numbered 1, 2, , k, as
intermediate vertices:
Uses only vertices numbered 1,,k
(add this edge if its not already in)
Uses only vertices
numbered 1,,k-1
k
Uses only vertices
numbered 1,,k-1
Directed Graphs
Algorithm FloydWarshall(G)
Input digraph G
Output transitive closure G* of G
i1
for all v G.vertices()
G0=G
denote v as vi
Gk has a directed edge (vi, vj)
ii+1
if G has a directed path from
G0 G
vi to vj with intermediate
for k 1 to n do
vertices in the set {v1 , , vk}
Gk Gk 1
We have that Gn = G*
for i 1 to n (i k) do
for j 1 to n (j i, k) do
In phase k, digraph Gk is
computed from Gk 1
if Gk 1.areAdjacent(vi, vk)
Gk 1.areAdjacent(vk, vj)
Running time: O(n3),
if Gk.areAdjacent(vi, vj)
assuming areAdjacent is O(1)
Gk.insertDirectedEdge(vi, vj , k)
(e.g., adjacency matrix)
return Gn
Floyd-Warshalls algorithm
numbers the vertices of G as
v1 , , vn and computes a
series of digraphs G0, , Gn
13
Floyd-Warshall Example
v7
Directed Graphs
14
Floyd-Warshall, Iteration 1
BOS
ORD
v4
ORD
JFK
v2
SFO
v1
v4
JFK
v2
v6
LAX
v6
SFO
DFW
LAX
v3
v1
MIA
DFW
v3
MIA
v5
v5
Directed Graphs
15
Floyd-Warshall, Iteration 2
v7
Directed Graphs
16
Floyd-Warshall, Iteration 3
BOS
ORD
ORD
JFK
v4
JFK
v2
v6
SFO
v1
v7
BOS
v4
v2
LAX
v7
BOS
v6
SFO
DFW
LAX
v3
v1
MIA
DFW
v3
MIA
v5
Directed Graphs
v5
17
Directed Graphs
18
Shortest Path
5/13/2002 10:55 AM
Floyd-Warshall, Iteration 4
v7
Floyd-Warshall, Iteration 5
v4
ORD
SFO
v1
JFK
v2
v6
LAX
v4
ORD
JFK
v2
v6
SFO
DFW
DFW
LAX
v3
v3
v1
MIA
MIA
v5
v5
Directed Graphs
19
Floyd-Warshall, Iteration 6
v7
Directed Graphs
20
Floyd-Warshall, Conclusion
BOS
JFK
v2
v6
SFO
v1
v4
ORD
JFK
v2
v7
BOS
v4
ORD
LAX
v7
BOS
BOS
v6
SFO
DFW
DFW
LAX
v3
v3
v1
MIA
MIA
v5
v5
Directed Graphs
21
DAGs and Topological Ordering
A directed acyclic graph (DAG) is a
digraph that has no directed cycles
A topological ordering of a digraph
is a numbering
v1 , , vn
of the vertices such that for every
edge (vi , vj), we have i < j
Example: in a task scheduling
digraph, a topological ordering a
task sequence that satisfies the
v2
precedence constraints
Theorem
A digraph admits a topological
v1
ordering if and only if it is a DAG
Directed Graphs
Topological Sorting
wake up
A typical student day
2
study computer sci.
C
DAG G
A
D
B
C
v4
22
Number vertices, so that (u,v) in E implies u < v
Directed Graphs
v5
4
7
play
nap
Topological
ordering of G
23
5
more c.s.
8
write c.s. program
9
make cookies
for professors
v3
eat
6
work out
10
sleep
11
dream about graphs
Directed Graphs
24
Shortest Path
5/13/2002 10:55 AM
Algorithm for Topological Sorting
Algorithm topologicalDFS(G, v)
Input graph G and a start vertex v of G
Output labeling of the vertices of G
in the connected component of v
setLabel(v, VISITED)
for all e G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w opposite(v,e)
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
topologicalDFS(G, w)
else
{e is a forward or cross edge}
Label v with topological number n
nn-1
Simulate the algorithm by using
depth-first search
Note: This algorithm is different than the
one in Goodrich-Tamassia
Algorithm topologicalDFS(G)
Input dag G
Output topological ordering of G
n G.numVertices()
for all u G.vertices()
setLabel(u, UNEXPLORED)
for all e G.edges()
setLabel(e, UNEXPLORED)
for all v G.vertices()
if getLabel(v) = UNEXPLORED
topologicalDFS(G, v)
Method TopologicalSort(G)
HG
// Temporary copy of G
n G.numVertices()
while H is not empty do
Let v be a vertex with no outgoing edges
Label v n
nn-1
Remove v from H
Running time: O(n + m). How?
Directed Graphs
Topological Sorting
Algorithm using DFS
O(n+m) time.
25
Topological Sorting Example
Directed Graphs
26
Topological Sorting Example
9
Directed Graphs
27
Topological Sorting Example
Directed Graphs
28
Topological Sorting Example
7
8
8
9
Directed Graphs
9
29
Directed Graphs
30
Shortest Path
5/13/2002 10:55 AM
Topological Sorting Example
Topological Sorting Example
6
7
5
7
8
9
Directed Graphs
31
Topological Sorting Example
Directed Graphs
32
Topological Sorting Example
3
4
6
4
6
5
7
5
7
8
9
Directed Graphs
33
Topological Sorting Example
Directed Graphs
34
Topological Sorting Example
3
4
6
4
6
5
7
5
7
8
9
Directed Graphs
9
35
Directed Graphs
36
Shortest Path
5/15/2002 11:40 AM
Outline and Reading
Weighted graphs (7.1)
Shortest Paths
5
E
D
8
The Bellman-Ford algorithm (7.1.2)
Shortest paths in dags (7.1.3)
All-pairs shortest paths (7.2.1)
Shortest Paths
Weighted Graphs
802
DFW
LGA
7
138
1120
PVD
10
99
SFO
HNL
MIA
Shortest Paths
There is a tree of shortest paths from a start vertex to all the other
vertices
Example:
Tree of shortest paths from Providence
1233
802
LAX
DFW
Shortest Paths
849
2
14
PVD
LGA
7
138
1120
10
99
1205
2555
337
HNL
43
17
LAX
1233
849
2
14
PVD
LGA
DFW
Shortest Paths
The distance of a vertex
v from a vertex s is the
length of a shortest path
between s and v
Dijkstras algorithm
computes the distances
of all the vertices from a
given start vertex s
Assumptions:
A subpath of a shortest path is itself a shortest path
Property 2:
ORD
43
17
ORD
7
138
1120
10
99
MIA
4
Dijkstras Algorithm
Property 1:
1843
2555
1843
Shortest Path Properties
SFO
Internet packet routing
Flight reservations
Driving directions
1205
LAX
1233
2
14
Shortest path between Providence and Honolulu
Applications
337
43
17
ORD
849
Length of a path is the sum of the weights of its edges.
Example:
1205
2555
337
HNL
1843
Given a weighted graph and two vertices u and v, we want to
find a path of minimum total weight between u and v.
In a flight route graph, the weight of an edge represents the
distance in miles between the endpoint airports
SFO
Shortest Paths
Shortest Path Problem
In a weighted graph, each edge has an associated numerical
value, called the weight of the edge
Edge weights may represent, distances, costs, etc.
Example:
Algorithm
Edge relaxation
802
Dijkstras algorithm (7.1.1)
Shortest path problem
Shortest path properties
MIA
5
the graph is connected
the edges are
undirected
the edge weights are
nonnegative
We grow a cloud of vertices,
beginning with s and eventually
covering all the vertices
We store with each vertex v a
label d(v) representing the
distance of v from s in the
subgraph consisting of the cloud
and its adjacent vertices
At each step
Shortest Paths
We add to the cloud the vertex
u outside the cloud with the
smallest distance label, d(u)
We update the labels of the
vertices adjacent to u
6
Shortest Path
5/15/2002 11:40 AM
Edge Relaxation
Example
Consider an edge e = (u,z)
such that
d(u) = 50
u is the vertex most recently
added to the cloud
z is not in the cloud
8
e
10 d(z) = 75
The relaxation of edge e
updates distance d(z) as
follows:
d(z) min{d(z),d(u) + weight(e)}
10 d(z) = 60
Shortest Paths
5
E
B
2
C
3
A
2
C
3
5
E
4
1
D
8
Method incidentEdges is called once for each vertex
Label operations
We set/get the distance and locator labels of vertex z O(deg(z)) times
Setting/getting a label takes O(1) time
Priority queue operations
Each vertex is inserted once into and removed once from the priority
queue, where each insertion or removal takes O(log n) time
The key of a vertex in the priority queue is modified at most deg(w)
times, where each key change takes O(log n) time
Dijkstras algorithm runs in O((n + m) log n) time provided the
graph is represented by the adjacency list structure
Recall that
B
2
D
8
2
7
C
3
5
E
4
1
D
8
5
8
Distance (d(v) label)
locator in priority
queue
Algorithm DijkstraDistances(G, s)
Q new heap-based priority queue
for all v G.vertices()
if v = s
setDistance(v, 0)
else
setDistance(v, )
l Q.insert(getDistance(v), v)
setLocator(v,l)
while Q.isEmpty()
u Q.removeMin()
for all e G.incidentEdges(u)
{ relax edge e }
z G.opposite(u,e)
r getDistance(u) + weight(e)
if r < getDistance(z)
setDistance(z,r)
Q.replaceKey(getLocator(z),r)
Shortest Paths
10
Extension
Graph operations
insert(k,e) returns a
locator
replaceKey(l,k) changes
the key of an item
Analysis
Key: distance
Element: vertex
We store two labels
with each vertex:
Shortest Paths
Locator-based methods
11
8
D
Shortest Paths
5
E
A priority queue stores
the vertices outside the
cloud
D
8
F
Dijkstras Algorithm
C
3
Example (cont.)
8
A
7
d(u) = 50
v deg(v) = 2m
The running time can also be expressed as O(m log n) since the
graph is connected
Shortest Paths
11
Using the template
method pattern, we
can extend Dijkstras
algorithm to return a
tree of shortest paths
from the start vertex
to all other vertices
We store with each
vertex a third label:
parent edge in the
shortest path tree
In the edge relaxation
step, we update the
parent label
Algorithm DijkstraShortestPathsTree(G, s)
for all v G.vertices()
setParent(v, )
for all e G.incidentEdges(u)
{ relax edge e }
z G.opposite(u,e)
r getDistance(u) + weight(e)
if r < getDistance(z)
setDistance(z,r)
setParent(z,e)
Q.replaceKey(getLocator(z),r)
Shortest Paths
12
Shortest Path
5/15/2002 11:40 AM
Why Dijkstras Algorithm
Works
Why It Doesnt Work for
Negative-Weight Edges
Dijkstras algorithm is based on the greedy
method. It adds vertices by increasing distance.
Suppose it didnt find all shortest
distances. Let F be the first wrong
vertex the algorithm processed.
When the previous node, D, on the
true shortest path was considered,
its distance was correct.
But the edge (D,F) was relaxed at
that time!
Thus, so long as d(F)>d(D), Fs
distance cannot be wrong. That is,
there is no wrong vertex.
8
B
2
C
3
5
E
D
8
13
Bellman-Ford Algorithm
C
0
-8
D
5
Shortest Paths
Nodes are labeled with their d(v) values
0
-2
-2
1
-2
-2
5 8
1
-2
-2
1
-2
3
4
-2
9
-2
setDistance(z,r)
Shortest Paths
14
Bellman-Ford Example
Works even with negative- Algorithm BellmanFord(G, s)
weight edges
for all v G.vertices()
if v = s
Must assume directed
setDistance(v, 0)
edges (for otherwise we
else
would have negativesetDistance(v, )
weight cycles)
for i 1 to n-1 do
Iteration i finds all shortest
for each e G.edges()
paths that use i edges.
{ relax edge e }
Running time: O(nm).
u G.origin(e)
z G.opposite(u,e)
Can be extended to detect
r getDistance(u) + weight(e)
a negative-weight cycle if it
if r < getDistance(z)
exists
How?
Cs true distance is 1, but
it is already in the cloud
with d(C)=5!
Shortest Paths
If a node with a negative
incident edge were to be added
late to the cloud, it could mess
up distances for vertices already
in the cloud.
Dijkstras algorithm is based on the greedy
method. It adds vertices by increasing distance.
-1
15
-2
-2
9
-1
4
9
Shortest Paths
16
DAG-based Algorithm
Works even with
negative-weight edges
Uses topological order
Doesnt use any fancy
data structures
Is much faster than
Dijkstras algorithm
Running time: O(n+m).
DAG Example
Algorithm DagDistances(G, s)
for all v G.vertices()
if v = s
setDistance(v, 0)
else
setDistance(v, )
Perform a topological sort of the vertices
for u 1 to n do {in topological order}
for each e G.outEdges(u)
{ relax edge e }
z G.opposite(u,e)
r getDistance(u) + weight(e)
if r < getDistance(z)
setDistance(z,r)
17
-5
-2
3
-2
2
9
5
-5
3
6
5
5
-2
-2
2
-2
0
7
-5
Shortest Paths
Nodes are labeled with their d(v) values
-2
9
-1
5
-5
5
Shortest Paths
7
0
1
3
6
-2
9
7
(two steps)
-1
5
5
18
Shortest Path
5/15/2002 11:40 AM
All-Pairs Shortest Paths
Find the distance
between every pair of
vertices in a weighted
directed graph G.
We can make n calls to
Dijkstras algorithm (if no
negative edges), which
takes O(nmlog n) time.
Likewise, n calls to
Bellman-Ford would take
O(n2m) time.
We can achieve O(n3)
time using dynamic
programming (similar to
the Floyd-Warshall
algorithm).
Algorithm AllPair(G) {assumes vertices 1,,n}
for all vertex pairs (i,j)
if i = j
D0[i,i] 0
else if (i,j) is an edge in G
D0[i,j] weight of edge (i,j)
else
D0[i,j] +
for k 1 to n do
for i 1 to n do
for j 1 to n do
Dk[i,j] min{Dk-1[i,j], Dk-1[i,k]+Dk-1[k,j]}
return Dn
i
Uses only vertices
numbered 1,,k-1
Shortest Paths
Uses only vertices numbered 1,,k
(compute weight of this edge)
j
k
Uses only vertices
numbered 1,,k-1
19
Minimum Spanning Tree
5/13/2002 4:52 PM
Outline and Reading
Minimum Spanning Trees
2704
337
144
JFK
1258
184
Definitions
A crucial fact
The Prim-Jarnik Algorithm (7.3.2)
187
740
621
802
LAX
PVD
ORD
1846
BWI
1391
1464
BOS
867
849
SFO
Minimum Spanning Trees (7.3)
1090
DFW
1235
Kruskal's Algorithm (7.3.1)
946
1121
MIA
2342
Baruvka's Algorithm (7.3.3)
Minimum Spanning Trees
Minimum Spanning Trees
Minimum Spanning Tree
Spanning subgraph
Spanning subgraph that is
itself a (free) tree
Spanning tree of a weighted
graph with minimum total
edge weight
PIT
DEN
Minimum spanning tree (MST)
Let T be a minimum
spanning tree of a
weighted graph G
Let e be an edge of G
that is not in T and C let
be the cycle formed by e
with T
For every edge f of C,
weight(f) weight(e)
Proof:
By contradiction
If weight(f) > weight(e) we
can get a spanning tree
of smaller weight by
replacing e with f
10
7
3
STL
DCA
Applications
Communications networks
Transportation networks
DFW
ATL
Cycle Property:
Spanning tree
Cycle Property
ORD
Subgraph of a graph G
containing all the vertices of G
9
3
7
Replacing f with e yields
a better spanning tree
f
2
8
4
9
3
7
Minimum Spanning Trees
Partition Property
Partition Property:
Consider a partition of the vertices of
G into subsets U and V
Let e be an edge of minimum weight
across the partition
There is a minimum spanning tree of
G containing edge e
Proof:
Let T be an MST of G
If T does not contain e, consider the
cycle C formed by e with T and let f
be an edge of C across the partition
By the cycle property,
weight(f) weight(e)
Thus, weight(f) = weight(e)
We obtain another MST by replacing
f with e
4
9
Minimum Spanning Trees
8
8
e
7
Replacing f with e yields
another MST
U
Minimum Spanning Trees
4
9
8
8
Prim-Jarniks Algorithm
Similar to Dijkstras algorithm (for a connected graph)
We pick an arbitrary vertex s and we grow the MST as a
cloud of vertices, starting from s
We store with each vertex v a label d(v) = the smallest
weight of an edge connecting v to a vertex in the cloud
At each step:
We add to the cloud the
vertex u outside the cloud
with the smallest distance
label
We update the labels of the
vertices adjacent to u
e
7
5
Minimum Spanning Trees
Minimum Spanning Tree
5/13/2002 4:52 PM
Prim-Jarniks Algorithm (cont.)
A priority queue stores
the vertices outside the
cloud
Key: distance
Element: vertex
Locator-based methods
insert(k,e) returns a
locator
replaceKey(l,k) changes
the key of an item
We store three labels
with each vertex:
Example
Algorithm PrimJarnikMST(G)
Q new heap-based priority queue
s a vertex of G
for all v G.vertices()
if v = s
setDistance(v, 0)
else
setDistance(v, )
setParent(v, )
l Q.insert(getDistance(v), v)
setLocator(v,l)
while Q.isEmpty()
u Q.removeMin()
for all e G.incidentEdges(u)
z G.opposite(u,e)
r weight(e)
if r < getDistance(z)
setDistance(z,r)
setParent(z,e)
Q.replaceKey(getLocator(z),r)
Distance
Parent edge in MST
Locator in priority queue
3
2
8
E
A priority queue stores
the edges outside the
cloud
Key: weight
Element: edge
At the end of the
algorithm
8
A
5
C
3
7
8
We are left with one
cloud that encompasses
the MST
A tree T which is our
MST
Method incidentEdges is called once for each vertex
Each vertex is inserted once into and removed once from the priority
queue, where each insertion or removal takes O(log n) time
The key of a vertex w in the priority queue is modified at most deg(w)
times, where each key change takes O(log n) time
Recall that
v deg(v) = 2m
Minimum Spanning Trees
10
Data Structure for
Kruskal Algortihm
The algorithm maintains a forest of trees
An edge is accepted it if connects distinct trees
We need a data structure that maintains a partition,
i.e., a collection of disjoint sets, with the operations:
-find(u): return the set storing u
-union(u,v): replace the sets storing u and v with
their union
Algorithm KruskalMST(G)
for each vertex V in G do
define a Cloud(v) of {v}
let Q be a priority queue.
Insert all edges into Q using their
weights as the key
T
while T has fewer than n-1 edges do
edge e = T.removeMin()
Let u, v be the endpoints of e
if Cloud(v) Cloud(u) then
Add edge e to T
Merge Cloud(v) and Cloud(u)
return T
Minimum Spanning Trees
We set/get the distance, parent and locator labels of vertex z O(deg(z))
times
Setting/getting a label takes O(1) time
The running time is O(m log n) since the graph is connected
Kruskals Algorithm
3
7
Prim-Jarniks algorithm runs in O((n + m) log n) time provided the
graph is represented by the adjacency list structure
Minimum Spanning Trees
Priority queue operations
5
C
5
8
Analysis
F
E
3
7
Label operations
4
8
8
0
Graph operations
5
C
8
7
Minimum Spanning Trees
8
A
5
C
Example (contd.)
7
5
C
8
Minimum Spanning Trees
B
5
F
E
7
2
4
8
8
A
8
C
11
Minimum Spanning Trees
12
Minimum Spanning Tree
5/13/2002 4:52 PM
Representation of a
Partition
Partition-Based
Implementation
A partition-based version of Kruskals Algorithm
performs cloud merges as unions and tests as finds.
Each set is stored in a sequence
Each element has a reference back to the set
Algorithm Kruskal(G):
Input: A weighted graph G.
Output: An MST T for G.
Let P be a partition of the vertices of G, where each vertex forms a separate set.
Let Q be a priority queue storing the edges of G, sorted by their weights
Let T be an initially-empty tree
while Q is not empty do
(u,v) Q.removeMinElement()
if P.find(u) != P.find(v) then
Running time:
Add (u,v) to T
O((n+m)log n)
P.union(u,v)
return T
operation find(u) takes O(1) time, and returns the set of
which u is a member.
in operation union(u,v), we move the elements of the
smaller set to the sequence of the larger set and update
their references
the time for operation union(u,v) is min(nu,nv), where nu
and nv are the sizes of the sets storing u and v
Whenever an element is processed, it goes into a
set of size at least double, hence each element is
processed at most log n times
Minimum Spanning Trees
Kruskal
Example
2704
13
849
337
LAX
337
1090
DFW
1235
946
LAX
BWI
1090
946
DFW
1235
1121
1121
MIA
MIA
2342
2342
Minimum Spanning Trees
Example
2704
15
849
740
621
1846
337
LAX
1391
1464
1235
740
621
1846
1258
337
LAX
1391
1464
1235
PVD
187
144
JFK
1258
184
802
SFO
BWI
946
BWI
1090
946
DFW
1121
1121
MIA
MIA
2342
Minimum Spanning Trees
BOS
849
ORD
144
JFK
16
867
PVD
1090
DFW
2704
187
184
802
Minimum Spanning Trees
Example
BOS
867
ORD
SFO
1258
184
1391
1464
144
JFK
802
SFO
BWI
1391
1464
PVD
187
740
621
1846
1258
184
802
BOS
867
849
144
JFK
14
ORD
187
740
621
SFO
2704
PVD
ORD
1846
Example
BOS
867
Minimum Spanning Trees
2342
17
Minimum Spanning Trees
18
Minimum Spanning Tree
Example
5/13/2002 4:52 PM
2704
849
337
LAX
1846
337
1090
946
DFW
1235
LAX
BWI
1090
946
DFW
1235
1121
1121
MIA
MIA
2342
2342
Minimum Spanning Trees
Example
2704
19
849
337
LAX
144
337
946
LAX
BWI
1090
946
DFW
1235
1121
1121
MIA
MIA
2342
2342
Minimum Spanning Trees
Example
2704
21
849
740
621
1846
337
LAX
1391
1464
1235
740
621
1846
1258
337
LAX
1391
1464
1235
PVD
187
144
JFK
1258
184
802
SFO
BWI
946
BWI
1090
946
DFW
1121
1121
MIA
MIA
2342
Minimum Spanning Trees
BOS
849
ORD
144
JFK
22
867
PVD
1090
DFW
2704
187
184
802
Minimum Spanning Trees
Example
BOS
867
ORD
SFO
1258
184
1391
1464
144
JFK
802
SFO
1090
1235
PVD
187
740
621
1846
1258
BWI
DFW
BOS
849
ORD
184
1391
20
867
PVD
JFK
802
1464
2704
187
740
621
1846
Minimum Spanning Trees
Example
BOS
867
ORD
SFO
1258
184
1391
1464
144
JFK
802
SFO
BWI
1391
PVD
187
740
621
1258
184
802
1464
849
144
JFK
BOS
867
ORD
187
740
621
SFO
2704
PVD
ORD
1846
Example
BOS
867
2342
23
Minimum Spanning Trees
24
Minimum Spanning Tree
Example
5/13/2002 4:52 PM
2704
849
LAX
1846
337
1090
946
DFW
1235
LAX
BWI
1391
1090
946
DFW
1235
1121
MIA
MIA
2342
2342
Minimum Spanning Trees
2704
25
ORD
740
621
1846
1391
1464
337
LAX
1235
PVD
BWI
946
DFW
1235
1121
MIA
MIA
2342
Minimum Spanning Trees
BWI
1090
946
LAX
1258
184
1391
1464
144
JFK
802
SFO
337
187
740
621
1846
1258
1121
2342
27
Minimum Spanning Trees
Baruvka
Example
Baruvkas Algorithm
2704
Like Kruskals Algorithm, Baruvkas algorithm grows many
clouds at once.
28
BOS
867
849
Algorithm BaruvkaMST(G)
T V {just the vertices of G}
while T has fewer than n-1 edges do
for each connected component C in T do
Let edge e be the smallest-weight edge from C to another component in T.
if e is not already in T then
Add edge e to T
return T
Each iteration of the while-loop halves the number of connected
compontents in T.
BOS
867
ORD
144
JFK
26
849
187
1090
DFW
2704
PVD
184
802
Minimum Spanning Trees
Example
BOS
867
849
SFO
1258
184
1464
1121
Example
144
JFK
802
SFO
BWI
1391
1464
PVD
187
740
621
1258
184
802
337
849
144
JFK
BOS
867
ORD
187
740
621
SFO
2704
PVD
ORD
1846
Example
BOS
867
ORD
740
1846
621
802
SFO
337
LAX
1391
1464
1235
PVD
187
144
JFK
1258
184
BWI
1090
946
DFW
The running time is O(m log n).
1121
MIA
2342
Minimum Spanning Trees
29
Minimum Spanning Trees
30
Minimum Spanning Tree
Example
5/13/2002 4:52 PM
2704
849
ORD
740
1846
621
802
SFO
337
LAX
1391
1464
1235
Example
BOS
867
187
849
ORD
144
JFK
740
1846
621
1258
184
802
SFO
BWI
337
946
LAX
1391
1464
1235
187
PVD
144
JFK
1258
184
BWI
1090
DFW
946
1121
1121
MIA
MIA
2342
2342
Minimum Spanning Trees
BOS
867
PVD
1090
DFW
2704
31
Minimum Spanning Trees
32
Maximum Flow
5/13/2002 5:09 PM
Outline and Reading
Flow networks
Maximum Flow
4/6
3/3
1/1
3/5
5/13/2002 5:09 PM
Maximum flow
3/3
1/1
4/7
1/9
3/5
2/2
Maximum Flow
A weighted digraph G with nonnegative integer edge weights,
where the weight of an edge e is called the capacity c(e) of e
Two distinguished vertices, s and t of G, called the source and sink,
respectively, such that s has no incoming edges and t has no
outgoing edges.
Example:
v
1
u
5/13/2002 5:09 PM
7
w
Hydraulic systems
Electrical circuits
Traffic movements
Freight transportation
5/13/2002 5:09 PM
Capacity Rule: For each edge e, 0 f (e) c(e)
eE ( v )
where
E(v)
5
z
f ( e) = f (e )
Conservation Rule: For each vertex v s,t
and
E+(v)
1/1
3/3
u
3
5/13/2002 5:09 PM
1/1
3/5
3/7
2/9
4/5
z
2/2
Maximum Flow
Cut
v
2/6
1/3
1/1
3/3
1/1
3/5
3/7
2/9
4/5
z
2/2
Flow of value 8 = 2 + 3 + 3 = 1 + 3 + 4
v
4/6
3/3
1/1
3/3
1/1
3/5
3/7
2/9
t
4/5
z
2/2
Maximum flow of value 10 = 4 + 3 + 3 = 3 + 3 + 4
u
Maximum Flow
eE + ( v )
are the incoming and outgoing edges of v, resp.
2/6
Maximum Flow
A flow f for a network N is is an assignment of an integer value
f(e) to each edge e that satisfies the following properties:
Maximum Flow
A flow for a network N is
said to be maximum if its
value is the largest of all
flows for N
The maximum flow
problem consists of
finding a maximum flow
for a given network N
Applications
Maximum Flow
The value of a flow f , denoted |f|, is the total flow from the source,
which is the same as the total flow into the sink
Example:
v
1/3
5/13/2002 5:09 PM
Flow
A flow network (or just network) N consists of
Augmenting path (8.2.1)
Maximum flow and minimum cut (8.2.1)
Ford-Fulkersons algorithm (8.2.2-8.2.3)
Flow Network
Flow (8.1.1)
Cut (8.1.2)
A cut of a network N with source s
and sink t is a partition = (Vs,Vt)
of the vertices of N such that s
Vs and t Vt
Forward edge of cut : origin in Vs
5/13/2002 5:09 PM
Maximum Flow
3
1
w
5
u
and destination in Vt
Backward edge of cut : origin in
Vt and destination in Vs
Flow f() across a cut : total flow
of forward edges minus total flow
of backward edges
Capacity c() of a cut : total
capacity of forward edges
Example:
c() = 24
f() = 8
5
z
2/6
3/3
1/3
1/1
w
1/1
3/5
u
2/2
3/7
2/9
4/5
z
6
Maximum Flow
5/13/2002 5:09 PM
Flow and Cut
Augmenting Path
Lemma:
The flow f() across any
cut is equal to the flow
value |f|
Lemma:
The flow f() across a cut
is less than or equal to
the capacity c() of the cut
Theorem:
The value of any flow is
less than or equal to the
capacity of any cut, i.e.,
for any flow f and any cut
, we have
|f| c()
5/13/2002 5:09 PM
Consider a flow f for a
network N
Let e be an edge from u to v:
2
v
2/6
1/3
1/1
3/3
2/9
1/1
3/5
3/7
4/5
2/2
5/13/2002 5:09 PM
Flow Augmentation
Forward edge:
f (e) = f(e) + f()
Backward edge:
f (e) = f(e) f()
2/9
4/5
|f|=7
2/2
2/6
0/1
3/3
2/7
1/1
2/9
4/5
There is no augmenting path
from s to t with respect to the
current flow f
Cut = (Vs,Vt) has capacity
c() = |f|
Forward edge: f(e) = c(e)
Backward edge: f(e) = 0
Thus, flow f has maximum
value and cut has minimum
capacity
5/13/2002 5:09 PM
Maximum Flow
5/13/2002 5:09 PM
Theorem:
The value of a maximum
flow is equal to the
capacity of a minimum cut
10
1/1
u
0/9
1/3
0/5
1/5
0/2
0/3
1/1
w
0/1
u
2/7
0/9
1/5
z
1/2
4/7
1/9
2/2
1/6
t
1/7
1/1
u
3/3
1/1
3/3
0/3
0/3
0/1
1/5
4/6
3/5
Maximum Flow
0/6
An edge e is traversed
from u to v provided
f(u, v) > 0
Example (1)
Define
Vs set of vertices reachable from s
by augmenting paths
Vt set of remaining vertices
Search for an
augmenting path
Augment by f() the
flow along the edges
of
| f | = 8
2/2
Maximum Flow
Termination of Ford-Fulkersons
algorithm
|f| = 7
Algorithm FordFulkersonMaxFlow(N)
for all e G.edges()
setFlow(e, 0)
while G has an augmenting path
{ compute residual capacity of }
for all edges e
{ compute residual capacity of e }
if e is a forward edge of
getCapacity(e) getFlow(e)
else { e is a backward edge }
getFlow(e)
if <
{ augment flow along }
for all edges e
if e is a forward edge of
setFlow(e, getFlow(e) + )
else { e is a backward edge }
setFlow(e, getFlow(e) )
A specialization of DFS
(or BFS) searches for an
augmenting path
2/3
Max-Flow and Min-Cut
f() = 1
u
5/13/2002 5:09 PM
2/7
0/1
3/5
2/2
Maximum Flow
Initially, f(e) = 0 for each
edge e
Repeatedly
1/3
1/1
3/3
4/5
z
Ford-Fulkersons Algorithm
2/6
2/5
2/9
f(s,u) = 3
f(u,w) = 1
f(w,v) = 1
f(v,t) = 2
f() = 1
A path from s to t is an
augmenting path if f() > 0
2/7
0/1
2/5
residual capacities of the
edges of in the direction
from s to t
c(1) = 12 = 6 + 3 + 1 + 2
c(2) = 21 = 3 + 7 + 9 + 2
|f| = 8
1/3
1/1
3/3
Let be a path from s to t
The residual capacity f()
of is the smallest of the
Maximum Flow
Lemma:
Let be an augmenting path
for flow f in network N. There
exists a flow f for N of value
| f | = |f | + f()
Proof:
We compute flow f by
modifying the flow on the
edges of
Residual capacity of e from
u to v: f(u, v) = c(e) f (e)
Residual capacity of e from
v to u: f(v, u) = f (e)
2/6
3/5
z
0/1
u
11
0/3
0/1
1/3
s
1/5
c() = | f | = 10
0/6
5/13/2002 5:09 PM
1/2
1/6
t
1/7
0/9
1/5
z
2/3
s
1/5
0/1
u
Maximum Flow
1/3
0/1
1/2
2/7
0/9
1/5
z
12
Maximum Flow
5/13/2002 5:09 PM
Example (2)
v
3/6
1/5
3/3
0/1
2/3
0/1
u
Analysis
t
2/7
0/9
1/5
3/3
1/1
3/3
1/5
z
1/2
4/6
0/1
u
3/7
1/9
2/5
z
1/2
two steps
v
3/6
0/1
3/3
s
1/5
3/3
0/1
u
5/13/2002 5:09 PM
1/2
4/6
t
2/7
1/9
2/5
z
3/3
s
3/5
1/1
u
Maximum Flow
3/3
1/1
2/2
In the worst case, FordFulkersons algorithm
performs |f*| flow
augmentations, where f* is a
maximum flow
Example
4/7
1/9
3/5
z
13
1/1
1/50
The augmenting paths found
alternate between 1 and 2
The algorithm performs 100
augmentations
Finding an augmenting path
and augmenting the flow
takes O(n + m) time
The running time of FordFulkersons algorithm is
O(|f*|(n + m))
5/13/2002 5:09 PM
Maximum Flow
0/50
1/50
0/50
v
0/1
1/50
s
1/50
1/50
t
2
1/50
14
Pattern Matching
5/29/2002 11:27 AM
Outline and Reading
Strings (9.1.1)
Pattern matching algorithms
Pattern Matching
Pattern Matching
Strings
Let P be a string of size m
Java program
HTML document
DNA sequence
Digitized image
An alphabet is the set of
possible characters for a
family of strings
Example of alphabets:
A substring P[i .. j] of P is the
subsequence of P consisting of
the characters with ranks
between i and j
A prefix of P is a substring of
the type P[0 .. i]
A suffix of P is a substring of
the type P[i ..m 1]
Given strings T (text) and P
(pattern), the pattern matching
problem consists of finding a
substring of T equal to P
Applications:
ASCII
Unicode
{0, 1}
{A, C, G, T}
Pattern Matching
Text editors
Search engines
Biological research
Pattern Matching
Example
p a t
r i
1
t h m
t e r n
2
t h m
m a t c h i n g
3
t h m
r
r
4
t h m
Pattern Matching
a l g o r
5
t h m
t h m
11 10 9 8 7
r i t h m
r i
6
t h m
5
the largest index i such that P[i] = c or
1 if no such index exists
Example:
= {a, b, c, d}
Boyer-Moores algorithm preprocesses the pattern P and the
alphabet to build the last-occurrence function L mapping to
integers, where L(c) is defined as
If P contains c, shift P to align the last occurrence of c in P with T[i]
Else, shift P to align P[0] with T[i + 1]
r i
Algorithm BruteForceMatch(T, P)
Input text T of size n and pattern
P of size m
Output starting index of a
substring of T equal to P or 1
if no such substring exists
a match is found, or
for i 0 to n m
all placements of the pattern
{ test shift i of the pattern }
have been tried
j0
Brute-force pattern matching
while j < m T[i + j] = P[j]
runs in time O(nm)
jj+1
Example of worst case:
if j = m
T = aaa ah
return i {match at i}
P = aaah
may occur in images and
else
DNA sequences
break while loop {mismatch}
unlikely in English text
return -1 {no match anywhere}
Last-Occurrence Function
The Boyer-Moores pattern matching algorithm is based on two
heuristics
Looking-glass heuristic: Compare P with a subsequence of T
moving backwards
Character-jump heuristic: When a mismatch occurs at T[i] = c
The brute-force pattern
matching algorithm compares
the pattern P with the text T
for each possible shift of P
relative to T, until either
Boyer-Moore Heuristics
Pattern Matching
Brute-Force Algorithm
A string is a sequence of
characters
Examples of strings:
Brute-force algorithm (9.1.2)
Boyer-Moore algorithm (9.1.3)
Knuth-Morris-Pratt algorithm (9.1.4)
P = abacab
L(c)
The last-occurrence function can be represented by an array
indexed by the numeric codes of the characters
The last-occurrence function can be computed in time O(m + s),
where m is the size of P and s is the size of
Pattern Matching
Pattern Matching
5/29/2002 11:27 AM
The Boyer-Moore Algorithm
Algorithm BoyerMooreMatch(T, P, )
L lastOccurenceFunction(P, )
im1
jm1
repeat
if T[i] = P[j]
if j = 0
return i { match at i }
else
ii1
jj1
else
{ character-jump }
l L[T[i]]
i i + m min(j, 1 + l)
jm1
until i > n 1
return 1 { no match }
Example
Case 1: j 1 + l
.
a .
i
b a
j l
mj
a
a
a .
i
a .
l
b .
j
m (1 + l)
a .
a
4
b
3
13 12 11 10 9
a
7
b .
1+l
Pattern Matching
The KMP Algorithm - Motivation
Boyer-Moores algorithm
runs in time O(nm + s)
Example of worst case:
Analysis
b
a
Pattern Matching
b a
Case 2: 1 + l j
.
12 11 10
T = aaa a
P = baaa
The worst case may occur in
images and DNA sequences
but is unlikely in English text
Boyer-Moores algorithm is
significantly faster than the
brute-force algorithm on
English text
Knuth-Morris-Pratts algorithm
compares the pattern to the
text in left-to-right, but shifts
the pattern more intelligently
than the brute-force algorithm.
When a mismatch occurs,
what is the most we can shift
the pattern so as to avoid
redundant comparisons?
Answer: the largest prefix of
P[0..j] that is a suffix of P[1..j]
18 17 16 15 14 13
24 23 22 21 20 19
Pattern Matching
a b a a b x .
a b a a b a
j
a b a a b a
No need to
repeat these
comparisons
Resume
comparing
here
10
The KMP Algorithm
P[j]
F(j)
a b a a b x .
The failure function can be
represented by an array and
can be computed in O(m) time
At each iteration of the whileloop, either
.
a b a a b a
j
Pattern Matching
Pattern Matching
KMP Failure Function
Knuth-Morris-Pratts
algorithm preprocesses the
pattern to find matches of
prefixes of the pattern with
the pattern itself
The failure function F(j) is .
defined as the size of the
largest prefix of P[0..j] that is
also a suffix of P[1..j]
Knuth-Morris-Pratts
algorithm modifies the bruteforce algorithm so that if a
mismatch occurs at P[j] T[i]
we set j F(j 1)
i increases by one, or
the shift amount i j
increases by at least one
(observe that F(j 1) < j)
Hence, there are no more
than 2n iterations of the
while-loop
Thus, KMPs algorithm runs in
optimal time O(m + n)
a b a a b a
F(j 1)
11
Algorithm KMPMatch(T, P)
F failureFunction(P)
i0
j0
while i < n
if T[i] = P[j]
if j = m 1
return i j { match }
else
ii+1
jj+1
else
if j > 0
j F[j 1]
else
ii+1
return 1 { no match }
Pattern Matching
12
Pattern Matching
5/29/2002 11:27 AM
Computing the Failure
Function
Example
The failure function can be
represented by an array and Algorithm failureFunction(P)
can be computed in O(m) time
F[0] 0
i1
The construction is similar to
j0
the KMP algorithm itself
while i < m
At each iteration of the whileif P[i] = P[j]
{we have matched j + 1 chars}
loop, either
i increases by one, or
the shift amount i j
increases by at least one
(observe that F(j 1) < j)
Hence, there are no more
than 2m iterations of the
while-loop
Pattern Matching
F[i] j + 1
ii+1
jj+1
else if j > 0 then
{use failure function to shift P}
j F[j 1]
else
F[i] 0 { no match }
ii+1
13
a b a c a a b a c c a b a c a b a a b b
1 2 3 4 5 6
a b a c a b
7
a b a c a b
8 9 10 11 12
a b a c a b
13
3
P[j]
F(j)
a b a c a b
14 15 16 17 18 19
a b a c a b
Pattern Matching
14
Tries
5/24/2002 8:37 AM
Outline and Reading
Standard tries (9.2.1)
Compressed tries (9.2.2)
Suffix tries (9.2.3)
Huffman encoding tries (9.3.1)
Tries
e
mize
mi
nimize
ze
nimize
5/24/2002 8:37 AM
nimize
ze
ze
Tries
Preprocessing Strings
After preprocessing the pattern, KMPs algorithm performs
pattern matching in time proportional to the text size
Tries
Standard Trie (2)
5/24/2002 8:37 AM
s
u
l
e
y
l
l
Tries
Each node but the root is labeled with a character
The children of a node are alphabetically ordered
The paths from the external nodes to the root yield the strings of S
S = { bear, bell, bid, bull, buy, sell, stock, stop }
b
e
5/24/2002 8:37 AM
Tries
We insert the
words of the
text into a
trie
Each leaf
stores the
occurrences
of the
associated
word in the
text e
n total size of the strings in S
m size of the string parameter of the operation
d size of the alphabet
Word Matching with a Trie
A standard trie uses O(n) space and supports
searches, insertions and deletions in time O(dm),
where:
The standard trie for a set of strings S is an ordered tree such that:
A tries supports pattern matching queries in time
proportional to the pattern size
5/24/2002 8:37 AM
Example: standard trie for the set of strings
If the text is large, immutable and searched for often
(e.g., works by Shakespeare), we may want to
preprocess the text instead of the pattern
A trie is a compact data structure for representing a
set of strings, such as all the words in a text
Tries
Standard Trie (1)
Preprocessing the pattern speeds up pattern matching
queries
5/24/2002 8:37 AM
o
c
k
p
5
78
5/24/2002 8:37 AM
s e e
b e a r ?
s e l
s t o c k !
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
s e e
b u l
l ?
b u y
s t o c k !
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
b i d
s t o c k !
b i d
s t o c k !
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
h e a r
t h e
b e l
l ?
s t o p !
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
i
d
47, 58
u
l
l
e
y
36
a
r
69
30
Tries
e
e
0, 24
t
l
l
12
o
c
k
17, 40,
51, 62
p
84
Tries
5/24/2002 8:37 AM
Compressed Trie
A compressed trie has
internal nodes of degree
at least two
It is obtained from
standard trie by
compressing chains of
redundant nodes
Compact Representation
b
ar
id
ll
ell
ll
to
ck
0 1 2 3
0 1 2 3 4
S[4] =
S[1] =
s e e
b e a r
S[2] =
s e l l
S[3] =
s t o c k
S[0] =
Stores at the nodes ranges of indices instead of substrings
Uses O(s) space, where s is the number of strings in the array
Serves as an auxiliary index structure
b
e
Compact representation of a compressed trie for an array of strings:
5/24/2002 8:37 AM
1, 2, 3
Tries
S[7] =
S[5] =
S[8] =
h e a r
b e l l
S[6] =
b i d
S[9] =
s t o p
1, 0, 0
1, 1, 1
Suffix Trie (1)
6, 1, 2
8, 2, 3
0 1 2 3
b u l l
b u y
0, 0, 0
7, 0, 3
4, 1, 1
4, 2, 3
5/24/2002 8:37 AM
0, 1, 1
5, 2, 2
0, 2, 2
3, 1, 2
2, 2, 3
3, 3, 4
9, 3, 3
Tries
Suffix Trie (2)
Compact representation of the suffix trie for a string X of size n
from an alphabet of size d
The suffix trie of a string X is the compressed trie of all the
suffixes of X
Uses O(n) space
Supports arbitrary pattern matching queries in X in O(dm) time,
where m is the size of the pattern
m i n i m i z e
0 1 2 3 4 5 6 7
m i n i m i z e
0 1 2 3 4 5 6 7
mi
nimize
ze
7, 7
mize
nimize
ze
nimize
5/24/2002 8:37 AM
ze
4, 7
Tries
Encoding Trie (1)
Each leaf stores a character
The code word of a character is given by the path from the root to
the leaf storing the character (0 for a left child and 1 for a right child
00
010
011
10
11
5/24/2002 8:37 AM
a
Tries
2, 7
0, 1
6, 7
5/24/2002 8:37 AM
2, 7
2, 7
6, 7
6, 7
Tries
10
Encoding Trie (2)
A code is a mapping of each character of an alphabet to a binary
code-word
A prefix code is a binary code such that no code-word is the prefix
of another code-word
An encoding trie represents a prefix code
1, 1
d
b
Given a text string X, we want to find a prefix code for the characters
of X that yields a small encoding for X
Frequent characters should have long code-words
Rare characters should have short code-words
Example
X = abracadabra
T1 encodes X into 29 bits
T2 encodes X into 24 bits
T1
T2
d
a
11
5/24/2002 8:37 AM
b
c
Tries
d
12
Tries
5/24/2002 8:37 AM
Huffmans Algorithm
Given a string X,
Huffmans algorithm
construct a prefix
code the minimizes
the size of the
encoding of X
It runs in time
O(n + d log d), where
n is the size of X
and d is the number
of distinct characters
of X
A heap-based
priority queue is
used as an auxiliary
structure
5/24/2002 8:37 AM
Example
Algorithm HuffmanEncoding(X)
Input string X of size n
Output optimal encoding trie for X
C distinctCharacters(X)
computeFrequencies(C, X)
Q new empty heap
for all c C
T new single-node tree storing c
Q.insert(getFrequency(c), T)
while Q.size() > 1
f1 Q.minKey()
T1 Q.removeMin()
f2 Q.minKey()
T2 Q.removeMin()
T join(T1, T2)
Q.insert(f1 + f2, T)
return Q.removeMin()
Tries
11
a
5
b
2
c
1
d
1
X = abracadabra
Frequencies
a
5
b
2
5/24/2002 8:37 AM
r
2
a
5
2
d
r
2
13
a
5
Tries
4
d
4
d
r
14
Numerical Algorithms
6/8/2002 2:07 PM
Outline
Divisibility and primes
Modular arithmetic
Euclids GCD algorithm
Multiplicative inverses
Powers
Fermats little theorem
Eulers theorem
Numerical Algorithms
x1
6/8/2002 2:07 PM
9
9
Numerical Algorithms
Facts About Numbers
2, 7, 19 are primes
3, 1, 6 are not primes
gcd(18, 30) = 6
gcd(21, 49) = 7
Prime decomposition of a positive integer n:
n = p1e1 pkek
Example:
The greatest common divisor (GCD) of two positive
integers a and b, denoted gcd(a, b), is the largest
positive integer that divides both a and b
The above definition is extended to arbitrary integers
Examples:
p is an integer
p2
The only divisors of p are 1and p
Examples
Numerical Algorithms
Greatest Common Divisor
Prime number p:
6/8/2002 2:07 PM
gcd(0, 20) = 20
Two integers a and b are said to be relatively prime if
gcd(a, b) = 1
Example:
200 = 23 52
Fundamental Theorem of Arithmetic
Integers 15 and 28 are relatively prime
The prime decomposition of a positive integer is unique
6/8/2002 2:07 PM
Numerical Algorithms
Modular Arithmetic
13 mod 13 = 0
13 = 0 + 113
Euclids algorithm for
computing the GCD
repeatedly applies the
formula
gcd(a, b) = gcd(b, a mod b)
Example
1 mod 13 = 12
12 = 1 + 113
Modulo and GCD:
gcd(a, b) = gcd(b, a mod b)
Example:
gcd(21, 12) = 3
6/8/2002 2:07 PM
Numerical Algorithms
Euclids GCD Algorithm
Modulo operator for a positive integer n
r = a mod n
equivalent to
a = r + kn
and
r = a a/n n
Example:
29 mod 13 = 3
29 = 3 + 213
6/8/2002 2:07 PM
gcd(412, 260) = 4
Algorithm EuclidGCD(a, b)
Input integers a and b
Output gcd(a, b)
if b = 0
return a
else
return EuclidGCD(b, a mod b)
412 260 152 108
44
20
260 152 108
20
44
gcd(12, 21 mod 12) = gcd(6, 9) = 3
Numerical Algorithms
6/8/2002 2:07 PM
Numerical Algorithms
Numerical Algorithms
6/8/2002 2:07 PM
Analysis
Multiplicative Inverses (1)
Let ai and bi be the arguments of the i-th recursive call of
algorithm EuclidGCD
We have
ai + 2 = bi + 1 = ai mod ai + 1 < ai + 1
Sequence a1, a2, , an decreases exponentially, namely
ai + 2 ai for i > 1
Case 1 ai + 1 ai
Case 2 ai + 1 > ai
The residues modulo a positive integer n are the set
Zn = {0, 1, 2, , (n 1)}
Let x and y be two elements of Zn such that
xy mod n = 1
We say that y is the multiplicative inverse of x in Zn
and we write y = x1
Example:
ai + 2 < ai + 1 ai
ai + 2 = ai mod ai + 1 = ai ai + 1 ai
Thus, the maximum number of recursive calls of algorithm
EuclidGCD(a. b) is
1 + 2 log max(a. b)
Algorithm EuclidGCD(a, b) executes O(log max(a, b)) arithmetic
operations
6/8/2002 2:07 PM
Numerical Algorithms
The elements of Z10 with a multiplicative inverse are 1, 3, 5, 7
Corollary
If is p is prime, every nonzero residue in Zp has a multiplicative
inverse
Theorem
A variation of Euclids GCD algorithm computes the multiplicative
inverse of an element x of Zn or determines that it does not exist
6/8/2002 2:07 PM
1
1
3
7
7
3
Fermats Little Theorem
24 mod 1 = 16 mod 5 = 1
44 mod 1 = 256 mod 5 = 1
10
10
Numerical Algorithms
Let p be a prime
The sequences of successive powers of the elements of Zp
exhibit repeating subsequences
The sizes of the repeating subsequences and the number of
their repetitions are the divisors of p 1
Example (p = 7)
x
x2
x3
x4
x5
6/8/2002 2:07 PM
x6
Numerical Algorithms
10
The multiplicative group for Zn, denoted with Z*n, is the subset of
elements of Zn relatively prime with n
The totient function of n, denoted with (n), is the size of Z*n
Example
Z*10 = { 1, 3, 7, 9 }
(10) = 4
If p is prime, we have
Corollary
Let p be a prime. For each nonzero residue x of Zp,
the multiplicative inverse of x is xp 2 mod p
Proof
x(xp 2 mod p) mod p = xxp 2 mod p = xp 1 mod p = 1
Numerical Algorithms
Eulers Theorem
Theorem
Let p be a prime. For each nonzero residue x of Zp,
we have xp 1 mod p = 1
Example (p = 5):
6/8/2002 2:07 PM
6/8/2002 2:07 PM
9
9
Numerical Algorithms
14 mod 5 = 1
34 mod 1 = 81 mod 5 = 1
Powers
Theorem
An element x of Zn has a multiplicative inverse if and only if x and
n are relatively prime
Example
x
x1
x1
Multiplicative Inverses (2)
Multiplicative inverses of the residues modulo 11
11
Z*p = {1, 2, , (p 1)}
(p) = p 1
Theorem
For each element x of Z*n, we have x(n) mod n = 1
Example (n = 10)
3(10) mod 10 = 34 mod 10 = 81 mod 10 = 1
7(10) mod 10 = 74 mod 10 = 2401 mod 10 = 1
9(10) mod 10 = 94 mod 10 = 6561 mod 10 = 1
6/8/2002 2:07 PM
Numerical Algorithms
12
FFT
11/27/2002 1:42 AM
Outline and Reading
Polynomial Multiplication Problem
Primitive Roots of Unity (10.4.1)
The Discrete Fourier Transform (10.4.2)
The FFT Algorithm (10.4.3)
Integer Multiplication (10.4.4)
Java FFT Integer Multiplication (10.5)
The Fast Fourier Transform
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
FFT
Polynomials
FFT
Polynomial Evaluation
Polynomial:
Horners Rule:
p( x ) = 5 + 2 x + 8 x 2 + 3x 3 + 4 x 4
Given coefficients (a0,a1,a2,,an-1), defining polynomial
n 1
p ( x ) = ai x i
In general,
n 1
p ( x ) = ai x
i =0
Given x, we can evaluate p(x) in O(n) time using the equation
p( x ) = a0 + x ( a1 + x (a2 + L + x ( an 2 + xan1 )L))
i =0
or
Eval(A,x):
p( x ) = a0 + a1 x + a2 x + L + an 1 x
2
n 1
[Where A=(a0,a1,a2,,an-1)]
If n=1, then return a0
Else,
Let A=(a1,a2,,an-1)
[assume this can be done in constant time]
return a0+x*Eval(A,x)
FFT
Polynomial Multiplication
Problem
Given a set of n points in the plane with distinct x-coordinates,
there is exactly one (n-1)-degree polynomial going through all
these points.
Alternate approach to computing p(x)q(x):
Horners rule doesnt help, since
n 1
p ( x ) q( x ) = ci x
Polynomial Interpolation &
Polynomial Multiplication
Given coefficients (a0,a1,a2,,an-1) and (b0,b1,b2,,bn-1) defining
two polynomials, p() and q(), and number x, compute p(x)q(x).
where
FFT
i =0
Calculate p() on 2n x-values, x0,x1,,x2n-1.
Calculate q() on the same 2n x values.
Find the (2n-1)-degree polynomial that goes through the points
{(x0,p(x0)q(x0)), (x1,p(x1)q(x1)), , (x2n-1,p(x2n-1)q(x2n-1))}.
ci = a j bi j
Unfortunately, a straightforward evaluation would still take
O(n2) time, as we would need to apply an O(n)-time Horners
Rule evaluation to 2n different points.
The magical FFT will do it in O(n log n) time, by picking 2n
points that are easy to evaluate
j =0
A straightforward evaluation would take O(n2) time. The
magical FFT will do it in O(n log n) time.
FFT
FFT
FFT
11/27/2002 1:42 AM
Properties of
Primitive Roots of Unity
Primitive Roots of Unity
A number is a primitive n-th root of unity, for n>1, if
Example 1:
Inverse Property: If is a primitive root of unity, then -1=n-1
n = 1
The numbers 1, , 2, , n-1 are all distinct
Z*11:
x
1
2
3
4
5
6
7
8
9
10
x^2
1
4
9
5
3
3
5
9
4
1
x^3
1
8
5
9
4
7
2
6
3
10
x^4
1
5
4
3
9
9
3
4
5
1
x^5
1
10
1
1
1
10
10
10
1
10
x^6
1
9
3
4
5
5
4
3
9
1
x^7
1
7
9
5
3
8
6
2
4
10
x^8
1
3
5
9
4
4
9
5
3
1
x^9
1
6
4
3
9
2
8
7
5
10
=0
Proof: By the cancellation property, for k=n/2:
n 1
j =0
Corollary: k+n/2= -k.
The DFT and inverse DFT really are inverse operations
Proof: Let A=F -1F. We want to show that A=I, where
A[i , j ] =
A[i , i ] =
1 n 1 ki kj
n k =0
1 n 1 ki ki 1 n 1 0 1
= n =1
= n
n k =0
n
k =0
If i and j are different, then
A[i , j ] =
1 n 1 ( j i ) k
= 0
n k =0
[a0,a1,a2,...,an-1]
[b0,b1,b2,...,bn-1]
Pad with n 0's
Pad with n 0's
[a0,a1,a2,...,an-1,0,0,...,0]
[b0,b1,b2,...,bn-1,0,0,...,0]
DFT
DFT
[y0,y1,y2,...,y2n-1]
FFT
Correctness of the
inverse DFT
F[i,j]=ij.
FFT
So we can get the
coefficients of the
product polynomial
quickly if we can
compute the DFT (and
its inverse) quickly
0 = ( n / 2 ) j = 0 + n / 2 + 0 + n / 2 + L + 0 + n / 2 = (n / 2)(1 + n / 2 )
Matrix form: a=F -1y, where F -1[i,j]=-ij/n.
The DFT and the
inverse DFT can be
used to multiply two
polynomials
kj
j =0
( ) 1 ( ) 1 (1) 1
11
=
= k
=
=0
k 1
k 1
1 k 1
If i=j, then
y j = ai
Convolution
Reflective Property: If n is even, then n/2 = -1.
The Inverse Discrete Fourier Transform recovers the
coefficients of an (n-1)-degree polynomial given its values at
1,,2,,n-1
kj
Proof: If 1,,2,,2n-1 are all distinct, so are 1,2,(2)2,,(2)n-1
1,,2,,n-1
We produce (y0,y1,y2,,yn-1), where yj=p(j)
n 1
That is,
ij
Matrix form: y=Fa, where
Reduction Property: If w is a primitve (2n)-th root of unity, then
2 is a primitive n-th root of unity.
2, 6, 7, 8 are 10-th roots of unity in Z*11
22=4, 62=3, 72=5, 82=9 are 5-th roots of unity in Z*11
2-1=6, 3-1=4, 4-1=3, 5-1=9, 6-1=2, 7-1=8, 8-1=7, 9-1=5
i =0
n 1
j=0
Given coefficients (a0,a1,a2,,an-1) for an (n-1)-degree polynomial
p(x)
The Discrete Fourier Transform is to evaluate p at the values
Proof:
x^10
1
1
1
1
1
1
1
1
1
1
The Discrete Fourier Transform
n 1
Cancellation Property: For non-zero -n<k<n,
Example 2: The complex number e2i/n is a primitive n-th root of
unity, where i = 1
FFT
7
Proof: n-1=n=1
[z0,z1,z2,...,z2n-1]
(by Cancellation Property)
FFT
10
The Fast Fourier Transform
The FFT is an efficient algorithm for computing the DFT
The FFT is based on the divide-and-conquer paradigm:
If n is even, we can divide a polynomial
into two polynomials
Component
Multiply
[y0z0,y1z1,...,y2n-1z2n-1]
and we can write
inverse DFT
[c0,c1,c2,...,c2n-1]
FFT
(Convolution)
11
FFT
12
FFT
11/27/2002 1:42 AM
The FFT Algorithm
Multiplying Big Integers
Given N-bit integers I and J, compute IJ.
Assume: we can multiply words of O(log N) bits in constant time.
Setup: Find a prime p=cn+1 that can be represented in one word,
and set m=(log p)/2, so that we can view I and J as n-length
vectors of m-bit words.
Finding a primitive root of unity.
Find a generator x of Z*p.
Then =xc is a primitive n-th root of unity in Z*p (arithmetic is mod p)
Apply convolution and FFT algorithm to compute the convolution C
of the vector representations of I and J.
n 1
Then compute
K = ci 2 mi
i =0
The running time is O(n log n). [inverse FFT is similar]
FFT
13
Java Example:
Multiplying Big Integers
FFT
14
Java Integer
Multiply Method
Setup: Define BigInt class, and include essential parameters,
including the prime, P, and primitive root of unity, OMEGA.
FFT
K is a vector representing IJ, and takes O(n log n) time to compute.
Use convolution to multiply two big integers, this and val:
15
FFT
16
Support Methods for
Java FFT in Z*p
Java FFT in Z*p
FFT
17
FFT
18
FFT
11/27/2002 1:42 AM
Non-recursive FFT
Experimental Results
There is also a non-recursive version of the FFT
Performs the FFT in place
Precomputes all roots of unity
Performs a cumulative collection of shuffles on A and
on B prior to the FFT, which amounts to assigning
the value at index i to the index bit-reverse(i).
Log-log scale shows traditional multiply runs in
O(n2) time, while FFT versions are almost linear
The code is a bit more complex, but the running
time is faster by a constant, due to improved
overhead
FFT
19
FFT
20
Cryptography
6/8/2002 2:08 PM
Outline
Traditional cryptography
Statistical attacks
Secret-key encryption
Public-key encryption
Cryptography
plaintext
6/8/2002 2:08 PM
encrypt
ciphertext
Cryptography
Encryption
6/8/2002 2:08 PM
encrypt
ciphertext
decrypt
Cryptography
plaintext
3
Statistical Attacks
Most frequent characters in English: e, t, o, a, n, i, ...
Most frequent digrams: th, in, er, re, an, ...
Most frequent trigrams: the, ing, and, ion, ...
The first description of the frequency analysis attack appears in a
book written in the 9th century by the Arab philosopher al-Kindi
Example (S. Singh, The Code Book, 1999):
PCQ VMJYPD LBYK LYSO KBXBJXWXV BXV ZCJPO EYPD KBXBJYUXJ LBJOO
KCPK. CP LBO LBCMKXPV XPV IYJKL PYDBL, QBOP KBO BXV OPVOV LBO
LXRO CI SX'XJMI, KBO JCKO XPV EYKKOV LBO DJCMPV ZOICJO BYS,
KXUYPD: DJOXL EYPD, ICJ X LBCMKXPV XPV CPO PYDBLK Y BXNO ZOOP
JOACMPLYPD LC UCM LBO IXZROK CI FXKL XDOK XPV LBO RODOPVK CI
XPAYOPL EYPDK. SXU Y SXEO KC ZCRV XK LC AJXNO X IXNCMJ CI UCMJ
SXGOKLU?
OFYRCDMO, LXROK IJCS LBO LBCMKXPV XPV CPO PYDBLK
6/8/2002 2:08 PM
Cryptography
most frequent letters in English: e, t, o, a, n, i, ...
most frequent digrams: th, in, er, re, an, ...
most frequent trigrams: the, ing, and, ion, ...
The first description of the frequency analysis attack appears in a
book written in the 9th century by the Arab philosopher al-Kindi
6/8/2002 2:08 PM
Cryptography
Frequency Analysis (1)
Armed with statistical knowledge about the plaintext language, one
can easily break a monoalphabetic substitution cipher
replace a with d
replace b with e
...
replace z with c
Caesars cipher is an example of a monoalphabetic substitution
cipher, which permutes the characters
Armed with simple statistical knowledge, one can easily break a
monoalphabetic substitution cipher
What is a good encryption scheme?
What is the complexity of encrypting/decrypting?
What is the size of the ciphertext, relative to the plaintext?
If Alice and Bob have never interacted before, how can they
agree on an encryption scheme?
plaintext
Ciphers were already studied in ancient times
Caesars cipher:
Alice wants to send a message (plaintext p) to Bob.
The communication channel is insecure and can be eavesdropped
If Alice and Bob have previously agreed on an encryption scheme
(cipher), the message can be sent encrypted (ciphertext c)
Issues:
Cryptography
Traditional Cryptography
Scenario:
6/8/2002 2:08 PM
We identify the most common characters, digrams and trigrams
in the ciphertext
Example
PCQ VMJYPD LBYK LYSO KBXBJXWXV BXV ZCJPO EYPD
KBXBJYUXJ LBJOO KCPK. CP LBO LBCMKXPV XPV IYJKL PYDBL,
QBOP KBO BXV OPVOV LBO LXRO CI SX'XJMI, KBO JCKO XPV
EYKKOV LBO DJCMPV ZOICJO BYS, KXUYPD: DJOXL EYPD, ICJ
X LBCMKXPV XPV CPO PYDBLK Y BXNO ZOOP JOACMPLYPD LC
UCM LBO IXZROK CI FXKL XDOK XPV LBO RODOPVK CI XPAYOPL
EYPDK. SXU Y SXEO KC ZCRV XK LC AJXNO X IXNCMJ CI UCMJ
SXGOKLU?
OFYRCDMO, LXROK IJCS LBO LBCMKXPV XPV CPO PYDBLK
First guess:
LBO is THE
6/8/2002 2:08 PM
Cryptography
Cryptography
6/8/2002 2:08 PM
Frequency Analysis (2)
Decryption
Assuming LBO represents THE, we replace L with T, B with H,
and O with E and get
PCQ VMJYPD THYK TYSE KHXHJXWXV HXV ZCJPE EYPD
KHXHJYUXJ THJEE KCPK. CP THE THCMKXPV XPV IYJKT
PYDHT, QHEP KHO HXV EPVEV THE LXRE CI SX'XJMI, KHE JCKE
XPV EYKKEV THE DJCMPV ZEICJE HYS, KXUYPD: DJEXT EYPD,
ICJ X THCMKXPV XPV CPE PYDHTK Y HXNE ZEEP JEACMPTYPD
TC UCM THE IXZREK CI FXKT XDEK XPV THE REDEPVK CI
XPAYEPT EYPDK. SXU Y SXEE KC ZCRV XK TC AJXNE X IXNCMJ
CI UCMJ SXGEKTU?
EFYRCDME, TXREK IJCS THE THCMKXPV XPV CPE PYDBTK
6/8/2002 2:08 PM
Cryptography
Secret-Key Encryption
DES
3DES
IDEA
BLOWFISH
Cryptography
Cryptography
Bob uses a pair of keys (KE,KD) and
makes key KE public
keeps key KD private
Anyone can use the public key KE to encrypt a plaintext into a
ciphertext sent to Bob
Only Bob can decrypt the ciphertext using the private key KD
The most popular encryption scheme is RSA, named after its
inventors Rivest, Shamir, and Adleman (1978)
The RSA patent expired in 2000
public key
With private-key encryption, a distinct secret key must be
established for every pair of parties
6/8/2002 2:08 PM
6/8/2002 2:08 PM
Public-Key Encryption
A secret-key cipher uses a unique key K to encrypt and decrypt
Caesars generalized cipher uses the modular addition of each
character (viewed as an integer) with the key:
C[i] = P[i] + K mod m
P[i] = C[i] K mod m
More secure secret-key encryption schemes have been devised
in this century
Examples:
Code:
X Z A V O I D B Y G E R S P C F H J K L M N Q T U W
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Ciphertext:
PCQ VMJYPD LBYK LYSO KBXBJXWXV BXV ZCJPO EYPD KBXBJYUXJ
LBJOO KCPK. CP LBO LBCMKXPV XPV IYJKL PYDBL, QBOP KBO BXV
OPVOV LBO LXRO CI SX'XJMI, KBO JCKO XPV EYKKOV LBO DJCMPV
ZOICJO BYS, KXUYPD: DJOXL EYPD, ICJ X LBCMKXPV XPV CPO PYDBLK
Y BXNO ZOOP JOACMPLYPD LC UCM LBO IXZROK CI FXKL XDOK XPV
LBO RODOPVK CI XPAYOPL EYPDK. SXU Y SXEO KC ZCRV XK LC AJXNO
X IXNCMJ CI UCMJ SXGOKLU?
OFYRCDMO, LXROK IJCS LBO LBCMKXPV XPV CPO PYDBLK
Plaintext:
Now during this time Shahrazad had borne King Shahriyar three sons.
On the thousand and first night, when she had ended the tale of
Ma'aruf, she rose and kissed the ground before him, saying: Great King,
for a thousand and one nights I have been recounting to you the fables
of past ages and the legends of ancient kings. May I make so bold as to
crave a favour of your majesty?
Epilogue, Tales from the Thousand and One Nights
plaintext
9
6/8/2002 2:08 PM
encrypt
private key
ciphertext
Cryptography
decrypt
plaintext
10
RSA Cryptosystem
6/8/2002 2:20 PM
Outline
Eulers theorem (10.1.3)
RSA cryptosystem (10.2.3)
RSA Cryptosystem
Bits
PCs
Memory
430
128MB
760
215,000
4GB
1,020
342106
170GB
1,620
1.61015
120TB
Algorithms for RSA
6/8/2002 2:20 PM
RSA Cryptosystem
Setup:
(10) = 4
RSA Cryptosystem
1
1
19
39
37
53
2
8
20
25
38
37
3
27
21
21
39
29
6/8/2002 2:20 PM
4
9
22
33
40
35
5
15
23
12
41
6
6
51
24
19
42
3
7
13
25
5
43
32
8
17
26
31
44
44
9
14
27
48
45
45
10
10
28
7
46
41
RSA Cryptosystem
11
11
29
24
47
38
public key: (119, 5)
private key: 77
M = C27 mod 55
12
23
30
50
48
42
13
52
31
36
49
4
Encryption:
M = 19
C = 195 mod 119 = 66
Decryption:
C = 6677 mod 119 = 19
M = Cd mod n
RSA Cryptosystem
The security of the RSA
cryptosystem is based on the
widely believed difficulty of
factoring large numbers
C = M3 mod 55
Decryption
Keys:
Security
Encryption
p = 5, q = 11
n = 511 = 55
(n) = 410 = 40
e = 3
d = 27 (327 = 81 = 240 + 1)
Plaintext M in Zn
C = Me mod n
6/8/2002 2:20 PM
Complete RSA Example
Public key: KE = (n, e)
Private key: KD = d
Decryption:
Setup:
p = 7, q = 17
n = 717 = 119
(n) = 616 = 96
e=5
d = 77
Encryption:
3(10) mod 10 = 34 mod 10 = 81 mod 10 = 1
7(10) mod 10 = 74 mod 10 = 2401 mod 10 = 1
9(10) mod 10 = 94 mod 10 = 6561 mod 10 = 1
Setup:
Keys:
(p) = p 1
Eulers Theorem
For each element x of Z*n, we have x(n) mod n = 1
Example (n = 10)
M
C
M
C
M
C
Example
n = pq, with p and q
primes
e relatively prime to
(n) = (p 1) (q 1)
d inverse of e in Z(n)
If p is prime, we have
6/8/2002 2:20 PM
RSA Cryptosystem
RSA Cryptosystem
The multiplicative group for Zn, denoted with Z*n, is the subset of
elements of Zn relatively prime with n
The totient function of n, denoted with (n), is the size of Z*n
Example
Z*p = {1, 2, , (p 1)}
Modular power (10.1.4)
Modular inverse (10.1.5)
Randomized primality testing (10.1.6)
6/8/2002 2:20 PM
Eulers Theorem
Z*10 = { 1, 3, 7, 9 }
Definition
Example
Security
Correctness
14
49
32
43
50
40
15
20
33
22
51
46
16
26
34
34
52
28
17
18
35
30
53
47
5
18
2
36
16
54
54
The best known factoring
algorithm (general number
field sieve) takes time
exponential in the number of
bits of the number to be
factored
The RSA challenge, sponsored
by RSA Security, offers cash
prizes for the factorization of
given large numbers
In April 2002, prizes ranged
from $10,000 (576 bits) to
$200,000 (2048 bits)
6/8/2002 2:20 PM
In 1999, a 512-bit number was
factored in 4 months using the
following computers:
160 175-400 MHz SGI and Sun
8 250 MHz SGI Origin
120 300-450 MHz Pentium II
4 500 MHz Digital/Compaq
Estimated resources needed to
factor a number within one year
RSA Cryptosystem
Bits
PCs
Memory
430
128MB
760
215,000
4GB
1,020
342106
170GB
1,620
1.61015
120TB
6
RSA Cryptosystem
6/8/2002 2:20 PM
Correctness
Algorithmic Issues
We show the correctness of
the RSA cryptosystem for the
case when the plaintext M
does not divide n
Namely, we show that
(Me)d mod n = M
Since ed mod (n) = 1, there is
an integer k such that
ed = k(n) + 1
Since M does not divide n, by
Eulers theorem we have
M(n) mod n = 1
Thus, we obtain
(Me)d mod n =
Med mod n =
Mk(n) + 1 mod n =
MMk(n) mod n =
M (M(n))k mod n =
M (M(n) mod n)k mod n =
M (1)k mod n =
M mod n =
M
See the book for the proof of
correctness in the case when
the plaintext M divides n
The implementation of
the RSA cryptosystem
requires various
algorithms
Overall
RSA Cryptosystem
Modular Power
The repeated squaring
algorithm speeds up the
computation of a modular
power ap mod n
Write the exponent p in binary
p = pb 1 pb 2 p1 p0
Start with
Q1 = apb 1 mod n
Repeatedly compute
Qi = ((Qi 1)2 mod n)apb i mod n
We obtain
Qb = ap mod n
The repeated squaring
algorithm performs O (log p)
arithmetic operations
6/8/2002 2:20 PM
3 mod 19 (18 = 10010)
Q1 = 31 mod 19 = 3
Q2 = (32 mod 19)30 mod 19 = 9
Q3 = (92 mod 19)30 mod 19 =
81 mod 19 = 5
Q4 = (52 mod 19)31 mod 19 =
(25 mod 19)3 mod 19 =
18 mod 19 = 18
Q5 = (182 mod 19)30 mod 19 =
(324 mod 19) mod 19 =
1719 + 1 mod 19 = 1
18
Qi
18
RSA Cryptosystem
a = 21
b = 15
d=3
i = 3, j = 4
3 = 321 + (4)15 =
63 60 = 3
6/8/2002 2:20 PM
Given positive integers a and b,
the extended Euclids algorithm
computes a triplet (d,i,j) such that
d = gcd(a,b)
d = ia + jb
To test the existence of and
compute the inverse of x Zn, we
execute the extended Euclids
algorithm on the input pair (x,n)
Let (d,i,j) be the triplet returned
d = ix + jn
Case 1: d = 1
i is the inverse of x in Zn
Case 2: d > 1
x has no inverse in Zn
RSA Cryptosystem
10
Randomized Primality Testing
A random 100-bit integer is a composite base-2 pseudoprime with
probability less than 10-13
The smallest composite base-2 pseudoprime is 341
Check whether xn 1 mod n = 1
Can be performed efficiently with the repeated squaring algorithm
RSA Cryptosystem
xn 1 mod n = 1 (Fermats little theorem)
6/8/2002 2:20 PM
RSA Cryptosystem
Theorem
Given positive integers a
and b, let d be the smallest
positive integer such that
d = ia + jb
for some integers i and j.
We have
d = gcd(a,b)
Example
Base-x pseudoprimality testing for an integer n:
Modular power
6/8/2002 2:20 PM
2 p5 i
Composite base-x pseudoprimes are rare:
Modular power
Decryption
p5 1
The number of primes less than or equal to n is about n / ln n
Thus, we expect to find a prime among, O(b) randomly generated
numbers with b bits each
Testing whether a number is prime (primality testing) is believed
to be a hard problem
An integer n 2 is said to be a base-x pseudoprime if
Representation of integers
of arbitrarily large size and
arithmetic operations on
them
Modular Inverse
Example
Pseudoprimality Testing
Generation of random
numbers with a given
number of bits (to generate
candidates p and q)
Primality testing (to check
that candidates p and q are
prime)
Computation of the GCD (to
verify that e and (n) are
relatively prime)
Computation of the
multiplicative inverse (to
compute d from e)
Encryption
6/8/2002 2:20 PM
Setup
11
Compositeness witness function
witness(x, n) with error probability
q for a random variable x
Case 1: n is prime
witness w(x, n) = false
Case 2: n is composite
witness w(x, n) = false with
probability q < 1
Algorithm RandPrimeTest tests
whether n is prime by repeatedly
evaluating witness(x, n)
A variation of base- x
pseudoprimality provides a
suitable compositeness witness
function for randomized primality
testing (Rabin-Miller algorithm)
6/8/2002 2:20 PM
Algorithm RandPrimeTest(n, k)
Input integer n,confidence
parameter k and composite
witness function witness(x,n)
with error probability q
Output an indication of
whether n is composite or prime
with probability 2k
RSA Cryptosystem
t k/log2(1/q)
for i 1 to t
x random()
if witness(x,n)= true
return n is composite
return n is prime
12
Information Security
6/8/2002 2:20 PM
Outline and Reading
Digital signatures
Information Security
Definition (10.2.2)
RSA signature and verification (10.2.3)
One-way hash functions
message
M
one-way hash
fingerprint
f = H(M)
Key distribution
6/8/2002 2:20 PM
Information Security
Digital Signature
Integrity: S establishes that M has not been altered
Nonrepudiation: S unequivocally identifies the author A of M and proves
that A did indeed sign M
A digital signature scheme provides algorithms for
M maps a string M of arbitrary length into an integer f = H(M) with a
fixed number of bits, called the fingerprint or digest of M
H can be computed efficiently
Given an integer f, it is computationally infeasible to find a string M
such that that H(M) = d
Given a string M , it is computationally infeasible to find another string
M such that H(M) = H(M) (collision resistance)
It is computationally infeasible to find two strings M and M such that
H(M) = H(M) (strong collision resistance)
Information Security
Setup:
n = pq, with p and q
primes
e relatively prime to
(n) = (p 1) (q 1)
d inverse of e in Z(n)
Public key: KE = (n, e)
Private key: KD = d
Message M in Zn
Signature S = Md mod n
Public key: KE = (55, 3)
Private key: KD = 27
Signature:
M = 51
S = 5127 mod 55 = 6
Verification:
Check that M = Se mod n
6/8/2002 2:20 PM
p = 5, q = 11
n = 511 = 55
(n) = 410 = 40
e=3
d = 27 (327 = 81 = 240 + 1)
Keys:
Signature:
S = 63 mod 55 = 216 mod 55 = 51
Information Security
Alice and Bob want to flip a random coin by communicating
over the internet
The following protocol, based on a one-way hash function H,
ensures the fairness of the outcome
MD5 (Message Digest 5, 1992), which uses a 128-bit (16 bytes)
fingerprint
SHA-1 (Secure Hash Algorithm 1, 1995), which uses a 160-bit (20
bytes) fingerprint
6/8/2002 2:20 PM
Coin Flipping Over the Net
Two widely used one-way hash functions are
A one-way hash function is a function H with the following
properties
Verification:
One-Way Hash Function
Setup:
Signature: Alice (author) computes S = decrypt(KD,M) using her private
key KD and sends the pair (M,S) to Bob
Verification: Bob (reader) computes M = encrypt(KE, S) using Alices
public key KE and checks that M = M
Information Security
Keys:
A recently passed law in the US gives digital signatures the same
validity of handwritten signatures
A public-key cryptosystem yields a digital signature scheme
provided encrypt(KE, decrypt(KD, M)) = M
Information Security
6/8/2002 2:20 PM
Signing a message by the author
Verifying the signature of a message by the reader
6/8/2002 2:20 PM
Certificates (10.3.5)
Revocation (10.3.5)
RSA Digital Signature
A digital signature is a string S associated with a message M and
the author A of M that has the following properties
Definition (10.3.1)
Applications (10.3.2)
Alice picks a random integer x, computes the fingerprint f = H(x)
and sends f to Bob
Bob sends to Alice his guess of whether x is odd or even
Alice announces the result of the coin flip: heads if Bob has
guessed correctly and tails otherwise
Alice sends to Bob integer x as a proof of the outcome of the flip
Bob verifies that f = H(x)
Because of the strong-collision resistance property, it is
computationally infeasible for Alice to cheat
6/8/2002 2:20 PM
Information Security
Information Security
6/8/2002 2:20 PM
Digitally Signed Fingerprints
Certificates
In the RSA digital signature scheme with modulus n, the message
to be signed must be an integer in Zn , i.e., the message should
have at most b = log n bits
To overcome the above restriction on the message length, we can
use the fingerprint f = H(M) of the message instead of the
message itself, where H is a one-way hash function
Alice computes first f = H(M) and then the signature S of f
Bob first computes f = H(M) and then verifies S
Since the one-way hash function H has the collision-resistance
property, it is computationally infeasible to modify the message M
while preserving the signature of the fingerprint f = H(M)
Public-key cryptography is based on the knowledge by each
participant of the public key of the other participants
It is complicated to securely distribute the public keys of all the
participants
A certificate is a message of the type (name, public key) signed
by a third-party
Public-key infrastructure (PKI)
message
M
6/8/2002 2:20 PM
one-way hash
fingerprint
f = H(M)
sign
Information Security
signature
S = f d mod n
7
Web Server Certificates
The private key of the subject has been compromised
The certificate was incorrectly issued by the CA
Certificate Revocation List (CRL)
Time-stamped list of all the unexpired certificates that have been
revoked by the CA
Periodically published and signed by the CA
When presented with a certificate, one should
The SSL (secure socket layer)
protocol uses Web server
certificates to provide encryption
and authentication in a secure
Web connection (https)
Information Security
Information Security
In certain circumstances, a certificate may have to be revoked
before its expiration date
Serial number
Hash and signature schemes
(e.g., MD5 and RSA)
Issuer (certification authority)
Period of validity (from, to)
Subject (URL and organization)
Public key
6/8/2002 2:20 PM
6/8/2002 2:20 PM
Certificate Revocation
A Web server certificate is used
to authenticate the public key of
a Web server
Fields of a Web server certificate
An entity trusted by all the participants, called certification
authority (CA), issues to each participant a certificate (Name, KE)
that authoritatively binds the participants to their public keys
Only the CAs public key needs to be distributed securely
Before sending an encrypted message to Bob or verifying a
message digitally signed by Bob, Alice determines Bobs public key
KE by using Bobs certificate (Bob, KE)
Verify the CAs signature on the certificate
Check that the certificate has non been revoked by searching in the
latest available CRL
By default, Web browsers do not check the revocation status of
a Web server certificate, which poses a security risk
9
6/8/2002 2:20 PM
Information Security
10
Convex Hull
6/8/2002 12:42 PM
Outline and Reading
Convex hull (12.5.2)
Orientation (12.5.1-2)
Sorting by angle (12.5.5)
Graham scan (12.5.5)
Analysis (12.5.5)
Convex Hull
obstacle
start
6/8/2002 12:42 PM
end
Convex Hull
Convex Polygon
6/8/2002 12:42 PM
Convex Hull
The convex hull of a set of points is the smallest
convex polygon containing the points
Think of a rubber band snapping around the points
6/8/2002 12:42 PM
Find an optimal route that avoids obstacles for a robot
Geometric algorithms
Two points
All the points are
collinear
Convex hull is like a two-dimensional sorting
obstacle
there is one point
All the points are
coincident
6/8/2002 12:42 PM
Motion planning
The convex hull is a
point
Convex Hull
Applications
The convex hull is a
segment
nonconvex
Special Cases
Convex Hull
Convex Hull
A convex polygon is a nonintersecting polygon whose
internal angles are all convex (i.e., less than )
In a convex polygon, a segment joining two vertices
of the polygon lies entirely inside the polygon
convex
6/8/2002 12:42 PM
start
Convex Hull
6/8/2002 12:42 PM
end
Convex Hull
Convex Hull
6/8/2002 12:42 PM
Computing the Convex Hull
Orientation
The orientation of three points in the
plane is clockwise, counterclockwise, or
collinear
orientation(a, b, c)
The following method computes the convex hull of a set of points
Phase 1: Find the lowest point (anchor point)
Phase 2: Form a nonintersecting polygon by sorting the points
counterclockwise around the anchor point
Phase 3: While the polygon has a nonconvex vertex, remove it
clockwise (CW, right turn)
counterclockwise (CCW, left turn)
collinear (COLL, no turn)
6/8/2002 12:42 PM
Convex Hull
CCW
b
a
COLL
b
p
q
6/8/2002 12:42 PM
COLL
q convex orientation(p, q, r) = CCW
q nonconvex orientation(p, q, r) = CW or COLL
CW
c
a
p
9
6/8/2002 12:42 PM
Graham Scan
c
b
Convex Hull
Convex Hull
The Graham scan is a
systematic procedure for
removing nonconvex
vertices from a polygon
The polygon is traversed
counterclockwise and a
sequence H of vertices is
maintained
yc 1
CCW
6/8/2002 12:42 PM
xc
Testing whether a vertex is convex can be done
using the orientation function
Let p, q and r be three consecutive vertices of a
polygon, in counterclockwise order
b < c orientation(a, b, c) = CCW
b = c orientation(a, b, c) = COLL
b > c orientation(a, b, c) = CW
yb 1
CW
Removing Nonconvex Vertices
Computing angles from coordinates is complex and
leads to numerical inaccuracy
We can sort a set of points by angle with respect to
the anchor point a using a comparator based on the
orientation function
(a, b, c) = xb
6/8/2002 12:42 PM
Sorting by Angle
ya 1
c
a
The orientation of three points is
characterized by the sign of the
determinant (a, b, c), whose absolute
value is twice the area of the triangle with
vertices a, b and c
xa
Convex Hull
10
Analysis
for each vertex r of the polygon
Computing the convex hull of a set of points
takes O(n log n) time
Let q and p be the last and second last
vertex of H
while orientation(p, q, r) = CW or COLL
remove q from H
qp
p vertex preceding p in H
Add r to the end of H
Convex Hull
p
H
11
Finding the anchor point takes O(n) time
Sorting the points counterclockwise around the
anchor point takes O(n log n) time
Use the orientation comparator and any sorting
algorithm that runs in O(n log n) time (e.g., heap-sort or
merge-sort)
The Graham scan takes O(n) time
Each point is inserted once in sequence H
Each vertex is removed at most once from sequence H
6/8/2002 12:42 PM
Convex Hull
12
Incremental Convex Hull
6/8/2002 2:01 PM
Outline and Reading
Point location
Incremental Convex Hull
Incremental convex hull
6/8/2002 2:01 PM
Incremental Convex Hull
Point Location
Given a convex polygon P, a
point location query locate(q)
determines whether a query
point q is inside (IN), outside
(OUT), or on the boundary
(ON) of P
An efficient data structure for
point location stores the top
and bottom chains of P in two
binary search trees, TL and TH
of logarithmic height
6/8/2002 2:01 PM
locate(q): determines if
query point q is inside,
outside or on the convex
hull of S
insert(q): inserts a new
point q into S
hull(): returns the convex
hull of S
6/8/2002 2:01 PM
Incremental Convex Hull
Edge eL or vertex vL on the
lower chain of P whose
horizontal span includes x(q)
Edge eH or vertex vH on the
upper chain of P whose
horizontal span includes x(q)
We consider four cases
TL
Incremental Convex Hull
6/8/2002 2:01 PM
TH
To perform locate(q), we search
for x(q) in TL and TH to find
Incremental Convex Hull
The incremental convex
hull problem consists of
performing a series of
the following operations
on a set S of points
Problem
Data structure
Insertion algorithm
Analysis
Point Location (cont.)
TH
An internal node stores a pair
(x (v), v) where v is a vertex
and x (v) is its x-coordinate
An external node represents
an edge or an empty halfplane
Problem
Data structure
Incremental Convex Hull
If no such edges/vertices exist,
we return OUT
Else if q is on eL (vL) or on eH
(vH), we return ON
Else if q is above eL (vL) and
below eH (vH), we return IN
Else, we return OUT
6/8/2002 2:01 PM
vL
TL
Incremental Convex Hull
Insertion of a Point
Incremental convex
hull data structure
eH
P
We store the points
of the convex hull
and discard the other
points
We store the hull
points in two redblack trees
TL for the lower hull
TH for the upper hull
In operation insert(q),
we consider four
cases that depend on
the location of point q
A IN or ON: no change
B OUT and above: add q
to the upper hull
C OUT and below: add q
to the lower hull
D OUT and left or right:
add q to the lower and
upper hull
6/8/2002 2:01 PM
Incremental Convex Hull
Incremental Convex Hull
6/8/2002 2:01 PM
Insertion of a Point (cont.)
We find the edge e (vertex v) whose
horizontal span includes q
w left endpoint (neighbor) of e (v)
z left neighbor of w
While orientation(q, w, z) = CW or COLL
Let n be the current size of the convex
hull
u right endpoint (neighbor) of e (v)
t right neighbor of u
While orientation(t, u, q) = CW or COLL
We remove vertex u
ut
t right neighbor of u
We remove vertex w
wz
z left neighbor of w
Analysis
q
Algorithm to add a vertex q to the upper
hull chain in Case B (boundary conditions
omitted for simplicity)
We add vertex q
6/8/2002 2:01 PM
w
z
Incremental Convex Hull
Operation locate takes O(log n) time
Operation insert takes O((1 + k)log n) time,
where k is the number of vertices removed
Operation hull takes O(n) time
The amortized running time of operation
insert is O(log n)
t
7
6/8/2002 2:01 PM
Incremental Convex Hull
Graphs
6/3/2002 1:41 PM
Outline and Reading
P and NP (13.1)
NP-Completeness
x1
x1
x2
x2
12
x3
x3
x4
22
x4
NP-completeness (13.2)
32
11
13
21
23
31
Running Time Revisited
NP-Completeness
Dealing with Hard Problems
Input size, n
To be exact, let n denote the number of bits in a nonunary
encoding of the input
All the polynomial-time algorithms studied so far in this
course run in polynomial time using this definition of
input size.
What to do when we find a problem
that looks hard
Exception: any pseudo-polynomial time algorithm
SFO
2555
337
HNL
1843
43
17
LAX
1233
849
ORD
802
Definition of NP-hard and NP-complete
The Cook-Levin Theorem
33
NP-Completeness
Definition of P
Definition of NP
Alternate definition of NP
7
138
DFW
2
14
PVD
LGA
1120
10
99
I couldnt find a polynomial-time algorithm;
I guess Im too dumb.
MIA
NP-Completeness
Dealing with Hard Problems
Dealing with Hard Problems
Sometimes we can prove a strong lower
bound (but not usually)
I couldnt find a polynomial-time algorithm,
because no such algorithm exists!
NP-Completeness
NP-Completeness
NP-completeness lets us show
collectively that a problem is hard.
I couldnt find a polynomial-time algorithm,
but neither could all these other smart people.
5
NP-Completeness
Graphs
6/3/2002 1:41 PM
Polynomial-Time
Decision Problems
Problems and Languages
To simplify the notion of hardness, we will
focus on the following:
Polynomial-time as the cut-off for efficiency
Decision problems: output is 1 or 0 (yes or no)
Examples:
A language L is a set of strings defined over some
alphabet
Every decision algorithm A defines a language L
Does a given graph G have an Euler tour?
Does a text T contain a pattern P?
Does an instance of 0/1 Knapsack have a solution with
benefit at least K?
L is the set consisting of every string x such that A outputs
yes on input x.
We say A accepts x in this case
Example:
If A determines whether or not a given graph G has an
Euler tour, then the language L for A is all graphs with
Euler tours.
Does a graph G have an MST with weight at most K?
NP-Completeness
NP-Completeness
The Complexity Class NP
The Complexity Class P
We say that an algorithm is non-deterministic if it
uses the following operation:
A complexity class is a collection of languages
P is the complexity class consisting of all languages
that are accepted by polynomial-time algorithms
For each language L in P there is a polynomial-time
decision algorithm A for L.
We say that a non-deterministic algorithm A accepts
a string x if there exists some sequence of choose
operations that causes A to output yes on input x.
NP is the complexity class consisting of all languages
accepted by polynomial-time non-deterministic
algorithms.
If n=|x|, for x in L, then A runs in p(n) time on input x.
The function p(n) is some polynomial
NP-Completeness
Problem: Decide if a graph has an MST of weight K
Algorithm:
2.
3.
NP-Completeness
10
The Complexity Class NP
Alternate Definition
NP example
1.
Choose(b): chooses a bit b
Can be used to choose an entire string y (with |y| choices)
Non-deterministically choose a set T of n-1 edges
Test that T forms a spanning tree
Test that T has weight at most K
Analysis: Testing takes O(n+m) time, so this
algorithm runs in polynomial time.
NP-Completeness
We say that an algorithm B verfies the acceptance
of a language L if and only if, for any x in L, there
exists a certificate y such that B outputs yes on
input (x,y).
NP is the complexity class consisting of all languages
verified by polynomial-time algorithms.
We know: P is a subset of NP.
Major open question: P=NP?
Most researchers believe that P and NP are different.
11
NP-Completeness
12
Graphs
6/3/2002 1:41 PM
Equivalence of the
Two Definitions
NP example (2)
Problem: Decide if a graph has an MST of weight K
Suppose A is a non-deterministic algorithm
Let y be a certificate consisting of all the outcomes of the
choose steps that A uses
We can create a verification algorithm that uses y instead of
As choose steps
If A accepts on x, then there is a certificate y that allows us to
verify this (namely, the choose steps A made)
If A runs in polynomial-time, so does this verification
algorithm
Verification Algorithm:
1.
2.
3.
Use as a certificate, y, a set T of n-1 edges
Test that T forms a spanning tree
Test that T has weight at most K
Analysis: Verification takes O(n+m) time, so this
algorithm runs in polynomial time.
NP-Completeness
Suppose B is a verification algorithm
Non-deterministically choose a certificate y
Run B on y
If B runs in polynomial-time, so does this non-deterministic
algorithm
13
An Interesting Problem
NP-Completeness
CIRCUIT-SAT is in NP
A Boolean circuit is a circuit of AND, OR, and NOT
gates; the CIRCUIT-SAT problem is to determine if
there is an assignment of 0s and 1s to a circuits
inputs so that the circuit outputs 1.
Non-deterministically choose a set of inputs and the
outcome of every gate, then test each gates I/O.
Inputs:
Logic Gates:
0
1
Inputs:
1
Logic Gates:
NOT
0
Output:
0
1
1
Output:
OR
0
1
NOT
OR
1
14
AND
AND
NP-Completeness
15
NP-Completeness
poly-time
NP-Completeness
16
Cook-Levin Theorem
A problem (language) L is NP-hard if every
problem in NP can be reduced to L in
polynomial time.
That is, for each language M in NP, we can
take an input x for M, transform it in
polynomial time to an input x for L such that
x is in M if and only if x is in L.
L is NP-complete if its in NP and is NP-hard.
NP
NP-Completeness
CIRCUIT-SAT is NP-complete.
We already showed it is in NP.
To prove it is NP-hard, we have to show that every
language in NP can be reduced to it.
Let M be in NP, and let x be an input for M.
Let y be a certificate that allows us to verify membership in M in
polynomial time, p(n), by some algorithm D.
Let S be a circuit of size at most O(p(n)2) that simulates a
computer (details omitted)
NP
L
17
poly-time
NP-Completeness
CIRCUIT-SAT
18
Graphs
6/3/2002 1:41 PM
Some Thoughts
about P and NP
Cook-Levin Proof
We can build a circuit that simulates the verification of xs
membership in M using y.
Inputs
D
Let W be the working storage
for D (including registers,
such as program counter); let
D be given in RAM machine < p(n) W
cells
code.
S
Simulate p(n) steps of D by
replicating circuit S for each
y
step of D. Only input: y.
Circuit is satisfiable if and only
n x
if x is accepted by D with
some certificate y
Total size is still polynomial:
O(p(n)3).
NP-Completeness
W
S
Output
0/1
from D
p(n)
steps
19
NP
CIRCUIT-SAT
NP-complete
problems live here
Belief: P is a proper subset of NP.
Implication: the NP-complete problems are the hardest in NP.
Why: Because if we could solve an NP-complete problem in
polynomial time, we could solve every problem in NP in polynomial
time.
That is, if an NP-complete problem is solvable in polynomial time,
then P=NP.
Since so many people have attempted without success to find
polynomial-time solutions to NP-complete problems, showing your
problem is NP-complete is equivalent to showing that a lot of smart
people have worked on your problem and found no polynomialtime algorithm.
NP-Completeness
20
Graphs
6/4/2002 3:44 PM
Outline and Reading
Definitions (13.1-2)
NP-Completeness (2)
x1
x1
x2
x2
12
x3
x3
x4
22
x4
Some NP-complete problems (13.3)
32
11
13
21
23
31
33
NP-Completeness
NP-Completeness
If AB and BC, then AC.
CIRCUIT-SAT is in NP
For every M in NP, MCIRCUIT-SAT.
Types of reductions:
Output:
1
0
NP-Completeness
SAT
NP-Completeness
Reduce CIRCUIT-SAT to SAT.
(a+b+d+e)(a+c)(b+c+d+e)(a+c+e)
OR: +, AND: (times), NOT:
SAT: Given a Boolean formula S, is S
satisfiable, that is, can we assign 0s and 1s
to the variables so that S is 1 (true)?
SAT is NP-complete
A Boolean formula is a formula where the
variables and operations are Boolean (0/1):
Local replacement: Show AB by dividing an input to A into
components and show how each component can be converted
to a component for B.
Component design: Show AB by building special
components for an input of B that enforce properties needed
for A, such as choice or evaluate.
An input x for A can be converted to x for B, such that x is in A
if and only if x is in B. Likewise, for B to C.
Convert x into x for C such that x is in B iff x is in C.
Hence, if x is in A, x is in B, and x is in C.
Likewise, if x is in C, x is in B, and x is in A.
Thus, AC, since polynomial-time is closed under composition.
Denote this by ML.
A problem (language) L is NP-hard if every problem in
NP is polynomial-time reducible to L.
A problem (language) is NP-complete if it is in NP and
Inputs:
it is NP-hard.
0
1
0
CIRCUIT-SAT is NP-complete:
1
Transitivity of Reducibility
A language M is polynomial-time reducible to a
language L if an instance x for M can be transformed in
polynomial time to an instance x for L such that x is in M
if and only if x is in L.
Problem reduction
CNF-SAT and 3SAT
Vertex Cover
Clique
Hamiltonian Cycle
Problem Reduction
NP is the set of all problems (languages) that can be
accepted non-deterministically (using choose
operation) in polynomial time.
verified in polynomial-time given a certificate y.
Inputs:
Easy to see that CNF-SAT is in NP:
Non-deterministically choose an assignment of 0s and
1s to the variables and then evaluate each clause. If
they are all 1 (true), then the formula is satisfiable.
NP-Completeness
Example: m((a+b)e)(cf)(dg)(eh)(efi)
a
b
d
5
Given a Boolean circuit, make a variable for every
input and gate.
Create a sub-formula for each gate, characterizing
its effect. Form the formula as the output variable
AND-ed with all these sub-formulas:
h
i
The formula is satisfiable
if and only if the
Boolean circuit
m
is satisfiable.
Output:
NP-Completeness
Graphs
6/4/2002 3:44 PM
3SAT
Vertex Cover
The SAT problem is still NP-complete even if
the formula is a conjunction of disjuncts, that
is, it is in conjunctive normal form (CNF).
The SAT problem is still NP-complete even if
it is in CNF and every clause has just 3 literals
(a variable or its negation):
A vertex cover of graph G=(V,E) is a subset W of V, such
that, for every edge (a,b) in E, a is in W or b is in W.
VERTEX-COVER: Given an graph G and an integer K, is
does G have a vertex cover of size at most K?
(a+b+d)(a+c+e)(b+d+e)(a+c+e)
Reduction from SAT (See 13.3.1).
NP-Completeness
Vertex-Cover is NP-complete
Vertex-Cover is NP-complete
Reduce 3SAT to VERTEX-COVER.
Let S be a Boolean formula in CNF with each clause
having 3 literals.
For each variable x, create a node for x and x,
and connect these two:
x
x
For each clause (a+b+c), create a triangle and
connect these three nodes.
a
12
11
22
13
21
NP-Completeness
31
NP-Completeness
b
10
Clique
A clique of a graph G=(V,E) is a subgraph C that is
fully-connected (every pair in C has an edge).
CLIQUE: Given a graph G and an integer K, is there a
clique in G of size at least K?
This graph has
a clique of size 5
32
23
c
9
Example: (a+b+c)(a+b+c)(b+c+d)
Graph has vertex cover of size K=4+6=10 iff formula is
satisfiable.
b
Vertex-Cover is NP-complete
Completing the construction
Connect each literal in a clause triangle to its copy
in a variable pair.
E.g., a clause (x+y+z)
Let n=# of variables
Let m=# of clauses
Set K=n+2m
NP-Completeness
VERTEX-COVER is in NP: Non-deterministically choose a
subset W of size K and check that every edge is covered
NP-Completeness
8
by W.
33
11
CLIQUE is in NP: non-deterministically choose a
subset C of size K and check that every pair in C has
an edge in G.
NP-Completeness
12
Graphs
6/4/2002 3:44 PM
Some Other
NP-Complete Problems
CLIQUE is NP-Complete
Reduction from VERTEX-COVER.
A graph G has a vertex cover of size K if and only if
its complement has a clique of size n-K.
SET-COVER: Given a collection of m sets, are
there K of these sets whose union is the
same as the whole collection of m sets?
NP-complete by reduction from VERTEX-COVER
SUBSET-SUM: Given a set of integers and a
distinguished integer K, is there a subset of
the integers that sums to K?
G
NP-Completeness
13
NP-complete by reduction from VERTEX-COVER
NP-Completeness
14
Some Other
NP-Complete Problems
0/1 Knapsack: Given a collection of items with
weights and benefits, is there a subset of weight
at most W and benefit at least K?
NP-complete by reduction from SUBSET-SUM
Hamiltonian-Cycle: Given an graph G, is there a
cycle in G that visits each vertex exactly once?
NP-complete by reduction from VERTEX-COVER
Traveling Saleperson Tour: Given a complete
weighted graph G, is there a cycle that visits each
vertex and has total cost at most K?
NP-complete by reduction from Hamiltonian-Cycle.
NP-Completeness
15
Graphs
6/7/2002 11:50 AM
Outline and Reading
Approximation Algorithms for NP-Complete
Problems (13.4)
Approximation Algorithms
Approximation Algorithms
Approximation ratios
Polynomial-Time Approximation Schemes (13.4.1)
2-Approximation for Vertex Cover (13.4.2)
2-Approximation for TSP special case (13.4.3)
Log n-Approximation for Set Cover (13.4.4)
Approximation Algorithms
Polynomial-Time Approximation
Schemes
Approximation Ratios
Optimization Problems
We have some problem instance x that has many
feasible solutions.
We are trying to minimize (or maximize) some cost
function c(S) for a solution S to x. For example,
Finding a minimum spanning tree of a graph
Finding a smallest vertex cover of a graph
Finding a smallest traveling salesperson tour in a graph
An approximation produces a solution T
T is a k-approximation to the optimal solution OPT
if c(T)/c(OPT) < k (assuming a min. prob.; a
maximization approximation would be the reverse)
Approximation Algorithms
Approximation Algorithms
A 2-Approximation for
Vertex Cover
Vertex Cover
A vertex cover of graph G=(V,E) is a subset W of V,
such that, for every (a,b) in E, a is in W or b is in W.
OPT-VERTEX-COVER: Given an graph G, find a vertex
cover of G with smallest size.
OPT-VERTEX-COVER is NP-hard.
Approximation Algorithms
A problem L has a polynomial-time
approximation scheme (PTAS) if it has a
polynomial-time (1+)-approximation algorithm,
for any fixed >0 (this value can appear in the
running time).
0/1 Knapsack has a PTAS, with a running time
that is O(n3/ ). Please see 13.4.1 in GoodrichTamassia for details.
Every chosen edge e
has both ends in C
But e must be covered
by an optimal cover;
hence, one end of e
must be in OPT
Thus, there is at most
twice as many vertices
in C as in OPT.
That is, C is a 2-approx.
of OPT
Running time: O(m)
Algorithm VertexCoverApprox(G)
Input graph G
Output a vertex cover C for G
C empty set
HG
while H has edges
e H.removeEdge(H.anEdge())
v H.origin(e)
w H.destination(e)
C.add(v)
C.add(w)
for each f incident to v or w
H.removeEdge(f)
return C
Approximation Algorithms
Graphs
6/7/2002 11:50 AM
A 2-Approximation for TSP
Special Case
Special Case of the Traveling
Salesperson Problem
OPT-TSP: Given a complete, weighted graph, find
a cycle of minimum cost that visits each vertex.
OPT-TSP is NP-hard
Special case: edge weights satisfy the triangle
inequality (which is common in many applications):
Euler tour P of MST M
w(a,b) + w(b,c) > w(a,c)
5
a
Output tour T
Approximation Algorithms
A 2-Approximation for TSP
Special Case - Proof
Approximation Algorithms
OPT-SET-COVER: Given a
collection of m sets, find the
smallest number of them
whose union is the same as
the whole collection of m sets?
Euler tour P of MST M
(twice the cost of M)
Approximation Algorithms
Set Cover
The optimal tour is a spanning tour; hence |M|<|OPT|.
The Euler tour P visits each edge of M twice; hence |P|=2|M|
Each time we shortcut a vertex in the Euler Tour we will not increase
the total length, by the triangle inequality (w(a,b) + w(b,c) > w(a,c));
hence, |T|<|P|.
Therefore, |T|<|P|=2|M|<2|OPT|
Output tour T
(at most the cost of P)
Algorithm TSPApprox(G)
Input weighted complete graph G,
satisfying the triangle inequality
Output a TSP tour T for G
M a minimum spanning tree for G
P an Euler tour traversal of M,
starting at some vertex s
T empty list
for each vertex v in P (in traversal order)
if this is vs first appearance in P then
T.insertLast(v)
T.insertLast(s)
return T
OPT-SET-COVER is NP-hard
Greedy approach produces an
O(log n)-approximation
algorithm. See 13.4.4 for
details.
Optimal tour OPT
(at least the cost of MST M)
9
Algorithm SetCoverApprox(G)
Input a collection of sets S1Sm
Output a subcollection C with same union
F {S1,S2,,Sm}
C empty set
U union of S1Sm
while U is not empty
Si set in F with most elements in U
F.remove(Si)
C.add(Si)
Remove all elements in Si from U
return C
Approximation Algorithms
10