CSE373: Data Structures & Algorithms Lecture 9: Priority Queues. Aaron Bauer Winter 2014

Similar documents
CSE373: Data Structures & Algorithms Lecture 9: Priority Queues and Binary Heaps. Nicki Dell Spring 2014

CSE373: Data Structures & Algorithms Lecture 9: Priority Queues and Binary Heaps. Linda Shapiro Spring 2016

CSE373: Data Structures & Algorithms Lecture 12: Amortized Analysis and Memory Locality. Linda Shapiro Winter 2015

CSE373: Data Structures & Algorithms Lecture 12: Amortized Analysis and Memory Locality. Lauren Milne Spring 2015

CSE 373: Data Structures and Algorithms

Adam Blank Lecture 3 Winter 2017 CSE 332. Data Structures and Parallelism

AMORTIZED ANALYSIS. Announcements. CSE 332 Data Abstractions: Priority Queues, Heaps, and a Small Town Barber. Today.

CSE 373: Data Structures and Algorithms More Asympto<c Analysis; More Heaps

CSE 373: Data Structures and Algorithms

Chapter 6 Heaps. Introduction. Heap Model. Heap Implementation

Heap Model. specialized queue required heap (priority queue) provides at least

Priority Queues (Heaps)

CSE 332: Data Structures & Parallelism Lecture 7: Dictionaries; Binary Search Trees. Ruth Anderson Winter 2019

Data Structures Lesson 9

Today s Outline. The One Page Cheat Sheet. Simplifying Recurrences. Set Notation. Set Notation. Priority Queues. O( 2 n ) O( n 3 )

Recall: Properties of B-Trees

Heaps, Heap Sort, and Priority Queues.

Priority Queues. e.g. jobs sent to a printer, Operating system job scheduler in a multi-user environment. Simulation environments

CE 221 Data Structures and Algorithms

CS350: Data Structures Heaps and Priority Queues

Priority Queues. 1 Introduction. 2 Naïve Implementations. CSci 335 Software Design and Analysis III Chapter 6 Priority Queues. Prof.

CSCI2100B Data Structures Heaps

Priority Queues Heaps Heapsort

CSE 332: Data Structures & Parallelism Lecture 3: Priority Queues. Ruth Anderson Winter 2019

Cpt S 223 Fall Cpt S 223. School of EECS, WSU

CSE 332 Autumn 2013: Midterm Exam (closed book, closed notes, no calculators)

CSE 373 Winter 2009: Midterm #1 (closed book, closed notes, NO calculators allowed)

Course Review. Cpt S 223 Fall 2010

CSE373: Data Structures & Algorithms Lecture 11: Implementing Union-Find. Lauren Milne Spring 2015

UNIT III BALANCED SEARCH TREES AND INDEXING

Course Review. Cpt S 223 Fall 2009

CSE 326: Data Structures Lecture #4 Heaps more Priority Qs. Today s Outline

Priority Queues and Binary Heaps. See Chapter 21 of the text, pages

/633 Introduction to Algorithms Lecturer: Michael Dinitz Topic: Priority Queues / Heaps Date: 9/27/17

Figure 1: A complete binary tree.

CSE 332 Winter 2015: Midterm Exam (closed book, closed notes, no calculators)

Priority Queues and Binary Heaps. See Chapter 21 of the text, pages

CSE 373 Autumn 2010: Midterm #1 (closed book, closed notes, NO calculators allowed)

CSE 326: Data Structures Splay Trees. James Fogarty Autumn 2007 Lecture 10

Priority Queues (Heaps)

3. Priority Queues. ADT Stack : LIFO. ADT Queue : FIFO. ADT Priority Queue : pick the element with the lowest (or highest) priority.

Adam Blank Lecture 1 Winter 2017 CSE 332. Data Abstractions

CSE373: Data Structure & Algorithms Lecture 18: Comparison Sorting. Dan Grossman Fall 2013

CSE 332 Spring 2013: Midterm Exam (closed book, closed notes, no calculators)

Binary Heaps. COL 106 Shweta Agrawal and Amit Kumar

Outline for Today. Why could we construct them in time O(n)? Analyzing data structures over the long term.

CSE 332 Spring 2014: Midterm Exam (closed book, closed notes, no calculators)

CSE332: Data Abstractions Lecture 4: Priority Queues; Heaps. James Fogarty Winter 2012

CMSC 341 Priority Queues & Heaps. Based on slides from previous iterations of this course

CSE 332: Data Structures & Parallelism Lecture 12: Comparison Sorting. Ruth Anderson Winter 2019

