1 Priority Queues Priority Queue ADT Applications of Priority Queues
Transcription
1 Priority Queues Priority Queue ADT Applications of Priority Queues
Priority Queues ! ! ! Class #25: Priority Queues & Binary Heaps ! Software Design III (CS 340): M. Allen, 30 March 2015 Many linear data-structures are defined by the relative ordering of entrance/exit In stacks, objects enter and leave in LIFO order In queues, they do so in FIFO order In a priority queue, the order in which objects leave is essentially independent of when they enter ! ! Instead, objects are assigned an “importance value” Whenever we retrieve an object, we get the one that has the highest priority, however this is defined for the given data-type Monday, 30 Mar. 2015" Priority Queue ADT ! ! Allows the ordering we need for priority ! 3. 4. ! ! findMin(): find the object with highest priority ! Assumes that priority is organized smallest-to-largest by comparison (could be implemented in reverse order, too) ! deleteMin(): find object with highest priority, and remove it from the queue at the same time Usual other methods to construct, get size, etc. Monday, 30 Mar. 2015" Software Design III (CS 340)" These sorts of ordered structures are used in many different situations where order is important: ! We then will have basic operations to: 1. insert(): place a new object in the queue ! 2. 2" Applications of Priority Queues In general, we want our objects to be Comparable! ! Software Design III (CS 340)" 3" ! Data compression (Huffman codes) Graph Search (Dijkstra’s shortest-path algorithm) Artificial Intelligence (Heuristic game-tree search) Operating Systems (load balancing, interrupts) Simulation (particle systems, traffic simulation) One example: Find the largest M items in a list of N things ! How do we manage this, if we don’t have enough memory to store all N of the objects in working memory at once? Monday, 30 Mar. 2015" Software Design III (CS 340)" 4" 1 Simple Ordered and Unordered Implementations ! Implementing with an Unsorted Array Two basic possibilities: 1. 2. Keep an unordered list, and return the next by priority (searching to find it whenever needed) Keep the list ordered at all times, and simply return its first element Operation Return Size insert(3) insert(6) insert(1) deleteMin() insert(4) insert(5) insert(2) deleteMin() Ordered public UnsortedPriorityQueue( int capacity ) { values = (T[]) new Comparable[capacity]; ! }! Unordered! 1 2 3 3 3 6 1 3 6 3 ! 3 6! 3 6 1! 1 2 3 6 3 6! 2 3 4 5 4 3 3 2 3 4 4 3 4 public class UnsortedPriorityQueue<T extends Comparable<? super T>> {! private T[] values;! private int size;! 6 5 6 4 5 6 5 6 3 3 3 3 6 6 6 6 ! Simple O(1) insert public void insert( T t ) {! values[size] = t;! size++;! }! public T deleteMin() {! O(n) to int minIndex = 0;! for( int i = 1; i < size; i++ )! if( values[i].compareTo( values[minIndex] ) <= 0 ) ! minIndex = i;! 4! 4 5! 4 5 2! 4 5! T result = values[minIndex];! values[minIndex] = values[size – 1];! size--; ! return result;! find least value Swapping operation to keep array contiguous (since order doesn’t matter, O(1) for this) }! Monday, 30 Mar. 2015" Software Design III (CS 340)" 5" Monday, 30 Mar. 2015" Software Design III (CS 340)" Implementing with a Sorted Array Efficiency and Priority public class UnsortedPriorityQueue<T extends Comparable<? super T>> {! private T[] values;! private int size;! ! public UnsortedPriorityQueue( int capacity ) { values = (T[]) new Comparable[capacity]; ! }! ! public void insert( T element ) {! for ( int i = size – 1; i >= 0; i-- ) {! if ( values[i].compareTo( element ) >= 0 ) {! values[i + 1] = element;! i = -1;! }! else! values[i + 1] = values[i];! size++;! }! public T deleteMin() {! size--; ! return values[size];! }! Monday, 30 Mar. 2015" What we want is that all important operations are as efficient as we can make them ! O(n) work to insert new value at the proper sorted location Simple O(1) to find smallest value Array kept in reverse order (with smallest at end) to reduce work, since no swapping is needed Software Design III (CS 340)" 7" ! 6" Small (and smart) compromise: to achieve overall better performance, we give up the constant-time speed for some operations in order to speed up the other ones, without ever needing linear time for anything Implementation! insert()! find/deleteMin()! Unordered array! O(1)! O(n)! Ordered Array! O(n)! O(1)! GOAL! log n! log n! To achieve this, we will use a tree-based structure Monday, 30 Mar. 2015" Software Design III (CS 340)" 8" 2 Binary Heaps ! A tree-based implementation of a priority queue ! ! ! Binary Heaps A complete binary tree Has the additional heap property: Each node N has a priority value greater than or equal to that of any of its children We will keep nodes ordered by their priority values ! ! Software Design III (CS 340)" 28" 9" Heap Insertion 4" 18" Unlike basic BST: these values can be duplicated (procedure to break ties is up to the implementation) Like basic BST: These values may or may not be distinct from the actual data stored in the nodes Monday, 30 Mar. 2015" ! 4" 9" 19" 11" 4" Heap Property satisfied 4" 4" Heap Property satisfied Monday, 30 Mar. 2015" Heap Property not satisfied (WHY?) 10" Software Design III (CS 340)" 7" 12" 11" 16" 20" 13" 6" 15" 2" ! However, we cannot always insert there: the question is how to preserve the heap-ordering property when we do so Monday, 30 Mar. 2015" 11" 19" 4" 6" 14" 28" 5" 9" 25" 4" 9" Heap Insertion (Bubbling Up) 5" 16" 18" Not a complete binary tree 4" ! 4" Since the heap is a complete tree, the first available spot we could possibly insert is always on the bottom row of the tree, in the first empty spot (reading left to right) 15" 4" Software Design III (CS 340)" 11" 9" 25" 14" 7" 12" 11" 2" 13" 20" An easy solution: 1. 2. Start with the first open spot If added item has higher priority than parent, swap them Monday, 30 Mar. 2015" Software Design III (CS 340)" 12" 3 Heap Insertion (Bubbling Up) Heap Insertion (Bubbling Up) 4" 2" 5" 15" 16" ! 9" 25" 5" 2" 14" 7" 12" 11" 6" 13" 15" 20" 16" Each time we swap, the newly placed parent node has higher priority than the original ! ! Thus, since we started with a heap, all other children have lower priority than new parent too, preserving heap property Monday, 30 Mar. 2015" Software Design III (CS 340)" 13" Heap Removal ! 12" 11" 13" 9" 14" 20" Since we started from the correct place to keep the tree complete, and since we preserved the ordering property, we have a heap again once we are done ! Worst case: O(log n) operations (height of complete tree) Monday, 30 Mar. 2015" Software Design III (CS 340)" ! 14" In order to keep the tree correctly complete, we remove the item from last position and place it in the root 20" 4" 4" 15" 7" 12" 11" 15" 6" 13" 16" 20" We must now turn the structure back into a heap again Monday, 30 Mar. 2015" 14" 6" 3" 3" ! 25" 7" 2" ?" 25" 9" Heap Removal Highest priority item is always at the root, and we can return that object in constant time, O(1) 16" 4" Software Design III (CS 340)" 15" ! 9" 25" 14" 7" 12" 11" 6" 13" 20" Now we must restore the heap ordering property Monday, 30 Mar. 2015" Software Design III (CS 340)" 16" 4 Heap Removal (Bubbling Down) ! Heap Removal (Bubbling Down) To restore the ordering, we simply swap downwards: we swap the parent with highest-priority child, if it has higher priority than the parent ! Using the highest priority (minimum) child value ensures that highest priority item is correctly placed on top 3" 3" 9" 20" 4" 4" 15" 15" 9" 7" 16" 16" 25" 14" 12" 11" Software Design III (CS 340)" 17" Heap Removal (Bubbling Down) ! Worst case is again O(log n) operations 9" 4" Monday, 30 Mar. 2015" 14" 7" 20" 11" 11" 13" Software Design III (CS 340)" Reading: Priority Queues & Heaps (Chapter 6) ! Meet: as usual. ! 18" 6" Monday/Wednesday: regular classroom Friday: CS Lab (16 Wing) Office Hours: Wing 210 ! ! 25" 12" ! ! 16" 14" The fact that we are using the highest priority child as the new parent guarantees it will have higher priority than its children ! 12" 25" Monday, 30 Mar. 2015" 3" 15" 6" This Week When we are done, we have a balanced heap once again ! 7" 13" ! Monday, 30 Mar. 2015" 20" 6" Monday & Tuesday: 5:00–7:00 Thursday: 11:00–1:00 13" Software Design III (CS 340)" 19" Monday, 30 Mar. 2015" Software Design III (CS 340)" 20" 5