expanding stacks queues
play

Expanding Stacks & Queues CS16: Introduction to Data Structures - PowerPoint PPT Presentation

Expanding Stacks & Queues CS16: Introduction to Data Structures & Algorithms Spring 2020 Outline Abstract data types Stacks Capped-capacity Expandable Amortized analysis Queues Expandable queues From Lecture


  1. Expanding Stacks & Queues CS16: Introduction to Data Structures & Algorithms Spring 2020

  2. Outline ‣ Abstract data types ‣ Stacks ‣ Capped-capacity ‣ Expandable ‣ Amortized analysis ‣ Queues ‣ Expandable queues

  3. From Lecture 02 What is Running Time? Asymptotic worst-case running time = Number of elementary operations on worst-case input as a function of input size n when n tends to infinity In CS “running time” usually means asymptotic worst-case running time…but not always! we will learn about other kinds of running times 3

  4. Abstract Data Types ‣ Abstraction of a data structure ‣ Specifies “functionality” ‣ type of data stored ‣ operations it can perform ‣ Like a Java interface ‣ Specifies name & purpose of methods ‣ But not implementations 4

  5. Stacks ‣ Stores arbitrary objects ‣ Operations ‣ Push : adds object ‣ Pop : returns last object ‣ LIFO: last-in first-out ‣ Can be implemented with ‣ Linked lists, arrays, …

  6. Stack ADT ‣ push (object) ‣ inserts object ‣ object pop ( ) ‣ returns and removes last inserted object ‣ int size ( ) ‣ returns number objects in stack ‣ boolean isEmpty ( ) ‣ returns TRUE if empty; FALSE otherwise 6

  7. Capped-Capacity Stack ‣ Array-based Stack ‣ Stores objects in array ‣ keeps pointer to last inserted object ‣ Problem? ‣ Size of the stack is bounded by size of array :-( 7

  8. Capped-Capacity Stack Stack ( ): function isEmpty ( ): data = array of size 20 return count == 0 count = 0 function size ( ): ????? function push (object): function pop ( ): ????? ????? Activity #1

  9. Capped-capacity Stack Stack ( ): function isEmpty ( ): data = array of size 20 return count == 0 count = 0 function size ( ): ????? function push (object): function pop ( ): 2 min ????? ????? Activity #1

  10. Capped-capacity Stack Stack ( ): function isEmpty ( ): data = array of size 20 return count == 0 count = 0 function size ( ): ????? function push (object): function pop ( ): 1 min ????? ????? Activity #1

  11. Capped-capacity Stack Stack ( ): function isEmpty ( ): data = array of size 20 return count == 0 count = 0 function size ( ): ????? function push (object): function pop ( ): 0 min ????? ????? Activity #1

  12. Capped-Capacity Stack O(1) Stack ( ): function size ( ): data = array of size 20 return count O(1) count = 0 function isEmpty ( ): return count == 0 function push (object): function pop ( ): if count < 20: if count == 0: data[count] = object error(“empty stack”) count++ else: else: count-- error(“overfull”) return data[count] O(1) O(1)

  13. Expandable Stack ‣ Capped-capacity stack is fast ‣ but not useful in practice ‣ How can we design an uncapped Stack? ‣ Strategy #1 : Incremental ‣ increase size of array by constant c when full ‣ Strategy #2 : Doubling ‣ double size of array when full Arrays can’t be resized! Can only be copied 13

  14. Expandable Stack Stack ( ): data = array of size 20 What is the runtime? count = 0 capacity = 20 function push (object): data[count] = object count++ if count == capacity new_capacity = capacity + c /* incremental */ = capacity * 2 /* doubling */ new_data = array of size new_capacity for i = 0 to capacity - 1 new_data[i] = data[i] capacity = new_capacity data = new_data

  15. Expandable Stack function push (object): data[count] = object count++ if count == capacity new_capacity = capacity + c /* incremental */ = capacity * 2 /* doubling */ new_data = array of size new_capacity for i = 0 to capacity - 1 new_data[i] = data[i] capacity = new_capacity data = new_data ‣ Runtime when not expanding is O(1) & runtime when expanding is O(n) ‣ When does it expand? ‣ after n pushes, where n is capacity of array 15

  16. Incremental & Doubling Incremental (5) Doubling 50 50 40 40 30 30 Cost Cost 20 20 10 10 0 0 0 10 20 30 40 0 10 20 30 40 Push number Push number O(1) O(1) O(1) O(n) O(n) O(1) 16 O(1)

  17. Incremental & Doubling ‣ What are the worst-case runtimes? ‣ incremental: O(n) ‣ doubling: O(n) ‣ But are they really the same? 17

  18. What’s going on?

  19. Expandable Stack Run time depends on Stack ( ): count which depends on data = array of size 20 count = 0 # of previous pushes capacity = 20 function push (object): data[count] = object count++ if count == capacity new_capacity = capacity + c /* incremental */ = capacity * 2 /* doubling */ new_data = array of size new_capacity for i = 0 to capacity - 1 new_data[i] = data[i] capacity = new_capacity data = new_data

  20. Incremental & Doubling ‣ Worst-case analysis overestimates runtime ‣ for algorithms that are fast most of time… ‣ …and slow some of the time ‣ For these algorithms we need an alternative ‣ Amortized analysis! Measure cost on sequence of calls not a single call! 20

  21. Towards Amortized Analysis ‣ For certain algorithms it’s better to measure ‣ total running time on sequence of calls ‣ instead of measuring on a single call ‣ S(n) : total #calls on sequence of n calls ‣ Not runtime on a single input of size n ‣ For a stack ‣ S(n) : cost push #1 + cost push #2 + … + cost push #n 21

  22. <latexit sha1_base64="fizTbVUNR9Do6t871yGrdwVywI=">AB9HicbVBNS8NAEJ3Ur1q/qh69LBahXkoignorevFY0dhCG8tmu2mXbjZhd6OUkP/hxYOKV3+MN/+NmzYHbX0w8Hhvhpl5fsyZ0rb9bZWldW18rlY3Nre2d6u7evYoSahLIh7Jjo8V5UxQVzPNaSeWFIc+p21/fJX7UcqFYvEnZ7E1AvxULCAEayN9NALJCbpbV0cZ6nI+tWa3bCnQIvEKUgNCrT61a/eICJSIUmHCvVdexYeymWmhFOs0ovUTGZIyHtGuowCFVXjq9OkNHRhmgIJKmhEZT9fdEikOlJqFvOkOsR2rey8X/vG6ig3MvZSJONBVktihIONIRyiNAyYp0XxiCaSmVsRGWEThDZBVUwIzvzLi8Q9aVw0nJvTWvOySKMB3AIdXDgDJpwDS1wgYCEZ3iFN+vJerHerY9Za8kqZvbhD6zPH85qkI=</latexit> <latexit sha1_base64="fizTbVUNR9Do6t871yGrdwVywI=">AB9HicbVBNS8NAEJ3Ur1q/qh69LBahXkoignorevFY0dhCG8tmu2mXbjZhd6OUkP/hxYOKV3+MN/+NmzYHbX0w8Hhvhpl5fsyZ0rb9bZWldW18rlY3Nre2d6u7evYoSahLIh7Jjo8V5UxQVzPNaSeWFIc+p21/fJX7UcqFYvEnZ7E1AvxULCAEayN9NALJCbpbV0cZ6nI+tWa3bCnQIvEKUgNCrT61a/eICJSIUmHCvVdexYeymWmhFOs0ovUTGZIyHtGuowCFVXjq9OkNHRhmgIJKmhEZT9fdEikOlJqFvOkOsR2rey8X/vG6ig3MvZSJONBVktihIONIRyiNAyYp0XxiCaSmVsRGWEThDZBVUwIzvzLi8Q9aVw0nJvTWvOySKMB3AIdXDgDJpwDS1wgYCEZ3iFN+vJerHerY9Za8kqZvbhD6zPH85qkI=</latexit> <latexit sha1_base64="fizTbVUNR9Do6t871yGrdwVywI=">AB9HicbVBNS8NAEJ3Ur1q/qh69LBahXkoignorevFY0dhCG8tmu2mXbjZhd6OUkP/hxYOKV3+MN/+NmzYHbX0w8Hhvhpl5fsyZ0rb9bZWldW18rlY3Nre2d6u7evYoSahLIh7Jjo8V5UxQVzPNaSeWFIc+p21/fJX7UcqFYvEnZ7E1AvxULCAEayN9NALJCbpbV0cZ6nI+tWa3bCnQIvEKUgNCrT61a/eICJSIUmHCvVdexYeymWmhFOs0ovUTGZIyHtGuowCFVXjq9OkNHRhmgIJKmhEZT9fdEikOlJqFvOkOsR2rey8X/vG6ig3MvZSJONBVktihIONIRyiNAyYp0XxiCaSmVsRGWEThDZBVUwIzvzLi8Q9aVw0nJvTWvOySKMB3AIdXDgDJpwDS1wgYCEZ3iFN+vJerHerY9Za8kqZvbhD6zPH85qkI=</latexit> <latexit sha1_base64="fizTbVUNR9Do6t871yGrdwVywI=">AB9HicbVBNS8NAEJ3Ur1q/qh69LBahXkoignorevFY0dhCG8tmu2mXbjZhd6OUkP/hxYOKV3+MN/+NmzYHbX0w8Hhvhpl5fsyZ0rb9bZWldW18rlY3Nre2d6u7evYoSahLIh7Jjo8V5UxQVzPNaSeWFIc+p21/fJX7UcqFYvEnZ7E1AvxULCAEayN9NALJCbpbV0cZ6nI+tWa3bCnQIvEKUgNCrT61a/eICJSIUmHCvVdexYeymWmhFOs0ovUTGZIyHtGuowCFVXjq9OkNHRhmgIJKmhEZT9fdEikOlJqFvOkOsR2rey8X/vG6ig3MvZSJONBVktihIONIRyiNAyYp0XxiCaSmVsRGWEThDZBVUwIzvzLi8Q9aVw0nJvTWvOySKMB3AIdXDgDJpwDS1wgYCEZ3iFN+vJerHerY9Za8kqZvbhD6zPH85qkI=</latexit> Amortized Analysis ‣ Instead of reporting total cost of sequence ‣ report cost of sequence per call S ( n ) n 22

  23. Amortized Analysis of Incremental

  24. Amortized Analysis of Incremental Stack with start capacity c = 5 ‣ Expands by e = 5 ‣ ‣ 5 th push brings to capacity ‣ Objects copied to new array of size c+e = 5+5 = 10 ‣ Cost per push over 5 pushes? 24

  25. Amortized Analysis of Incremental Stack with start capacity c = 5 ‣ Expands by e = 5 ‣ S ( n ) = c + c = 5 + 5 Is each push = 2 O(1) ? 5 n c expansion pushes 25

  26. Amortized Analysis of Incremental ‣ What if we push 10 objects? S ( n ) = c + c + e + ( c + e ) 10 n 1st batch of pushes 1st expansion 2nd batch of pushes pushes 2nd expansion expansions c=5 e=5 26

  27. Amortized Analysis of Incremental ‣ What if we push 10 objects? S ( n ) = c + c + e + ( c + e ) 10 n = c + e + c + ( c + e ) 10 = 10 + 5 + (5 + 5) pushes 10 = 2.5 expansions c=5 e=5 27

  28. Amortized Analysis of Incremental S (10) = c + e + c + ( c + e ) = 10 + 5 + 10 = 25 10 = 2.5 10 10 10 S (15) = c + e + e + c + ( c + e ) + ( c + e + e ) = 15 + 5 + 10 + 15 = 45 15 = 3 15 15 15 S (20) = ? pushes 20 expansions Activity #2 c=5 e=5 28

  29. Amortized Analysis of Incremental S (10) = c + e + c + ( c + e ) = 10 + 5 + 10 = 25 10 = 2.5 10 10 10 S (15) = c + e + e + c + ( c + e ) + ( c + e + e ) = 15 + 5 + 10 + 15 = 45 15 = 3 15 15 15 S (20) = ? 1 min pushes 20 expansions Activity #2 c=5 e=5 29

  30. Amortized Analysis of Incremental S (10) = c + e + c + ( c + e ) = 10 + 5 + 10 = 25 10 = 2.5 10 10 10 S (15) = c + e + e + c + ( c + e ) + ( c + e + e ) = 15 + 5 + 10 + 15 = 45 15 = 3 15 15 15 S (20) = ? 0 min pushes 20 expansions Activity #2 c=5 e=5 30

  31. Amortized Analysis of Incremental S (10) = c + e + c + ( c + e ) = 10 + 5 + 10 = 25 10 = 2.5 10 10 10 S (15) = c + e + e + c + ( c + e ) + ( c + e + e ) = 15 + 5 + 10 + 15 = 45 15 = 3 15 15 15 S (20) = c + e + e + e + c + ( c + e ) + ( c + e + e ) + ( c + e + e + e ) 20 20 = 20 + 5 + 10 + 15 + 20 20 = 70 pushes 20 c=5 expansions = 3.5 e=5 31

Recommend


More recommend