CSE 373: Floyd s buildheap algorithm; divide-and-conquer. Michael Lee Wednesday, Feb 7, 2018

Thus, it is reasonable to compare binary search trees and binary heaps as is shown in Table 1.

Figure 1: A complete binary tree.

CS 315 April 1. Goals: Heap (Chapter 6) continued review of Algorithms for Insert DeleteMin. algoritms for decrasekey increasekey Build-heap

CSE 373 Spring 2010: Midterm #1 (closed book, closed notes, NO calculators allowed)

The questions will be short answer, similar to the problems you have done on the homework

Binary Heaps in Dynamic Arrays

How much space does this routine use in the worst case for a given n? public static void use_space(int n) { int b; int [] A;

Priority Queues and Heaps

Programming Abstractions

CSE373: Data Structures & Algorithms Priority Queues

CSE 332, Spring 2010, Midterm Examination 30 April 2010

CSE373: Data Structures & Algorithms Lecture 4: Dictionaries; Binary Search Trees. Kevin Quinn Fall 2015

Learning Goals. CS221: Algorithms and Data Structures Lecture #3 Mind Your Priority Queues. Today s Outline. Back to Queues. Priority Queue ADT

CSE 373 Sample Midterm #2 (closed book, closed notes, calculators o.k.)

Priority Queues Heaps Heapsort

CSE373 Fall 2013, Midterm Examination October 18, 2013

Assume you are given a Simple Linked List (i.e. not a doubly linked list) containing an even number of elements. For example L = [A B C D E F].

CSE373: Data Structure & Algorithms Lecture 21: More Comparison Sorting. Aaron Bauer Winter 2014

Binary heaps (chapters ) Leftist heaps

CSE373: Data Structures & Algorithms Lecture 5: Dictionary ADTs; Binary Trees. Linda Shapiro Spring 2016

Administration CSE 326: Data Structures

CSE332: Data Abstractions Lecture 7: B Trees. James Fogarty Winter 2012

Chapter 2: Basic Data Structures

CSE373: Data Structures & Algorithms Lecture 28: Final review and class wrap-up. Nicki Dell Spring 2014

Wrap up Amortized Analysis; AVL Trees. Riley Porter Winter CSE373: Data Structures & Algorithms

Cpt S 223 Course Overview. Cpt S 223, Fall 2007 Copyright: Washington State University

Data Structures. Giri Narasimhan Office: ECS 254A Phone: x-3748

COMP : Trees. COMP20012 Trees 219

The priority is indicated by a number, the lower the number - the higher the priority.

CMSC 341 Lecture 14: Priority Queues, Heaps

Binary Heaps. CSE 373 Data Structures Lecture 11

Outline for Today. Analyzing data structures over the long term. Why could we construct them in time O(n)? A simple and elegant queue implementation.

Algorithms and Data Structures

Course Review for Finals. Cpt S 223 Fall 2008

Chapter 22 Splay Trees

CSE 373: Data Structures and Algorithms

Treaps. 1 Binary Search Trees (BSTs) CSE341T/CSE549T 11/05/2014. Lecture 19

! Tree: set of nodes and directed edges. ! Parent: source node of directed edge. ! Child: terminal node of directed edge

Section 1: True / False (1 point each, 15 pts total)

Sorting and Searching

UNIVERSITY REGULATIONS

CSE373: Data Structures & Algorithms Lecture 5: Dictionaries; Binary Search Trees. Aaron Bauer Winter 2014

Data Structures Week #8. Heaps (Priority Queues)

Multi-way Search Trees! M-Way Search! M-Way Search Trees Representation!

Advanced Algorithms. Class Notes for Thursday, September 18, 2014 Bernard Moret

Postfix (and prefix) notation

INSTITUTE OF AERONAUTICAL ENGINEERING

Lecture Notes for Advanced Algorithms

Priority Queues. Binary Heaps

Transcription:

CSE373: Data Structures & Algorithms Lecture 9: Priority Queues Aaron Bauer Winter 2014

Midterm On Wednesday, in class Closed book Closed note Closed electronic devices Closed classmate Covers everything up through priority queues and binary heaps does not include AVL tree delete does not include proof AVL tree has logarithmic height 2

Review insert 10 6 2 15 23 20 80 12 18 deletemin 45 3 7 40 60 85 99 700 50 Priority Queue ADT: insert comparable object, deletemin Binary heap data structure: Complete binary tree where each node has priority value greater than its parent O(height-of-tree)=O(log n) insert and deletemin operations insert: put at new last position in tree and percolate-up deletemin: remove root, put last element at root and percolate-down But: tracking the last position is painful and we can do better 3

Array Representation of Binary Trees 1 A From node i: 2 3 B 4 D 5 6 E F 8 9 10 11 12 H I J K L implicit (array) implementation: C 7 G left child: i*2 right child: i*2+1 parent: i/2 (wasting index 0 is convenient for the index arithmetic) A B C D E F G H I J K L 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Winter 2014 CSE373: Data Structures 4 & Algorithms

Pseudocode: insert void insert(int val) { if(size==arr.length-1) resize(); size++; i=percolateup(size,val); arr[i] = val; This pseudocode uses ints. In real use, you will have data nodes with priorities. int percolateup(int hole, int val) { while(hole > 1 && val < arr[hole/2]) arr[hole] = arr[hole/2]; hole = hole / 2; return hole; 10 20 80 40 60 85 99 700 50 10 20 80 40 60 85 99 700 50 0 1 2 3 4 5 6 7 8 9 10 11 12 13 5

Pseudocode: deletemin int deletemin() { if(isempty()) throw ans = arr[1]; hole = percolatedown (1,arr[size]); arr[hole] = arr[size]; size--; return ans; 40 700 50 20 60 10 85 80 99 10 20 80 40 60 85 99 700 50 This pseudocode uses ints. In real use, you will have data nodes with priorities. int percolatedown(int hole, int val) { while(2*hole <= size) { left = 2*hole; right = left + 1; if(right > size arr[left] < arr[right]) target = left; else target = right; if(arr[target] < val) { arr[hole] = arr[target]; hole = target; else break; return hole; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 6

Example 1. insert: 16, 32, 4, 67, 105, 43, 2 2. deletemin 0 1 2 3 4 5 6 7 7

Example 1. insert: 16, 32, 4, 67, 105, 43, 2 2. deletemin 16 0 1 2 3 4 5 6 7 16 8

Example 1. insert: 16, 32, 4, 67, 105, 43, 2 2. deletemin 16 32 0 1 2 3 4 5 6 7 16 32 9

Example 1. insert: 16, 32, 4, 67, 105, 43, 2 2. deletemin 4 32 16 0 1 2 3 4 5 6 7 4 32 16 10

Example 1. insert: 16, 32, 4, 67, 105, 43, 2 2. deletemin 4 32 16 67 0 1 2 3 4 5 6 7 4 32 16 67 11

Example 1. insert: 16, 32, 4, 67, 105, 43, 2 2. deletemin 4 32 16 67 105 0 1 2 3 4 5 6 7 4 32 16 67 105 12

Example 1. insert: 16, 32, 4, 67, 105, 43, 2 2. deletemin 4 32 16 67 105 43 0 1 2 3 4 5 6 7 4 32 16 67 105 43 13

Example 1. insert: 16, 32, 4, 67, 105, 43, 2 2. deletemin 2 32 4 67 105 43 16 0 1 2 3 4 5 6 7 2 32 4 67 105 43 16 14

Other operations decreasekey: given pointer to object in priority queue (e.g., its array index), lower its priority value by p Change priority and percolate up increasekey: given pointer to object in priority queue (e.g., its array index), raise its priority value by p Change priority and percolate down remove: given pointer to object in priority queue (e.g., its array index), remove it from the queue decreasekey with p =, then deletemin Running time for all these operations? 15

Build Heap Suppose you have n items to put in a new (empty) priority queue Call this operation buildheap n inserts works Only choice if ADT doesn t provide buildheap explicitly O(n log n) Why would an ADT provide this unnecessary operation? Convenience Efficiency: an O(n) algorithm called Floyd s Method Common issue in ADT design: how many specialized operations 16

Floyd s Method 1. Use n items to make any complete tree you want That is, put them in array indices 1,,n 2. Treat it as a heap and fix the heap-order property Bottom-up: leaves are already in heap order, work up toward the root one level at a time void buildheap() { for(i = size/2; i>0; i--) { val = arr[i]; hole = percolatedown(i,val); arr[hole] = val; 17

Example In tree form for readability Purple for node not less than descendants 12 heap-order problem 5 11 Notice no leaves are purple Check/fix each non-leaf bottom-up (6 steps here) 3 10 2 9 4 8 1 7 6 18

Example 12 Step 1 12 5 11 5 11 3 10 2 9 3 10 2 9 4 8 1 7 6 4 8 1 7 6 Happens to already be less than children (er, child) 19

Example 12 Step 2 12 5 11 5 11 3 10 2 9 3 1 2 9 4 8 1 7 6 4 8 10 7 6 Percolate down (notice that moves 1 up) 20

Example 12 Step 3 12 5 11 5 11 3 1 2 9 3 1 2 9 4 8 10 7 6 4 8 10 7 6 Another nothing-to-do step 21

Example 12 Step 4 12 5 11 5 2 3 1 2 9 3 1 6 9 4 8 10 7 6 4 8 10 7 11 Percolate down as necessary (steps 4a and 4b) 22

Example 12 Step 5 12 5 2 1 2 3 1 6 9 3 5 6 9 4 8 10 7 11 4 8 10 7 11 23

Example 12 Step 6 1 1 2 3 2 3 5 6 9 4 5 6 9 4 8 10 7 11 12 8 10 7 11 24

But is it right? Seems to work Let s prove it restores the heap property (correctness) Then let s prove its running time (efficiency) void buildheap() { for(i = size/2; i>0; i--) { val = arr[i]; hole = percolatedown(i,val); arr[hole] = val; 25

Correctness void buildheap() { for(i = size/2; i>0; i--) { val = arr[i]; hole = percolatedown(i,val); arr[hole] = val; Loop Invariant: For all j>i, arr[j] is less than its children True initially: If j > size/2, then j is a leaf Otherwise its left child would be at position > size True after one more iteration: loop body and percolatedown make arr[i] less than children without breaking the property for any descendants So after the loop finishes, all nodes are less than their children 26

Efficiency void buildheap() { for(i = size/2; i>0; i--) { val = arr[i]; hole = percolatedown(i,val); arr[hole] = val; Easy argument: buildheap is O(n log n) where n is size size/2 loop iterations Each iteration does one percolatedown, each is O(log n) This is correct, but there is a more precise ( tighter ) analysis of the algorithm 27

Efficiency Better argument: buildheap is O(n) where n is size size/2 total loop iterations: O(n) 1/2 the loop iterations percolate at most 1 step 1/4 the loop iterations percolate at most 2 steps 1/8 the loop iterations percolate at most 3 steps void buildheap() { for(i = size/2; i>0; i--) { val = arr[i]; hole = percolatedown(i,val); arr[hole] = val; ((1/2) + (2/4) + (3/8) + (4/16) + (5/32) + ) < 2 (page 4 of Weiss) So at most 2(size/2) total percolate steps: O(n) 28

Lessons from buildheap Without buildheap, our ADT already let clients implement their own in O(n log n) worst case Worst case is inserting lower priority values later By providing a specialized operation internal to the data structure (with access to the internal data), we can do O(n) worst case Intuition: Most data is near a leaf, so better to percolate down Can analyze this algorithm for: Correctness: Non-trivial inductive proof using loop invariant Efficiency: First analysis easily proved it was O(n log n) Tighter analysis shows same algorithm is O(n) 29

Other branching factors d-heaps: have d children instead of 2 Makes heaps shallower, useful for heaps too big for memory (or cache) Homework: Implement a 3-heap Just have three children instead of 2 Still use an array with all positions from 1 heap-size used Index Children Indices 1 2,3,4 2 5,6,7 3 8,9,10 4 11,12,13 5 14,15,16 30

What we are skipping merge: given two priority queues, make one priority queue How might you merge binary heaps: If one heap is much smaller than the other? If both are about the same size? Different pointer-based data structures for priority queues support logarithmic time merge operation (impossible with binary heaps) Leftist heaps, skew heaps, binomial queues Worse constant factors Trade-offs! 31

Amortized Recall our plain-old stack implemented as an array that doubles its size if it runs out of room How can we claim push is O(1) time if resizing is O(n) time? We can t, but we can claim it s an O(1) amortized operation What does amortized mean? When are amortized bounds good enough? How can we prove an amortized bound? Will just do two simple examples Text has more sophisticated examples and proof techniques Idea of how amortized describes average cost is essential 32

Amortized Complexity If a sequence of M operations takes O(M f(n)) time, we say the amortized runtime is O(f(n)) Amortized bound: worst-case guarantee over sequences of operations Example: If any n operations take O(n), then amortized O(1) Example: If any n operations take O(n 3 ), then amortized O(n 2 ) The worst case time per operation can be larger than f(n) As long as the worst case is always rare enough in any sequence of operations Amortized guarantee ensures the average time per operation for any sequence is O(f(n)) 33

Building Up Credit Can think of preceding cheap operations as building up credit that can be used to pay for later expensive operations Because any sequence of operations must be under the bound, enough cheap operations must come first Else a prefix of the sequence, which is also a sequence, would violate the bound 34

Example #1: Resizing stack A stack implemented with an array where we double the size of the array if it becomes full Claim: Any sequence of push/pop/isempty is amortized O(1) Need to show any sequence of M operations takes time O(M) Recall the non-resizing work is O(M) (i.e., M*O(1)) The resizing work is proportional to the total number of element copies we do for the resizing So it suffices to show that: After M operations, we have done < 2M total element copies (So average number of copies per operation is bounded by a constant) 35

Amount of copying After M operations, we have done < 2M total element copies Let n be the size of the array after M operations Then we have done a total of: n/2 + n/4 + n/8 + INITIAL_SIZE < n element copies Because we must have done at least enough push operations to cause resizing up to size n: So M n/2 2M n > number of element copies 36

Other approaches If array grows by a constant amount (say 1000), operations are not amortized O(1) After O(M) operations, you may have done Θ(M 2 ) copies If array shrinks when 1/2 empty, operations are not amortized O(1) Terrible case: pop once and shrink, push once and grow, pop once and shrink, If array shrinks when 3/4 empty, it is amortized O(1) Proof is more complicated, but basic idea remains: by the time an expensive operation occurs, many cheap ones occurred 37

Example #2: Queue with two stacks A clever and simple queue implementation using only stacks class Queue<E> { Stack<E> in = new Stack<E>(); Stack<E> out = new Stack<E>(); void enqueue(e x){ in.push(x); E dequeue(){ if(out.isempty()) { while(!in.isempty()) { out.push(in.pop()); return out.pop(); enqueue: A, B, C C B A in out 38

Example #2: Queue with two stacks A clever and simple queue implementation using only stacks class Queue<E> { Stack<E> in = new Stack<E>(); Stack<E> out = new Stack<E>(); void enqueue(e x){ in.push(x); E dequeue(){ if(out.isempty()) { while(!in.isempty()) { out.push(in.pop()); return out.pop(); dequeue in B C out A 39

Example #2: Queue with two stacks A clever and simple queue implementation using only stacks class Queue<E> { Stack<E> in = new Stack<E>(); Stack<E> out = new Stack<E>(); void enqueue(e x){ in.push(x); E dequeue(){ if(out.isempty()) { while(!in.isempty()) { out.push(in.pop()); return out.pop(); enqueue D, E E D in B C out A 40

Example #2: Queue with two stacks A clever and simple queue implementation using only stacks class Queue<E> { Stack<E> in = new Stack<E>(); Stack<E> out = new Stack<E>(); void enqueue(e x){ in.push(x); E dequeue(){ if(out.isempty()) { while(!in.isempty()) { out.push(in.pop()); return out.pop(); dequeue twice E D in out C B A 41

Example #2: Queue with two stacks A clever and simple queue implementation using only stacks class Queue<E> { Stack<E> in = new Stack<E>(); Stack<E> out = new Stack<E>(); void enqueue(e x){ in.push(x); E dequeue(){ if(out.isempty()) { while(!in.isempty()) { out.push(in.pop()); return out.pop(); dequeue again D C B A E in out 42

Correctness and usefulness If x is enqueued before y, then x will be popped from in later than y and therefore popped from out sooner than y So it is a queue Example: Wouldn t it be nice to have a queue of t-shirts to wear instead of a stack (like in your dresser)? So have two stacks in: stack of t-shirts go after you wash them out: stack of t-shirts to wear if out is empty, reverse in into out 43

Analysis dequeue is not O(1) worst-case because out might be empty and in may have lots of items But if the stack operations are (amortized) O(1), then any sequence of queue operations is amortized O(1) The total amount of work done per element is 1 push onto in, 1 pop off of in, 1 push onto out, 1 pop off of out When you reverse n elements, there were n earlier O(1) enqueue operations to average with 44

Amortized useful? When the average per operation is all we care about (i.e., sum over all operations), amortized is perfectly fine This is the usual situation If we need every operation to finish quickly (e.g., in a web server), amortized bounds may be too weak While amortized analysis is about averages, we are averaging cost-per-operation on worst-case input Contrast: Average-case analysis is about averages across possible inputs. Example: if all initial permutations of an array are equally likely, then quicksort is O(n log n) on average even though on some inputs it is O(n 2 )) 45

Not always so simple Proofs for amortized bounds can be much more complicated Example: Splay trees are dictionaries with amortized O(log n) operations No extra height field like AVL trees See Chapter 4.5 if curious For more complicated examples, the proofs need much more sophisticated invariants and potential functions to describe how earlier cheap operations build up energy or money to pay for later expensive operations See Chapter 11 if curious But complicated proofs have nothing to do with the code! 46