cs221 algorithms and data structures priority queues and
play

CS221: Algorithms and Data Structures Priority Queues and Heaps - PowerPoint PPT Presentation

CS221: Algorithms and Data Structures Priority Queues and Heaps Alan J. Hu (Borrowing slides from Steve Wolfman) 1 Learning Goals After this unit, you should be able to: Provide examples of appropriate applications for priority queues


  1. CS221: Algorithms and Data Structures Priority Queues and Heaps Alan J. Hu (Borrowing slides from Steve Wolfman) 1

  2. Learning Goals After this unit, you should be able to: • Provide examples of appropriate applications for priority queues and heaps • Manipulate data in heaps • Describe and apply the Heapify algorithm, and analyze its complexity 2

  3. Today’s Outline • Trees, Briefly • Priority Queue ADT • Heaps – Implementing Priority Queue ADT – Focus on Create: Heapify – Brief introduction to d-Heaps 3

  4. Tree Terminology A root: leaf: B C child: parent: D E F G sibling: ancestor: descendent: H I subtree: J K L M N 4

  5. Tree Terminology Reference A root: the single node with no parent leaf: a node with no children B C child: a node pointed to by me parent: the node that points to me D E F G sibling: another child of my parent ancestor: my parent or my parent’s ancestor descendent: my child or my child’s descendent H I subtree: a node and its descendents J K L M N We sometimes use degenerate versions of these definitions that allow NULL as the empty tree. (This can be very handy for recursive base cases!) 5

  6. More Tree Terminology A depth: # of edges along path from root to node depth of H? B C D E F G H I J K L M N 6

  7. More Tree Terminology A height: # of edges along longest path from node to leaf or, for whole tree, from root to leaf B C height of tree? D E F G H I J K L M N 7

  8. More Tree Terminology A degree: # of children of a node degree of B? B C D E F G H I J K L M N 8

  9. More Tree Terminology A branching factor: maximum degree of any node in the tree B C 2 for binary trees, our usual concern; D E F G 5 for this weird tree H I J K L M N 9

  10. One More Tree Terminology Slide binary: branching factor of 2 (each child has at most 2 children) A n-ary: branching factor of n B C D E F G complete: “packed” binary tree; as many nodes as H I J possible for its height nearly complete: complete plus some nodes on the left at the bottom 10

  11. Trees and (Structural) Recursion A tree is either: – the empty tree – a root node and an ordered list of subtrees Trees are a recursively defined structure, so it makes sense to operate on them recursively. 11

  12. Today’s Outline • Trees, Briefly • Priority Queue ADT • Heaps – Implementing Priority Queue ADT – Focus on Create: Heapify – Brief introduction to d-Heaps 12

  13. Back to Queues • Some applications – ordering CPU jobs – simulating events – picking the next search site • Problems? – short jobs should go first – earliest (simulated time) events should go first – most promising sites should be searched first 13

  14. Priority Queue ADT • Priority Queue operations – create F(7) E(5) – destroy deleteMin insert G(9) D(100) A(4) C(3) – insert B(6) – deleteMin – isEmpty • Priority Queue property: for two elements in the queue, x and y , if x has a lower priority value than y , x will be deleted before y 14

  15. Applications of the Priority Q • Hold jobs for a printer in order of length • Store packets on network routers in order of urgency • Simulate events • Select symbols for compression • Sort numbers • Anything greedy : an algorithm that makes the “locally best choice” at each step 15

  16. Naïve Priority Q Data Structures • Unsorted list: – insert: – deleteMin: • Sorted list: a. O(lg n) b. O(n) – insert: c. O(n lg n) d. O(n 2 ) – deleteMin: e. Something else 16

  17. Today’s Outline • Trees, Briefly • Priority Queue ADT • Heaps – Implementing Priority Queue ADT – Focus on Create: Heapify – Brief introduction to d-Heaps 17

  18. Binary Heap Priority Q Data Structure • Heap-order property Look! Invariants! – parent’s key is less than or 2 equal to children’s keys – result: minimum is always at the top 4 5 • Structure property – “nearly complete tree” 7 6 10 8 – result: depth is always O(log n); next open location always known 11 9 12 14 20 WARNING : this has NO SIMILARITY to the “heap” you hear about 18 when people say “objects you create with new go on the heap”.

  19. Nifty Storage Trick • Calculations: 0 2 – child: 1 2 4 5 – parent: 3 6 4 5 7 6 10 8 – root: 7 8 11 9 12 14 20 – next free: 11 9 10 0 1 2 3 4 5 6 7 8 9 10 11 2 4 5 7 6 10 8 11 9 12 14 20 19

  20. (Aside: Steve numbers from 1.) • Calculations: 1 2 – child: 2 3 4 5 – parent: 4 7 5 6 7 6 10 8 – root: 8 9 11 9 12 14 20 – next free: 12 10 11 0 1 2 3 4 5 6 7 8 9 10 11 12 2 4 5 7 6 10 8 11 9 12 14 20 Steve like to just skip using entry 0 in the array, so the root is at index 1. 20 For a binary heap, this makes the calculations slightly shorter.

  21. DeleteMin pqueue.deleteMin() 2 2 ? 4 5 4 5 7 6 10 8 7 6 10 8 11 9 12 14 20 11 9 12 14 20 Invariants violated! DOOOM!!! 21

  22. Percolate Down ? 4 4 5 ? 5 7 6 10 8 7 6 10 8 11 9 12 14 20 11 9 12 14 20 4 4 6 5 6 5 7 ? 10 8 7 12 10 8 22 11 9 12 14 20 11 9 20 14 20

  23. Finally… 4 6 5 7 12 10 8 11 9 20 14 23

  24. DeleteMin Code Object deleteMin() { int percolateDown(int hole, Object val) { assert(!isEmpty()); while (2*hole+1 < size) { returnVal = Heap[0]; left = 2*hole + 1; size--; right = left + 1; newPos = if (right < size && percolateDown(0, Heap[right] < Heap[left]) target = right; Heap[size]); else Heap[newPos] = target = left; Heap[size]; return returnVal; if (Heap[target] < val) { } Heap[hole] = Heap[target]; hole = target; } else runtime: break; } return hole; 24 }

  25. Insert pqueue.insert(3) 2 2 4 5 4 5 7 6 10 8 7 6 10 8 11 9 12 14 20 11 9 12 14 20 3 Invariant violated! What will we do? 25

  26. Percolate Up 2 2 4 5 4 5 7 6 10 8 7 6 3 8 11 9 12 14 20 3 11 9 12 14 20 10 2 2 4 3 4 3 7 6 5 8 7 6 5 8 11 9 12 14 20 10 11 9 12 14 20 10 26

  27. Insert Code void insert(Object o) { int percolateUp(int hole, Object val) { assert(!isFull()); while (hole > 0 && newPos = val < Heap[(hole-1)/2]) percolateUp(size,o); Heap[hole] = Heap[(hole-1)/2]; size++; hole = (hole-1)/2; Heap[newPos] = o; } return hole; } } runtime: 27

  28. Today’s Outline • Trees, Briefly • Priority Queue ADT • Heaps – Implementing Priority Queue ADT – Focus on Create: Heapify – Brief introduction to d-Heaps 28

  29. Closer Look at Creating Heaps To create a heap given a list of items: Create an empty heap. For each item: insert into heap. Time complexity? 9, 4, 8, 1, 7, 2 3 a. O(lg n) b. O(n) c. O(n lg n) 5 3 d. O(n 2 ) e. None of these 29 10 12 11

  30. A Better BuildHeap Floyd’s Method. Thank you, Floyd. 12 5 11 3 10 6 9 4 8 1 7 2 pretend it’s a heap and fix the heap-order property! 12 Invariant violated! 5 11 Where can the order invariant be violated 3 10 6 9 in general? a. Anywhere b. Non-leaves 4 8 1 7 2 30 c. Non-roots

  31. Alan’s Aside: • I don’t really like the way Steve explains this. • Heaps are recursive (mostly, except for structure): – A single node is a heap. – If parent value less than its child(ren), and child(ren) are heaps (except for “nearly complete” property). • Think of enforcing the heap invariant from the bottom up! – Base Case: All nodes with no children are heaps already. – Inductive Case: My children are heaps. Percolate my value down, and that makes me a heap, too.

  32. Build(this)Heap 12 12 5 11 5 11 3 10 2 9 3 1 2 9 4 8 1 7 6 4 8 10 7 6 12 12 5 2 1 2 3 1 6 9 3 5 6 9 32 4 8 10 7 11 4 8 10 7 11

  33. Finally… 1 3 2 4 5 6 9 12 8 10 7 11 runtime: 33

  34. Build(any)Heap This is as many violations as we can get. How do we fix them? Let’s play colouring games! 34

  35. Build(any)Heap Alan’s Aside: I like to think of this instead as “charging” edges in the tree for the cost of the moves. We can work out a scheme where each edge pays only once. (A 1-1 correspondence!) 35

  36. Build(any)Heap Alan’s Aside: The proof that this always works is inductive. The inductive step is that both of my subtrees have an uncharged path (rightmost) to the leaves. I charge my cost to my left child, and my right child provides the 36 rightmost, uncharged path that I offer to my parent.

  37. Alan’s Aside • Alternatively, we can do this with algebra. • Consider a complete heap: – As we do percolate-down on bottom row, the cost is 0, each. There are roughly n/2 nodes on bottom row. – On next row up, the cost is 1, each. There are roughly n/4 nodes on second row. – On the kth row up, the cost is k-1 times n/(2^k) nodes on that row. ∞ ∞ log n n n n i ∑ ∑ ∑ − ≤ = = ( i 1 ) i n – Therefore, run time is + i i 1 i 2 2 2 2 = = = 1 0 0 i i i

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend