functional data structures
play

Functional Data Structures Sept 1, 2017 (Multiple diagrams from - PowerPoint PPT Presentation

Functional Data Structures Sept 1, 2017 (Multiple diagrams from Purely Functional Datastructures by Chris Okasaki) CSE 662 - Database Languages & Runtimes 1 Mutable vs Immutable X = [ Alice, Bob, Carol, Dave ] Alice Bob Carol


  1. Functional Data Structures Sept 1, 2017 (Multiple diagrams from ‘Purely Functional Datastructures’ by Chris Okasaki) CSE 662 - Database Languages & Runtimes 1

  2. Mutable vs Immutable X = [ Alice, Bob, Carol, Dave ] Alice Bob Carol Eve Dave X[2] Carol X[2] := Eve CSE 662 - Database Languages & Runtimes 2

  3. Mutable vs Immutable X = [ Alice, Bob, Carol, Dave ] Alice Bob Carol Dave Thread 1 Thread 2 X[2] := Eve X[2] ? Carol Eve CSE 662 - Database Languages & Runtimes 3

  4. Mutable Datastructures • The programmer’s intended ordering is unclear • Atomicity/Correctness requires locking • Versioning requires copying the data structure • Cache coherency is expensive! Can these problems be avoided? CSE 662 - Database Languages & Runtimes 4

  5. Immutable Data Structures X = [ Alice, Bob, Carol, Dave ] Alice Bob Carol Dave X[2] Carol X[2] := Eve Don’t allow writes! But what if we need to update the structure? CSE 662 - Database Languages & Runtimes 5

  6. Immutable Data Structures Alice Bob Carol Dave Eve Key Insight: Immutable components can be re-used! CSE 662 - Database Languages & Runtimes 6

  7. Immutable Data Structures Alice Bob Carol Dave Eve Key Insight: Immutable components can be re-used! CSE 662 - Database Languages & Runtimes 7

  8. Immutable Data Structures Alice Bob Carol Dave Eve Semantics are clearer: Exactly one ‘version’ at any time CSE 662 - Database Languages & Runtimes 8

  9. Immutable Data Structures Alice Bob Carol Dave Eve Data is added, not replaced: No cache coherency problems CSE 662 - Database Languages & Runtimes 9

  10. Immutable Data Structures (a.k.a. ‘Functional’ or ‘Persistent’ Data Structures) • Once an object is created, it never changes. • When all pointers to an object go away, the object is garbage collected. • Only the ‘root’ pointer can ever change (to point to a new version of the data structure) CSE 662 - Database Languages & Runtimes 10

  11. Linked Lists xs = pop(xs) ys = push(ys,1) Only xs and ys need to change CSE 662 - Database Languages & Runtimes 11

  12. Linked Lists zs = append(xs,ys) This entire part needs to be rewritten CSE 662 - Database Languages & Runtimes 12

  13. Linked Lists CSE 662 - Database Languages & Runtimes 13

  14. Class Exercise 1 How would you implement update(list, index, value) CSE 662 - Database Languages & Runtimes 14

  15. Class Exercise 2 Implement a set with: set init() boolean member(set, elem) set insert(set, elem) CSE 662 - Database Languages & Runtimes 15

  16. Lazy Evaluation Can we do better? CSE 662 - Database Languages & Runtimes 16

  17. Putting Off Work Fast x = “expensive()” (just saving a ‘todo’) Slow print x (performing the ‘todo’) Fast print x (‘todo’ already done) CSE 662 - Database Languages & Runtimes 17

  18. Class Exercise 3 Make it better! CSE 662 - Database Languages & Runtimes 18

  19. Putting Off Work concatenate(a, b) { a’, front = pop(a) if a’ is empty return (front, b) else return (front, “concatenate(a’,b)”) } What is the time complexity of concatenate? What happens to reads? CSE 662 - Database Languages & Runtimes 19

  20. Lazy Evaluation • Save work for later… • … and avoid work that is never required. • … to spread work out over multiple calls. • … for better ‘amortized’ costs. CSE 662 - Database Languages & Runtimes 20

  21. Amortized Analysis • Allow operation A to ‘pay it forward’ for another operation B that hasn’t happened yet • A’s time complexity goes up by X. • B’s time complexity goes down by X. CSE 662 - Database Languages & Runtimes 21

  22. Example: Amortized Queues Preliminaries: Implement an efficient enqueue() / dequeue() CSE 662 - Database Languages & Runtimes 22

  23. Example: Amortized Queues ‘current’ queue ‘todo’ stack enqueue() : Push onto ‘todo’ stack What is the cost? dequeue() : Pop ‘current’ queue if empty, reverse ‘todo’ stack to make new ‘current’ queue What is the cost? CSE 662 - Database Languages & Runtimes 23

  24. Example: Amortized Queues ‘current’ queue ‘todo’ stack enqueue() : Push onto ‘todo’ stack push() is O(1) + 1 credit dequeue() : Pop ‘current’ queue if empty, reverse ‘todo’ stack to make new ‘current’ queue Pop is O(1); Reverse uses N credits for O(1) amortized CSE 662 - Database Languages & Runtimes 24

Recommend


More recommend