Vous êtes sur la page 1sur 69

Algorithms R OBERT S EDGEWICK | K EVIN W AYNE

2.4 P RIORITY Q UEUES


API and elementary implementations
binary heaps
heapsort
Algorithms
event-driven simulation
F O U R T H E D I T I O N

R OBERT S EDGEWICK | K EVIN W AYNE

http://algs4.cs.princeton.edu
2.4 P RIORITY Q UEUES
API and elementary implementations
binary heaps
heapsort
Algorithms
event-driven simulation

R OBERT S EDGEWICK | K EVIN W AYNE

http://algs4.cs.princeton.edu
Collections

A collection is a data types that store groups of items.

data type key operations data structure

stack PUSH, POP linked list, resizing array

queue ENQUEUE, DEQUEUE linked list, resizing array

priority queue INSERT, DELETE-MAX binary heap

symbol table PUT, GET, DELETE BST, hash table

set ADD, CONTAINS, DELETE BST, hash table

Show me your code and conceal your data structures, and I shall
continue to be mystified. Show me your data structures, and I won't
usually need your code; it'll be obvious. Fred Brooks

3
Priority queue

Collections. Insert and delete items. Which item to delete?

Stack. Remove the item most recently added.


Queue. Remove the item least recently added.
Randomized queue. Remove a random item.

Priority queue. Remove the largest (or smallest) item.

return contents
operation argument value size (unordered)

insert P 1 P P
insert Q 2 P Q P
insert E 3 P Q E E
remove max Q 2 P E E
insert X 3 P E X E
insert A 4 P E X A A
insert M 5 P E X A M A
remove max X 4 P E M A A
insert P 5 P E M A P A
insert L 6 P E M A P L A
insert E 7 P E M A P L E A
remove max P 6 E M A P L E A
4
Priority queue API

Requirement. Generic items are Comparable.

Key must be Comparable


(bounded type parameter)

public class MaxPQ<Key extends Comparable<Key>>

MaxPQ() create an empty priority queue

MaxPQ(Key[] a) create a priority queue with given keys

void insert(Key v) insert a key into the priority queue

Key delMax() return and remove the largest key

boolean isEmpty() is the priority queue empty?

Key max() return the largest key

int size() number of entries in the priority queue

5
Priority queue applications

Event-driven simulation. [ customers in a line, colliding particles ]


Numerical computation. [ reducing roundoff error ]
Data compression. [ Huffman codes ]
Graph searching. [ Dijkstra's algorithm, Prim's algorithm ]
Number theory. [ sum of powers ]
Artificial intelligence. [ A* search ]
Statistics. [ online median in data stream ]
Operating systems. [ load balancing, interrupt handling ]
Computer networks. [ web cache ]
Discrete optimization. [ bin packing, scheduling ]
Spam filtering. [ Bayesian spam filter ]

Generalizes: stack, queue, randomized queue.

6
Priority queue client example

Challenge. Find the largest M items in a stream of N items.


Fraud detection: isolate $$ transactions.
NSA monitoring: flag most suspicious documents. N huge, M large

Constraint. Not enough memory to store N items.

% more tinyBatch.txt % java TopM 5 < tinyBatch.txt


Turing 6/17/1990 644.08 Thompson 2/27/2000 4747.08
vonNeumann 3/26/2002 4121.85 vonNeumann 2/12/1994 4732.35
Dijkstra 8/22/2007 2678.40 vonNeumann 1/11/1999 4409.74
vonNeumann 1/11/1999 4409.74 Hoare 8/18/1992 4381.21
Dijkstra 11/18/1995 837.42 vonNeumann 3/26/2002 4121.85
Hoare 5/10/1993 3229.27
vonNeumann 2/12/1994 4732.35
Hoare 8/18/1992 4381.21 sort key
Turing 1/11/2002 66.10
Thompson 2/27/2000 4747.08
Turing 2/11/1991 2156.86
Hoare 8/12/2003 1025.70
vonNeumann 10/13/1993 2520.97
Dijkstra 9/10/2000 708.95
Turing 10/12/1993 3532.36
Hoare 2/10/2005 4050.20
7
Priority queue client example

Challenge. Find the largest M items in a stream of N items.


Fraud detection: isolate $$ transactions.
NSA monitoring: flag most suspicious documents. N huge, M large

Constraint. Not enough memory to store N items.

MinPQ<Transaction> pq = new MinPQ<Transaction>();

while (StdIn.hasNextLine())
Transaction data
use a min-oriented pq { type is Comparable
String line = StdIn.readLine(); (ordered by $$)
Transaction item = new Transaction(line);
pq.insert(item);
pq contains
if (pq.size() > M) largest M items
pq.delMin();
}

