Analysis of Algorithms

Slides:



Advertisements
Similar presentations
BY Lecturer: Aisha Dawood. Heapsort  O(n log n) worst case like merge sort.  Sorts in place like insertion sort.  Combines the best of both algorithms.
Advertisements

CS Section 600 CS Section 002 Dr. Angela Guercio Spring 2010.
David Luebke 1 5/20/2015 CS 332: Algorithms Quicksort.
September 19, Algorithms and Data Structures Lecture IV Simonas Šaltenis Nykredit Center for Database Research Aalborg University
UMass Lowell Computer Science Analysis of Algorithms Prof. Karen Daniels Fall, 2009 Heap Lecture Chapter 6 Use NOTES feature to see explanation.
Analysis of Algorithms CS 477/677 Instructor: Monica Nicolescu.
CS 253: Algorithms Chapter 6 Heapsort Appendix B.5 Credit: Dr. George Bebis.
Analysis of Algorithms CS 477/677
Comp 122, Spring 2004 Heapsort. heapsort - 2 Lin / Devi Comp 122 Heapsort  Combines the better attributes of merge sort and insertion sort. »Like merge.
Data Structures, Spring 2004 © L. Joskowicz 1 Data Structures – LECTURE 7 Heapsort and priority queues Motivation Heaps Building and maintaining heaps.
Data Structures Dynamic Sets Heaps Binary Trees & Sorting Hashing.
Heapsort Chapter 6. Heaps A data structure with  Nearly complete binary tree  Heap property: A[parent(i)] ≥ A[i] eg. Parent(i) { return } Left(i) {
1 Priority Queues A priority queue is an ADT where: –Each element has an associated priority –Efficient extraction of the highest-priority element is supported.
3-Sorting-Intro-Heapsort1 Sorting Dan Barrish-Flood.
Tirgul 4 Order Statistics Heaps minimum/maximum Selection Overview
UMass Lowell Computer Science Analysis of Algorithms Prof. Karen Daniels Spring, 2007 Heap Lecture Chapter 6 Use NOTES feature to see explanation.
David Luebke 1 7/2/2015 Merge Sort Solving Recurrences The Master Theorem.
UMass Lowell Computer Science Analysis of Algorithms Prof. Karen Daniels Fall, 2001 Heap Lecture 2 Chapter 7 Wed. 10/10/01 Use NOTES feature to.
Heapsort CIS 606 Spring Overview Heapsort – O(n lg n) worst case—like merge sort. – Sorts in place—like insertion sort. – Combines the best of both.
Sorting Algorithms (Part II) Slightly modified definition of the sorting problem: input: A collection of n data items where data item a i has a key, k.
2IL50 Data Structures Spring 2015 Lecture 3: Heaps.
David Luebke 1 10/3/2015 CS 332: Algorithms Solving Recurrences Continued The Master Theorem Introduction to heapsort.
A Introduction to Computing II Lecture 10: Heaps Fall Session 2000.
Heaps, Heapsort, Priority Queues. Sorting So Far Heap: Data structure and associated algorithms, Not garbage collection context.
Binary Heap.
2IL50 Data Structures Fall 2015 Lecture 3: Heaps.
September 29, Algorithms and Data Structures Lecture V Simonas Šaltenis Aalborg University
Computer Sciences Department1. Sorting algorithm 3 Chapter 6 3Computer Sciences Department Sorting algorithm 1  insertion sort Sorting algorithm 2.
David Luebke 1 6/3/2016 CS 332: Algorithms Heapsort Priority Queues Quicksort.
Prepared by- Jatinder Paul, Shraddha Rumade
Analysis of Algorithms CS 477/677 Instructor: Monica Nicolescu Lecture 9.
Data Structure & Algorithm Lecture 5 Heap Sort & Binary Tree JJCAO.
CS 2133: Data Structures Quicksort. Review: Heaps l A heap is a “complete” binary tree, usually represented as an array:
Introduction to Algorithms
1 Analysis of Algorithms Chapter - 03 Sorting Algorithms.
1 Algorithms CSCI 235, Fall 2015 Lecture 14 Analysis of Heap Sort.
David Luebke 1 12/23/2015 Heaps & Priority Queues.
Computer Algorithms Lecture 9 Heapsort Ch. 6, App. B.5 Some of these slides are courtesy of D. Plaisted et al, UNC and M. Nicolescu, UNR.
CPSC 311 Section 502 Analysis of Algorithm Fall 2002 Department of Computer Science Texas A&M University.
Heapsort. What is a “heap”? Definitions of heap: 1.A large area of memory from which the programmer can allocate blocks as needed, and deallocate them.
CSC 413/513: Intro to Algorithms Solving Recurrences Continued The Master Theorem Introduction to heapsort.
Chapter 6: Heapsort Combines the good qualities of insertion sort (sort in place) and merge sort (speed) Based on a data structure called a “binary heap”
Lecture 8 : Priority Queue Bong-Soo Sohn Assistant Professor School of Computer Science and Engineering Chung-Ang University.
CSE 5392 Fall 2005 Week 4 Devendra Patel Subhesh Pradhan.
1 Heap Sort. A Heap is a Binary Tree Height of tree = longest path from root to leaf =  (lgn) A heap is a binary tree satisfying the heap condition:
David Luebke 1 2/5/2016 CS 332: Algorithms Introduction to heapsort.
Heapsort A minimalist's approach Jeff Chastine. Heapsort Like M ERGE S ORT, it runs in O(n lg n) Unlike M ERGE S ORT, it sorts in place Based off of a.
David Luebke 1 2/19/2016 Priority Queues Quicksort.
Sept Heapsort What is a heap? Max-heap? Min-heap? Maintenance of Max-heaps -MaxHeapify -BuildMaxHeap Heapsort -Heapsort -Analysis Priority queues.
Heapsort Lecture 4 Asst. Prof. Dr. İlker Kocabaş.
6.Heapsort. Computer Theory Lab. Chapter 6P.2 Why sorting 1. Sometimes the need to sort information is inherent in a application. 2. Algorithms often.
1 Algorithms CSCI 235, Fall 2015 Lecture 13 Heap Sort.
Priority Queues A priority queue is an ADT where:
"Teachers open the door, but you must enter by yourself. "
Heaps, Heapsort, and Priority Queues
Heaps, Heap Sort and Priority Queues
Heapsort Chapter 6 Lee, Hsiu-Hui
Heap Sort Example Qamar Abbas.
Introduction to Algorithms
CS 583 Analysis of Algorithms
Heaps, Heapsort, and Priority Queues
CS200: Algorithm Analysis
Ch 6: Heapsort Ming-Te Chi
Heapsort.
"Teachers open the door, but you must enter by yourself. "
Design and Analysis of Algorithms
HEAPS.
Solving Recurrences Continued The Master Theorem
Algorithms CSCI 235, Spring 2019 Lecture 14 Heap Sort Read: Ch. 6
Asst. Prof. Dr. İlker Kocabaş
Presentation transcript:

Analysis of Algorithms Lecture: Heap sort 4/13/2017

Heap sort Another Θ(n log n) sorting algorithm In practice quick sort wins The heap data structure and its variants are very useful for many algorithms 4/13/2017

Selection sort <= Sorted <= Find minimum <= Sorted 4/13/2017

Selection sort <= Sorted <= Find maximum <= Sorted 4/13/2017

Selection sort SelectionSort(A[1..n]) for (i = n; i > 0; i--) index = max_element(A[1..i]) swap(A[i], A[index]); end What’s the time complexity? If max_element takes Θ(n), selection sort takes i=1n i = Θ(n2) 4/13/2017

Heap A heap is a data structure that allows you to quickly retrieve the largest (or smallest) element It takes time Θ(n) to build the heap If you need to retrieve largest element, second largest, third largest…, in long run the time taken for building heaps will be rewarded 4/13/2017

Build a heap in linear time Idea of heap sort HeapSort(A[1..n]) Build a heap from A For i = n down to 1 Retrieve largest element from heap Put element at end of A Reduce heap size by one end Key: Build a heap in linear time Retrieve largest element (and make it ready for next retrieval) in O(log n) time 4/13/2017

Heaps A heap can be seen as a complete binary tree: A complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are as far left as possible Perfect binary tree 16 14 10 8 7 9 3 2 4 1 4/13/2017

Heaps In practice, heaps are usually implemented as arrays: 16 14 10 8 7 9 3 2 4 1 16 14 10 8 7 9 3 2 4 1 4/13/2017

Heaps To represent a complete binary tree as an array: The root node is A[1] Node i is A[i] The parent of node i is A[i/2] (note: integer divide) The left child of node i is A[2i] The right child of node i is A[2i + 1] 16 14 10 8 7 9 3 2 4 1 A = 16 14 10 8 7 9 3 2 4 1 = 4/13/2017

Referencing Heap Elements So… Parent(i) {return i/2;} Left(i) {return 2*i;} right(i) {return 2*i + 1;} 4/13/2017

Heap Height Definitions: What is the height of an n-element heap? Why? The height of a node in the tree = the number of edges on the longest downward path to a leaf The height of a tree = the height of its root What is the height of an n-element heap? Why? log2(n). Basic heap operations take at most time proportional to the height of the heap h=3 16 14 10 8 7 9 3 2 4 1 h=1 h=2 h=1 h=0 h=0 4/13/2017

The Heap Property Heaps also satisfy the heap property: A[Parent(i)]  A[i] for all nodes i > 1 In other words, the value of a node is at most the value of its parent The value of a node should be greater than or equal to both its left and right children And all of its descendents Where is the largest element in a heap stored? 4/13/2017

Are they heaps? 16 4 10 14 7 9 3 2 8 1 16 4 10 14 7 9 3 2 8 1 = 16 10 14 7 8 9 3 2 4 1 16 10 14 7 8 9 3 2 4 1 = Violation to heap property: a node has value less than one of its children How to find that? How to resolve that? 4/13/2017

Heap Operations: Heapify() Heapify(): maintain the heap property Given: a node i in the heap with children l and r Given: two subtrees rooted at l and r, assumed to be heaps Problem: The subtree rooted at i may violate the heap property Action: let the value of the parent node “sift down” so subtree at i satisfies the heap property Fix up the relationship between i, l, and r recursively 4/13/2017

Heap Operations: Heapify() Heapify(A, i) { // precondition: subtrees rooted at l and r are heaps l = Left(i); r = Right(i); if (l <= heap_size(A) && A[l] > A[i]) largest = l; else largest = i; if (r <= heap_size(A) && A[r] > A[largest]) largest = r; if (largest != i) { Swap(A, i, largest); Heapify(A, largest); } } // postcondition: subtree rooted at i is a heap Among A[l], A[i], A[r], which one is largest? If violation, fix it. 4/13/2017

Heapify() Example 16 4 10 14 7 9 3 2 8 1 A = 16 4 10 14 7 9 3 2 8 1 4/13/2017

Heapify() Example 16 4 10 14 7 9 3 2 8 1 A = 16 4 10 14 7 9 3 2 8 1 4/13/2017

Heapify() Example 16 4 10 14 7 9 3 2 8 1 A = 16 4 10 14 7 9 3 2 8 1 4/13/2017

Heapify() Example 16 14 10 4 7 9 3 2 8 1 A = 16 14 10 4 7 9 3 2 8 1 4/13/2017

Heapify() Example 16 14 10 4 7 9 3 2 8 1 A = 16 14 10 4 7 9 3 2 8 1 4/13/2017

Heapify() Example 16 14 10 8 7 9 3 2 4 1 A = 16 14 10 8 7 9 3 2 4 1 4/13/2017

Heapify() Example 16 14 10 8 7 9 3 2 4 1 A = 16 14 10 8 7 9 3 2 4 1 4/13/2017

Analyzing Heapify(): Informal Aside from the recursive call, what is the running time of Heapify()? How many times can Heapify() recursively call itself? What is the worst-case running time of Heapify() on a heap of size n? 4/13/2017

Analyzing Heapify(): Formal Fixing up relationships between i, l, and r takes (1) time If the heap at i has n elements, how many elements can the subtrees at l or r have? Draw it Answer: 2n/3 (worst case: bottom row 1/2 full) So time taken by Heapify() is given by T(n)  T(2n/3) + (1) 4/13/2017

Analyzing Heapify(): Formal So we have T(n)  T(2n/3) + (1) By case 2 of the Master Theorem, T(n) = O(lg n) Thus, Heapify() takes logarithmic time 4/13/2017

Heap Operations: BuildHeap() We can build a heap in a bottom-up manner by running Heapify() on successive subarrays Fact: for array of length n, all elements in range A[n/2 + 1 .. n] are heaps (Why?) So: Walk backwards through the array from n/2 to 1, calling Heapify() on each node. Order of processing guarantees that the children of node i are heaps when i is processed 4/13/2017

Fact: for array of length n, all elements in range A[n/2 + 1 Fact: for array of length n, all elements in range A[n/2 + 1 .. n] are heaps (Why?) Heap size # leaves # internal nodes 1 1 2 1 1 3 2 1 4 2 2 5 3 2 0 <= # leaves - # internal nodes <= 1 # of internal nodes = n/2 4/13/2017

BuildHeap() // given an unsorted array A, make A a heap BuildHeap(A) { heap_size(A) = length(A); for (i = length[A]/2 downto 1) Heapify(A, i); } 4/13/2017

BuildHeap() Example Work through example A = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7} 4 1 3 2 16 9 10 14 8 7 A = 4 1 3 2 16 9 10 14 8 7 4/13/2017

4 1 3 2 16 9 10 14 8 7 A = 4 1 3 2 16 9 10 14 8 7 4/13/2017

4 1 3 2 16 9 10 14 8 7 A = 4 1 3 2 16 9 10 14 8 7 4/13/2017

4 1 3 14 16 9 10 2 8 7 A = 4 1 3 14 16 9 10 2 8 7 4/13/2017

4 1 3 14 16 9 10 2 8 7 A = 4 1 3 14 16 9 10 2 8 7 4/13/2017

4 1 10 14 16 9 3 2 8 7 A = 4 1 10 14 16 9 3 2 8 7 4/13/2017

4 1 10 14 16 9 3 2 8 7 A = 4 1 10 14 16 9 3 2 8 7 4/13/2017

4 16 10 14 1 9 3 2 8 7 A = 4 16 10 14 1 9 3 2 8 7 4/13/2017

4 16 10 14 7 9 3 2 8 1 A = 4 16 10 14 7 9 3 2 8 1 4/13/2017

4 16 10 14 7 9 3 2 8 1 A = 4 16 10 14 7 9 3 2 8 1 4/13/2017

16 4 10 14 7 9 3 2 8 1 A = 16 4 10 14 7 9 3 2 8 1 4/13/2017

16 14 10 4 7 9 3 2 8 1 A = 16 14 10 4 7 9 3 2 8 1 4/13/2017

16 14 10 8 7 9 3 2 4 1 A = 16 14 10 8 7 9 3 2 4 1 4/13/2017

Analyzing BuildHeap() Each call to Heapify() takes O(lg n) time There are O(n) such calls (specifically, n/2) Thus the running time is O(n lg n) Is this a correct asymptotic upper bound? Is this an asymptotically tight bound? A tighter bound is O(n) How can this be? Is there a flaw in the above reasoning? 4/13/2017

Analyzing BuildHeap(): Tight To Heapify() a subtree takes O(h) time where h is the height of the subtree h = O(lg m), m = # nodes in subtree The height of most subtrees is small Fact: an n-element heap has at most n/2h+1 nodes of height h (why?) Therefore T(n) = O(n) 4/13/2017

Fact: an n-element heap has at most n/2h+1 nodes of height h (why?) n/2 leaf nodes (h = 0): f(0) = n/2 f(1)  (n/2 +1)/2 = n/4 The above fact can be proved using induction Assume f(h)  n/2h+1 f(h+1)  (f(h)+1)/2  n/2h+2 4/13/2017

Appendix A.8 4/13/2017

Heapsort Given BuildHeap(), an in-place sorting algorithm is easily constructed: Maximum element is at A[1] Discard by swapping with element at A[n] Decrement heap_size[A] A[n] now contains correct value Restore heap property at A[1] by calling Heapify() Repeat, always swapping A[1] for A[heap_size(A)] 4/13/2017

Heapsort Heapsort(A) { BuildHeap(A); for (i = length(A) downto 2) Swap(A[1], A[i]); heap_size(A) -= 1; Heapify(A, 1); } 4/13/2017

Heapsort Example Work through example A = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7} 4 1 3 2 16 9 10 14 8 7 A = 4 1 3 2 16 9 10 14 8 7 4/13/2017

Heapsort Example First: build a heap 16 14 10 8 7 9 3 2 4 1 A = 16 14 4/13/2017

Heapsort Example Swap last and first 1 14 10 8 7 9 3 2 4 16 A = 1 14 4/13/2017

Heapsort Example Last element sorted 1 14 10 8 7 9 3 2 4 16 A = 1 14 4/13/2017

Heapsort Example Restore heap on remaining unsorted elements 14 8 10 4 7 9 3 2 1 16 Heapify A = 14 8 10 4 7 9 3 2 1 16 4/13/2017

Heapsort Example Repeat: swap new last and first 1 8 10 4 7 9 3 2 14 16 A = 1 8 10 4 7 9 3 2 14 16 4/13/2017

Heapsort Example Restore heap 10 8 9 4 7 1 3 2 14 16 A = 10 8 9 4 7 1 4/13/2017

Heapsort Example Repeat 9 8 3 4 7 1 2 10 14 16 A = 9 8 3 4 7 1 2 10 14 4/13/2017

Heapsort Example Repeat 8 7 3 4 2 1 9 10 14 16 A = 8 7 3 4 2 1 9 10 14 4/13/2017

Heapsort Example Repeat 1 2 3 4 7 8 9 10 14 16 A = 1 2 3 4 7 8 9 10 14 4/13/2017

Analyzing Heapsort The call to BuildHeap() takes O(n) time Each of the n - 1 calls to Heapify() takes O(lg n) time Thus the total time taken by HeapSort() = O(n) + (n - 1) O(lg n) = O(n) + O(n lg n) = O(n lg n) 4/13/2017

Comparison Time complexity Stable? In-place? Merge sort Quick sort Heap sort 4/13/2017

Comparison Time complexity Stable? In-place? Merge sort  (n log n) Yes No Quick sort (n log n) expected. (n^2) worst case Heap sort 4/13/2017

Priority Queues Heapsort is a nice algorithm, but in practice Quicksort usually wins The heap data structure is incredibly useful for implementing priority queues A data structure for maintaining a set S of elements, each with an associated value or key Supports the operations Insert(), Maximum(), ExtractMax(), changeKey() What might a priority queue be useful for? 4/13/2017

Your personal travel destination list You have a list of places that you want to visit, each with a preference score Always visit the place with highest score Remove a place after visiting it You frequently add more destinations You may change score for a place when you have more information What’s the best data structure? 4/13/2017

Priority Queue Operations Insert(S, x) inserts the element x into set S Maximum(S) returns the element of S with the maximum key ExtractMax(S) removes and returns the element of S with the maximum key ChangeKey(S, i, key) changes the key for element i to something else How could we implement these operations using a heap? 4/13/2017

Implementing Priority Queues HeapMaximum(A) { return A[1]; } 4/13/2017

Implementing Priority Queues HeapExtractMax(A) { if (heap_size[A] < 1) { error; } max = A[1]; A[1] = A[heap_size[A]] heap_size[A] --; Heapify(A, 1); return max; } 4/13/2017

HeapExtractMax Example 16 14 10 8 7 9 3 2 4 1 A = 16 14 10 8 7 9 3 2 4 1 4/13/2017

HeapExtractMax Example Swap first and last, then remove last 1 14 10 8 7 9 3 2 4 16 A = 1 14 10 8 7 9 3 2 4 16 4/13/2017

HeapExtractMax Example Heapify 14 8 10 4 7 9 3 2 1 16 A = 14 8 10 4 7 9 3 2 1 16 4/13/2017

Implementing Priority Queues HeapChangeKey(A, i, key){ if (key <= A[i]){ // decrease key A[i] = key; heapify(A, i); } else { // increase key while (i>1 & A[parent(i)]<A[i]) swap(A[i], A[parent(i)]; } Sift down Bubble up 4/13/2017

HeapChangeKey Example HeapChangeKey(A, 4, 15) Change key value to 15 4th element 16 14 10 8 7 9 3 2 4 1 A = 16 14 10 8 7 9 3 2 4 1 4/13/2017

HeapChangeKey Example HeapChangeKey(A, 4, 15) 16 14 10 15 7 9 3 2 4 1 A = 16 14 10 15 7 9 3 2 4 1 4/13/2017

HeapChangeKey Example HeapChangeKey(A, 4, 15) 16 15 10 14 7 9 3 2 4 1 A = 16 15 10 14 7 9 3 2 4 1 4/13/2017

Implementing Priority Queues HeapInsert(A, key) { heap_size[A] ++; i = heap_size[A]; A[i] = -∞; HeapChangeKey(A, i, key); } 4/13/2017

HeapInsert Example HeapInsert(A, 17) 16 14 10 8 7 9 3 2 4 1 A = 16 14 4/13/2017

HeapInsert Example HeapInsert(A, 17) -∞ -∞ -∞ makes it a valid heap 16 14 10 8 7 9 3 2 4 1 -∞ -∞ makes it a valid heap A = 16 14 10 8 7 9 3 2 4 1 -∞ 4/13/2017

HeapInsert Example HeapInsert(A, 17) Now call HeapChangeKey 16 14 10 8 9 3 2 4 1 17 Now call HeapChangeKey A = 16 14 10 8 7 9 3 2 4 1 17 4/13/2017

HeapInsert Example HeapInsert(A, 17) 17 16 10 8 14 9 3 2 4 1 7 A = 17 4/13/2017

HeapExtractMax: Θ(log n) HeapChangeKey: Θ(log n) HeapInsert: Θ(log n) Heapify: Θ(log n) BuildHeap: Θ(n) HeapSort: Θ(nlog n) HeapMaximum: Θ(1) HeapExtractMax: Θ(log n) HeapChangeKey: Θ(log n) HeapInsert: Θ(log n) 4/13/2017

If we use a sorted array / linked list Sort: Θ(n log n) Afterwards: arrayMaximum: Θ(1) arrayExtractMax: Θ(n) or Θ(1) arrayChangeKey: Θ(n) arrayInsert: Θ(n) 4/13/2017