8
Priority queue client example

Challenge. Find the largest M items in a stream of N items.

implementation time space

sort N log N N

elementary PQ MN M

binary heap N log M M

best in theory N M

order of growth of finding the largest M in a stream of N items

9
Priority queue: unordered and ordered array implementation

return contents contents


operation argument value size (unordered) (ordered)

insert P 1 P P
insert Q 2 P Q P Q
insert E 3 P Q E E P Q
remove max Q 2 P E E P
insert X 3 P E X E P X
insert A 4 P E X A A E P X
insert M 5 P E X A M A E M P X
remove max X 4 P E M A A E M P
insert P 5 P E M A P A E M P P
insert L 6 P E M A P L A E L M P P
insert E 7 P E M A P L E A E E L M P P
remove max P 6 E M A P L E A E E L M P

A sequence of operations on a priority queue

10
Priority queue: unordered array implementation

public class UnorderedArrayMaxPQ<Key extends Comparable<Key>>


{
private Key[] pq; // pq[i] = ith element on pq
private int N; // number of elements on pq

public UnorderedArrayMaxPQ(int capacity) no generic


array creation
{ pq = (Key[]) new Comparable[capacity]; }

public boolean isEmpty()


{ return N == 0; }

public void insert(Key x)


{ pq[N++] = x; }

public Key delMax()


{
int max = 0;
less() and exch()
for (int i = 1; i < N; i++)
similar to sorting methods
if (less(max, i)) max = i;
(but don't pass pq[])
exch(max, N-1);
should null out entry
return pq[--N];
to prevent loitering
}
}

11
Priority queue elementary implementations

Challenge. Implement all operations efficiently.

implementation insert del max max

unordered array 1 N N

ordered array N 1 1

goal log N log N log N

order of growth of running time for priority queue with N items

12
2.4 P RIORITY Q UEUES
API and elementary implementations
binary heaps
heapsort
Algorithms
event-driven simulation

R OBERT S EDGEWICK | K EVIN W AYNE

http://algs4.cs.princeton.edu
Complete binary tree

Binary tree. Empty or node with links to left and right binary trees.

Complete tree. Perfectly balanced, except for bottom level.

complete tree with N = 16 nodes (height = 4)

Property. Height of complete tree with N nodes is lg N.


Pf. Height increases only when N is a power of 2.

14
A complete binary tree in nature

15
Binary heap representations

Binary heap. Array representation of a heap-ordered complete binary tree.

Heap-ordered binary tree.


Keys in nodes.
Parent's key no smaller than
children's keys.
i 0 1 2 3 4 5 6 7 8 9 10 11
a[i] - T S R P N O A E I H G

Array representation. T
S R

Indices start at 1. P N O A
Take nodes in level order.
No explicit links needed! E I H G
1
T
2 S 3 R

4 P 5 N 6 O 7 A

8 E 9 I 10 H 11 G

Heap representations

16
Binary heap properties

Proposition. Largest key is a[1], which is root of binary tree.

Proposition. Can use array indices to move through tree.


Parent of node at k is at k/2.
Children of node at k are at 2k and 2k+1.
i 0 1 2 3 4 5 6 7 8 9 10 11
a[i] - T S R P N O A E I H G

T
S R

P N O A

E I H G
1
T
2 S 3 R

4 P 5 N 6 O 7 A

8 E 9 I 10 H 11 G

Heap representations

17
Binary heap demo

Insert. Add node at end, then swim it up.


Remove the maximum. Exchange root with node at end, then sink it down.

heap ordered

P R

N H O A

E I G

T P R N H O A E I G

18
Binary heap demo

Insert. Add node at end, then swim it up.


Remove the maximum. Exchange root with node at end, then sink it down.

heap ordered

R O

N P G A

E I H

S R O N P G A E I H

19
Promotion in a heap

Scenario. Child's key becomes larger key than its parent's key.

To eliminate the violation:


Exchange key in child with key in parent.
Repeat until heap order restored. S

private void swim(int k) P R

{ N 5 T O A
while (k > 1 && less(k/2, k)) E I H G
violates heap order
(larger key than parent)
{
exch(k, k/2); 1
T
k = k/2;
2
S R
} parent of node at k is at k/2
} N 5 P O A

E I H G

Bottom-up reheapify (swim)

Peter principle. Node promoted to level of incompetence.


20
Insertion in a heap

Insert. Add node at end, then swim it up.


Cost. At most 1 + lg N compares.
insert remo
T

P R

N H O A

public void insert(Key x) E I G S key to insert

{
T
pq[++N] = x;
swim(N); P R

} N H O A

E I G S add key to heap


violates heap order

T
swim up
S R
sink down
N P O A

E I G H

Heap operation

21
Demotion in a heap

Scenario. Parent's key becomes smaller than one (or both) of its children's.

why not smaller child?


To eliminate the violation:
Exchange key in parent with key in larger child.
Repeat until heap order restored.
private void sink(int k) violates heap order
(smaller than a child)
T
{ 2
children of node at k H R
while (2*k <= N)
are 2k and 2k+1 5 S
{ P O A

int j = 2*k; E I N G

if (j < N && less(j, j+1)) j++; T


if (!less(k, j)) break; 2
S R
exch(k, j); 5
P N O A
k = j; 10
E I H G
}
} Top-down reheapify (sink)

Power struggle. Better subordinate promoted.


22
Delete the maximum in a heap

Delete max. Exchange root with node at end, then sink it down.
Cost. At most 2 lg N compares.

insert remove the maximum


T T key to remove

P R S R

N H O A N P O A
public Key delMax()
exchange key
{ E I G S key to insert E I G H with root
Key max = pq[1];
violates
exch(1, N--); T H heap order
sink(1); P R S R
pq[N+1] = null;
N H
prevent loitering
O A N P O A
return max; remove node
E I G S add key to heap E I G T
} violates heap order from heap

T S
swim up
S R P R
sink down
N P O A N H O A

E I G H E I G

Heap operations
23
Binary heap: Java implementation

public class MaxPQ<Key extends Comparable<Key>>


{
private Key[] pq;
private int N;

public MaxPQ(int capacity) fixed capacity


(for simplicity)
{ pq = (Key[]) new Comparable[capacity+1]; }

public boolean isEmpty() PQ ops


{ return N == 0; }
public void insert(Key key)
public Key delMax()
{ /* see previous code */ }

private void swim(int k)


private void sink(int k) heap helper functions
{ /* see previous code */ }

private boolean less(int i, int j)


{ return pq[i].compareTo(pq[j]) < 0; }
private void exch(int i, int j) array helper functions
{ Key t = pq[i]; pq[i] = pq[j]; pq[j] = t; }
}

24
Priority queues implementation cost summary

implementation insert del max max

unordered array 1 N N

ordered array N 1 1

binary heap log N log N 1

order-of-growth of running time for priority queue with N items

25
Binary heap: practical improvements

Half-exchanges in sink and swim.


Reduces number of array accesses.
Worth doing.

1 \
X

26
Binary heap: practical improvements

Floyd's sink-to-bottom trick.


Sink key at root all the way to bottom. 1 compare per node

Swim key back up. some extra compares and exchanges

Fewer compares; more exchanges.


Worthwhile depending on cost of compare and exchange. R. W. Floyd
1978 Turing award

X Y

N O

L K

1 \
E D

27
Binary heap: practical improvements

Multiway heaps.
Complete d-way tree.
Parent's key no smaller than its children's keys.
Swim takes log N compares; sink takes d log N compares.
d d

Sweet spot: d = 4.

Y T G

J X P W I K A B D

E H F R S V C L M Q N O

3-way heap

28
Binary heap: practical improvements

Caching. Binary heap is not cache friendly.

29
n this analysis, we restrict fanout to be a positive power of 2 and element size to be a power of 2. We also re
eap configurations to those in which all of a parents children fit in a single cache block (where ).
Binary
s the values heap:
of that we arepractical
looking at;improvements
for a typical cache block size of 32 bytes, fanout is limited to 4 for 8
elements, and fanout is limited to 8 for 4 byte heap elements. We also restrict our analysis to heap configura
ich the bottom layer of the heap is completely full (where = ).
Caching. Binary heap is not cache friendly.
Heaps are often used in discrete event simulations as a priority queue to store the events. In order to measur
Cache-aligned
rmance of heaps operating as d-heap.
an event queue, we analyze our heaps in the hold model [25]. In the hold m
has been
Funnel heap.
noticed previously that increasing a heaps fanout can reduce the instruction count of its operations [27, Ex. 2
Pg.B-heap.
12, Ex. 7-2 152].


0
block 0 block 1 block 2 block 3
1 2 3 4 0 1 2 3 4 5 6 7 8 9 10 11 12
Siblings
5 6 7 8 9 10 11 12

e 5: The layout of a -heap when four elements fit per cache line and the array is padded to cache-align the

10

30
Priority queues implementation cost summary

implementation insert del max max

unordered array 1 N N

ordered array N 1 1

binary heap log N log N 1

d-ary heap logd N d logd N 1

Fibonacci 1 log N 1

Brodal queue 1 log N 1

impossible 1 1 1 why impossible?

amortized

order-of-growth of running time for priority queue with N items

31
Binary heap considerations

Underflow and overflow.


Underflow: throw exception if deleting from empty PQ.
Overflow: add no-arg constructor and use resizing array.
leads to log N
amortized time per op
Minimum-oriented priority queue. (how to make worst case?)

Replace less() with greater().


Implement greater().
Other operations.
Remove an arbitrary item. can implement efficiently with sink() and swim()

Change the priority of an item.


[ stay tuned for Prim/Dijkstra ]

Immutability of keys.
Assumption: client does not change keys while they're on the PQ.
Best practice: use immutable keys.
32
Immutability: implementing in Java

Data type. Set of values and operations on those values.


Immutable data type. Can't change the data type value once created.

public final class Vector { can't override instance methods


private final int N;
instance variables private and final
private final double[] data;

public Vector(double[] data) {


this.N = data.length;
this.data = new double[N]; defensive copy of mutable
for (int i = 0; i < N; i++) instance variables
this.data[i] = data[i];
}
instance methods don't change
instance variables
}

Immutable. String, Integer, Double, Color, Vector, Transaction, Point2D.


Mutable. StringBuilder, Stack, Counter, Java array.
33
Immutability: properties

Data type. Set of values and operations on those values.


Immutable data type. Can't change the data type value once created.

Advantages.
Simplifies debugging.
Safer in presence of hostile code.
Simplifies concurrent programming.
Safe to use as key in priority queue or symbol table.
Disadvantage. Must create new object for each data type value.

Classes should be immutable unless there's a very good reason


to make them mutable. If a class cannot be made immutable,
you should still limit its mutability as much as possible.
Joshua Bloch (Java architect)

34
2.4 P RIORITY Q UEUES
API and elementary implementations
binary heaps
heapsort
Algorithms
event-driven simulation

R OBERT S EDGEWICK | K EVIN W AYNE

http://algs4.cs.princeton.edu
Sorting with a binary heap

Q. What is this sorting algorithm?

public void sort(String[] a)


{
int N = a.length;
MaxPQ<String> pq = new MaxPQ<String>();
for (int i = 0; i < N; i++)
pq.insert(a[i]);
for (int i = N-1; i >= 0; i--)
a[i] = pq.delMax();
}

Q. What are its properties?


A. N log N, extra array of length N, not stable.

Heapsort intuition. A heap is an array; do sort in place.

36
k(3, 11) exch(1, 9) exch(1, 3)
Heapsort
S
sink(1, 8)
R
sink(1, 2)
E
O X P E A E

T L
Basic A in-place sort. O
R for
plan L E A L M O P

EView input array as a complete


P E M S T X tree.
binary R S T X


k(2, 11)
Heap construction: build a max-heap with all N keys.
exch(1, 8) exch(1, 2)
Sortdown: repeatedly
S remove
sink(1,
P
7) the maximum key.sink(1, 1)
A
T X O E E E

P L R A M L E A L M O P
O E E R S T X R S T X
keys in arbitrary order build max heap sorted result
heap construction
heap construction sortdownsortdown
(in place) (in place)

1
S 1
S exch(1, 7) XO X exch(1,exch(1,
6) 6) M1 A M
sink(1, 6) sink(1,sink(1,
5) 5)
k(1, 211) 2 XO 3 3
O R R T
M T SE S L2 E L E3 E E

TT S
4 4 5 56 7 6 7
T E E
X A X A AP P L
L LRE APR A A4 L A E5 M EO 6 O P O7 P P
9 8 10 9 11 10
P M LL P E R
11
PM L EA M O E E E E R8 S9 R T10S X11T X
R S M T O X R S T X
starting point (arbitrary
starting order) order) starting point (heap-ordered)
starting point (heap-ordered)
O E E point (arbitrary result (sorted)
result (heap-ordered)
sink(5, sink(5, 11)
11) 1 2 3 4 S5 6 7 S8 exch(1,
9 1 2exch(1,
11)
10
3 411511)
6 7T 8 9 T 1 exch(1,
10 11 exch(1, 2 5)3 4 5)
5 6 L
7 8 9 L 10 11

XHeapsort:
A M P constructing
X (left)
T S andP sorting
L R A down
M O (right)
E E a heap
sink(1, sink(1,
10) 10) sink(1,sink(1,
4) 4)
S O R T E L E A E E L M O P R S T X
O O R R P P S S E E E E

T T L L
X A X A O O L LR A R A A A M MO PO P

M P M E P E E E M E M E E X E X R SR TS XT X
37
Heapsort demo

Heap construction. Build max heap using bottom-up method.

we assume array entries are indexed 1 to N

array in arbitrary order

1 S

2 O 3 R

4 T 5 E 6 X 7 A

8 M 9 P 10 L 11 E

S O R T E X A M P L E
1 2 3 4 5 6 7 8 9 10 11
38
Heapsort demo

Sortdown. Repeatedly delete the largest remaining item.

array in sorted order

E E

L M O P

R S T X

A E E L M O P R S T X
1 2 3 4 5 6 7 8 9 10 11
39
sink(5, 11) S exch(1, 11) T
sink(1, 10)
Heapsort: heap construction O R P

T L X A O L R
M P E E M E E X
First pass. Build heap using bottom-up method.
sink(4, 11) S exch(1, 10) S
sink(1, 9)
O R P
for (int k = N/2; k >= 1; k--)
T L X A O L E
sink(a, k, N);
M P E E M E T X

heap construction sortdown


sink(3, 11) S exch(1, 9) R
1
S X exch(1,sink(1,
6) 8)
M
O X sink(1, 5) P
2 3
O R T S L E
T L R A O L E
4 5 6 7
T E X A P L R A A E O P
8 9 10 11 M P E E M S T X
M P L E M O E E R S T X
starting point (arbitrary order) starting point (heap-ordered)
sink(2, 11) S exch(1, 8) P
sink(1, 7)
sink(5, 11) S exch(1, 11)T T X exch(1, 5) O L
sink(1, 10) sink(1, 4)
O R P P L R SA E M L E E
T L X A M OO E LE R A A R SM T O X P
M P E E M E E X R S T X
exch(1, 7) O
sink(1, 11) sink(1, 6)
sink(4, 11) S exch(1, 10) XS exch(1, 4)
sink(1, 9) sink(1, 3)
M E
O R TP SR A A L E E
L PO LL RE AA
T X A L R SM T O X P
P E E MM OE ET EX S T X
M R
result (heap-ordered)
Heapsort: constructing (left) and sorting down
40
Heapsort: sortdown
heap construction sortdown

Second pass. 1
S X exch(1, 6)
sink(1, 5)
M
2 3

Remove the maximum, one at a time.


O R T S L E
4 5 6 7
T E X A P L R A A E O P

Leave in array, instead of nulling out.


8 9 10 11
M P L E M O E E R S T X
starting point (arbitrary order) starting point (heap-ordered)

sink(5, 11) S exch(1, 11) T exch(1, 5) L


sink(1, 10) sink(1, 4)
O R P S E E

T L X A O L R A A M O P
while (N > 1)
M P E E M E E X R S T X
{
exch(a, 1, N--); sink(4, 11) S exch(1, 10)
sink(1, 9)
S exch(1, 4)
sink(1, 3)
E
O R P R A E
sink(a, 1, N); L X A L E A M O P
T O L
} M P E E M E T X R S T X

sink(3, 11) S exch(1, 9) R exch(1, 3) E


sink(1, 8) sink(1, 2)
O X P E A E

T L R A O L E A L M O P
M P E E M S T X R S T X

sink(2, 11) S exch(1, 8) P exch(1, 2) A


sink(1, 7) sink(1, 1)
T X O E E E

P L R A M L E A L M O P
M O E E R S T X R S T X

exch(1, 7) O 1
A
sink(1, 11) sink(1, 6)
X 2 3
M E E E
T S 4 5 6 7
A L E P L M O P
P L R A 8 9 10 11
R S T X R S T X
M O E E result (sorted)
result (heap-ordered) 41
Heapsort: constructing (left) and sorting down (right) a heap
Heapsort: Java implementation

public class Heap


{
public static void sort(Comparable[] a)
{
int N = a.length;
for (int k = N/2; k >= 1; k--)
sink(a, k, N);
while (N > 1)
{
exch(a, 1, N);
sink(a, 1, --N);
}
}
but make static (and pass arguments)

private static void sink(Comparable[] a, int k, int N)


{ /* as before */ }

private static boolean less(Comparable[] a, int i, int j)


{ /* as before */ }

private static void exch(Object[] a, int i, int j)


{ /* as before */ }
but convert from 1-based
} indexing to 0-base indexing

42
Heapsort: trace

a[i]
N k 0 1 2 3 4 5 6 7 8 9 10 11
initial values S O R T E X A M P L E
11 5 S O R T L X A M P E E
11 4 S O R T L X A M P E E
11 3 S O X T L R A M P E E
11 2 S T X P L R A M O E E
11 1 X T S P L R A M O E E
heap-ordered X T S P L R A M O E E
10 1 T P S O L R A M E E X
9 1 S P R O L E A M E T X
8 1 R P E O L E A M S T X
7 1 P O E M L E A R S T X
6 1 O M E A L E P R S T X
5 1 M L E A E O P R S T X
4 1 L E E A M O P R S T X
3 1 E A E L M O P R S T X
2 1 E A E L M O P R S T X
1 1 A E E L M O P R S T X
sorted result A E E L M O P R S T X

Heapsort trace (array contents just after each sink)

43
Heapsort: mathematical analysis

Proposition. Heap construction uses 2 N compares and N exchanges.

max number of exchanges


Pf sketch. [assume N = 2h+1 1]
to sink node

2 2

1 1 1 1

0 0 0 0 0 0 0 0

binary heap of height h = 3


a tricky sum
(see COS 340)

h + 2(h 1) + 4(h 2) + 8(h 3) + . . . + 2h (0) 2h+1


= N

44
Heapsort: mathematical analysis

Proposition. Heap construction uses 2 N compares and N exchanges.


Proposition. Heapsort uses 2 N lg N compares and exchanges.

algorithm can be improved to ~ 1 N lg N

Significance. In-place sorting algorithm with N log N worst-case.


Mergesort: no, linear extra space. in-place merge possible, not practical

Quicksort: no, quadratic time in worst case. N log N worst-case quicksort possible,
not practical
Heapsort: yes!

Bottom line. Heapsort is optimal for both time and space, but:
Inner loop longer than quicksorts.
Makes poor use of cache.
Not stable. advanced tricks for improving

45
Introsort

Goal. As fast as quicksort in practice; N log N worst case, in place.

Introsort.
Run quicksort.
Cutoff to heapsort if stack depth exceeds 2 lg N.
Cutoff to insertion sort for N = 16.

In the wild. C++ STL, Microsoft .NET Framework.


46
Sorting algorithms: summary

inplace? stable? best average worst remarks

selection N2 N2 N2 N exchanges

use for small N


insertion N N2 N2
or partially ordered
tight code;
shell N log3 N ? c N 3/2
subquadratic

N log N guarantee;
merge N lg N N lg N N lg N
stable
improves mergesort
timsort N N lg N N lg N
when preexisting order

quick
N log N probabilistic guarantee;
N lg N 2 N ln N N2
fastest in practice
improves quicksort
3-way quick N 2 N ln N N2
when duplicate keys

heap N log N guarantee;


N 2 N lg N 2 N lg N
in-place

? N N lg N N lg N holy sorting grail

47
2.4 P RIORITY Q UEUES
API and elementary implementations
binary heaps
heapsort
Algorithms
event-driven simulation

R OBERT S EDGEWICK | K EVIN W AYNE

http://algs4.cs.princeton.edu
Molecular dynamics simulation of hard discs

Goal. Simulate the motion of N moving particles that behave


according to the laws of elastic collision.

49
Molecular dynamics simulation of hard discs

Goal. Simulate the motion of N moving particles that behave


according to the laws of elastic collision.

Hard disc model.


Moving particles interact via elastic collisions with each other and walls.
Each particle is a disc with known position, velocity, mass, and radius.
No other forces.

temperature, pressure, motion of individual


diffusion constant atoms and molecules

Significance. Relates macroscopic observables to microscopic dynamics.


Maxwell-Boltzmann: distribution of speeds as a function of temperature.
Einstein: explain Brownian motion of pollen grains.

50
Warmup: bouncing balls

Time-driven simulation. N bouncing balls in the unit square.

public class BouncingBalls % java BouncingBalls 100


{
public static void main(String[] args)
{
int N = Integer.parseInt(args[0]);
Ball[] balls = new Ball[N];
for (int i = 0; i < N; i++)
balls[i] = new Ball();
while(true)
{
StdDraw.clear();
for (int i = 0; i < N; i++)
{
balls[i].move(0.5);
balls[i].draw();
}
StdDraw.show(50);
}
} main simulation loop

51
Warmup: bouncing balls

public class Ball


{
private double rx, ry; // position
private double vx, vy; // velocity
private final double radius; // radius
public Ball(...)
{ /* initialize position and velocity */ } check for collision with walls

public void move(double dt)


{
if ((rx + vx*dt < radius) || (rx + vx*dt > 1.0 - radius)) { vx = -vx; }
if ((ry + vy*dt < radius) || (ry + vy*dt > 1.0 - radius)) { vy = -vy; }
rx = rx + vx*dt;
ry = ry + vy*dt;
}
public void draw()
{ StdDraw.filledCircle(rx, ry, radius); }
}

Missing. Check for balls colliding with each other.


Physics problems: when? what effect?
CS problems: which object does the check? too many checks?
52
Time-driven simulation

Discretize time in quanta of size dt.


Update the position of each particle after every dt units of time,
and check for overlaps.
If overlap, roll back the clock to the time of the collision, update the
velocities of the colliding particles, and continue the simulation.

t t + dt t + 2 dt t + t
(collision detected) (roll back clock)

53
Time-driven simulation

Main drawbacks.
~ N 2 / 2 overlap checks per time quantum.
Simulation is too slow if dt is very small.
dt too small: excessive computation
May miss collisions if dt is too large.
(if colliding particles fail to overlap when we are looking)

dt too small: excessive computation dt too large: may miss collisions

dt too large: may miss collisions


Fundamental challenge for
time-driven simulation

54
Event-driven simulation

Change state only when something happens.


Between collisions, particles move in straight-line trajectories.
Focus only on times when collisions occur.
Maintain PQ of collision events, prioritized by time.
Remove the min = get next collision.
Collision prediction. Given position, velocity, and radius of a particle,
when will it collide next with a wall or another particle?

Collision resolution. If collision occurs, update colliding particle(s)


according to laws of elastic collisions.

prediction (at time t)


particles hit unless one passes
intersection point before the other
arrives (see Exercise 3.6.X)

resolution (at time t + dt)


velocities of both particles
change after collision (see Exercise 3.6.X)

Predicting and resolving a particle-particle collision 55


Particle-wall collision

Collision prediction and resolution.


Particle of radius s at position (rx, ry).
Particle moving in unit box with velocity (vx, vy).
Will it collide with a vertical wall? If so, when?

s
resolution (at time t + dt)
velocity after collision = ( vx , vy)
position after collision = ( 1 s , ry + vydt)
prediction (at time t)
dt ! time to hit wall
wall at
= distance/velocity (rx , ry )
x=1
= (1 s rx )/vx vy
vx
1 s rx

Predicting and resolving a particle-wall collision

56
Particle-particle collision prediction

Collision prediction.
Particle i: radius s , position (rx , ry ), velocity (vx , vy ).
i i i i i

Particle j: radius s , position (rx , ry ), velocity (vx , vy ).


j j j j j

Will particles i and j collide? If so, when?


(vxi', vyi')

(vxj', vyj')
mi

si (vxi , vyi )

(rxi , ryi)
(rxi', ryi')

i
time = t time = t + t

(vxj , vyj)

sj

57
Particle-particle collision prediction

Collision prediction.
Particle i: radius s , position (rx , ry ), velocity (vx , vy ).
i i i i i

Particle j: radius s , position (rx , ry ), velocity (vx , vy ).


j j j j j

Will particles i and j collide? If so, when?


if v r 0
t = if d < 0
v r + d
- v v
otherwise

d = (v r)2 (v v) (r r 2 ) = i + j

v v = (vx)2 + (vy)2
v = (vx, vy) = (vxi vx j , vyi vy j )
r = (rx, ry) = (rxi rx j , ryi ry j ) r r = (rx)2 + (ry)2
v r = (vx)(rx) + (vy)(ry)


Important note: This is physics, so we wont be testing you on it!
58
Particle-particle collision resolution

Collision resolution. When two particles collide, how does velocity change?

vxi vxii + =Jx vx


= / mi i + Jx / mi
vyi vyii + =Jy /vymi i + Jy / mi
= vy Newton's second law

vx j = vx j =Jx vx
(momentum form)
/ mj j Jx / m j

j vx j =Jy vx
vy = vy j / mj Jy / m j
j

J rx J ry 2 mi m j (v r)
Jx = , Jy = , J =
(mi + m j )
impulse due to normal force
(conservation of energy, conservation of momentum)


Important note: This is physics, so we wont be testing you on it!
59
Particle data type skeleton

public class Particle


{
private double rx, ry; // position
private double vx, vy; // velocity
private final double radius; // radius
private final double mass; // mass
private int count; // number of collisions

public Particle(...) { }

public void move(double dt) { }


public void draw() { }

public double timeToHit(Particle that) { } predict collision


public double timeToHitVerticalWall() { } with particle or wall
public double timeToHitHorizontalWall() { }
resolve collision
public void bounceOff(Particle that) { }
with particle or wall
public void bounceOffVerticalWall() { }
public void bounceOffHorizontalWall() { }

60
Particle-particle collision and resolution implementation

public double timeToHit(Particle that)


{
if (this == that) return INFINITY;
double dx = that.rx - this.rx, dy = that.ry - this.ry;
double dvx = that.vx - this.vx; dvy = that.vy - this.vy;
double dvdr = dx*dvx + dy*dvy;
if( dvdr > 0) return INFINITY; no collision
double dvdv = dvx*dvx + dvy*dvy;
double drdr = dx*dx + dy*dy;
double sigma = this.radius + that.radius;
double d = (dvdr*dvdr) - dvdv * (drdr - sigma*sigma);
if (d < 0) return INFINITY;
return -(dvdr + Math.sqrt(d)) / dvdv;
}

public void bounceOff(Particle that)


{
double dx = that.rx - this.rx, dy = that.ry - this.ry;
double dvx = that.vx - this.vx, dvy = that.vy - this.vy;
double dvdr = dx*dvx + dy*dvy;
double dist = this.radius + that.radius;
double J = 2 * this.mass * that.mass * dvdr / ((this.mass + that.mass) * dist);
double Jx = J * dx / dist;
double Jy = J * dy / dist;
this.vx += Jx / this.mass;
this.vy += Jy / this.mass;
that.vx -= Jx / that.mass;
that.vy -= Jy / that.mass;
this.count++;
that.count++; Important note: This is physics, so we wont be testing you on it!
}
61
Collision system: event-driven simulation main loop

two particles on a collision course


Initialization.
Fill PQ with all potential particle-wall collisions.
Fill PQ with all potential particle-particle collisions.
third particle interferes: no collision
potential since collision may not happen if
some other collision intervenes

An invalidated event

Main loop.
Delete the impending event from PQ (min priority = t).
If the event has been invalidated, ignore it.
Advance all particles to time t, on a straight-line trajectory.
Update the velocities of the colliding particle(s).
Predict future particle-wall and particle-particle collisions involving the
colliding particle(s) and insert events onto PQ.

62
Event data type

Conventions.

Neither particle null particle-particle collision.

One particle null particle-wall collision.

Both particles null redraw event.

private class Event implements Comparable<Event>


{
private double time; // time of event
private Particle a, b; // particles involved in event
private int countA, countB; // collision counts for a and b

public Event(double t, Particle a, Particle b) { } create event

public int compareTo(Event that) ordered by time


{ return this.time - that.time; }
invalid if
public boolean isValid() intervening
{ } collision
}

63
Collision system implementation: skeleton

public class CollisionSystem


{
private MinPQ<Event> pq; // the priority queue
private double t = 0.0; // simulation clock time
private Particle[] particles; // the array of particles

public CollisionSystem(Particle[] particles) { }

private void predict(Particle a) add to PQ all particle-wall and particle-


{ particle collisions involving this particle
if (a == null) return;
for (int i = 0; i < N; i++)
{
double dt = a.timeToHit(particles[i]);
pq.insert(new Event(t + dt, a, particles[i]));
}
pq.insert(new Event(t + a.timeToHitVerticalWall() , a, null));
pq.insert(new Event(t + a.timeToHitHorizontalWall(), null, a));
}

private void redraw() { }

public void simulate() { /* see next slide */ }


}

64
Collision system implementation: main event-driven simulation loop

public void simulate()


{
pq = new MinPQ<Event>(); initialize PQ with
for(int i = 0; i < N; i++) predict(particles[i]); collision events and
pq.insert(new Event(0, null, null)); redraw event

while(!pq.isEmpty())
{
Event event = pq.delMin();
if(!event.isValid()) continue; get next event
Particle a = event.a;
Particle b = event.b;

for(int i = 0; i < N; i++)


update positions
particles[i].move(event.time - t);
and time
t = event.time;

if (a != null && b != null) a.bounceOff(b);


else if (a != null && b == null) a.bounceOffVerticalWall() process event
else if (a == null && b != null) b.bounceOffHorizontalWall();
else if (a == null && b == null) redraw();

predict(a); predict new events


predict(b); based on changes
}
}

65
Particle collision simulation example 1

% java CollisionSystem 100

66
Particle collision simulation example 2

% java CollisionSystem < billiards.txt

67
Particle collision simulation example 3

% java CollisionSystem < brownian.txt

68
Particle collision simulation example 4

% java CollisionSystem < diffusion.txt

69

Vous aimerez peut-être aussi