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

Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

Aug 09, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Functional Data Structures

Sept 1, 2017

1

(Multiple diagrams from ‘Purely Functional Datastructures’ by Chris Okasaki)

Page 2: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Mutable vs Immutable

2

X = [ Alice, Bob, Carol, Dave ]

Alice Bob Carol Dave

X[2] Carol

X[2] := Eve

Eve

Page 3: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Mutable vs Immutable

3

X = [ Alice, Bob, Carol, Dave ]

Alice Bob Carol Dave

X[2] := EveThread 1 Thread 2

EveCarol ?

X[2]

Page 4: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Mutable Datastructures

• The programmer’s intended ordering is unclear

• Atomicity/Correctness requires locking

• Versioning requires copying the data structure

• Cache coherency is expensive!

4

Can these problems be avoided?

Page 5: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Immutable Data Structures

5

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?

Page 6: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Carol Eve

Immutable Data Structures

6

Alice Bob Dave

Key Insight: Immutable components can be re-used!

Page 7: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Carol Eve

Immutable Data Structures

7

Alice Bob Dave

Key Insight: Immutable components can be re-used!

Page 8: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Carol Eve

Immutable Data Structures

8

Alice Bob Dave

Semantics are clearer: Exactly one ‘version’ at any time

Page 9: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

EveCarol

Immutable Data Structures

9

Alice Bob Dave

Data is added, not replaced: No cache coherency problems

Page 10: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Immutable 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)

10

(a.k.a. ‘Functional’ or ‘Persistent’ Data Structures)

Page 11: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Linked Lists

11

xs = pop(xs)

ys = push(ys,1)

Only xs and ys need to change

Page 12: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Linked Lists

12

zs = append(xs,ys)

This entire part needs to be rewritten

Page 13: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Linked Lists

13

Page 14: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Class Exercise 1

14

How would you implement update(list, index, value)

Page 15: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Class Exercise 2

15

Implement a set with:

set init()boolean member(set, elem)set insert(set, elem)

Page 16: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Lazy Evaluation

16

Can we do better?

Page 17: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Putting Off Work

17

x = “expensive()”

print x

print x

Fast (just saving a ‘todo’)

Slow (performing the ‘todo’)

Fast (‘todo’ already done)

Page 18: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Class Exercise 3

18

Make it better!

Page 19: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Putting Off Work

19

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?

Page 20: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Lazy Evaluation

• Save work for later…

• … and avoid work that is never required.

• … to spread work out over multiple calls.

• … for better ‘amortized’ costs.

20

Page 21: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

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.

21

Page 22: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Example: Amortized Queues

22

Preliminaries: Implement an efficient enqueue()/dequeue()

Page 23: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Example: Amortized Queues

23

enqueue(): Push onto ‘todo’ stack

‘current’ queue ‘todo’ stack

dequeue(): Pop ‘current’ queue if empty, reverse ‘todo’ stack to make new ‘current’ queue

What is the cost?

What is the cost?

Page 24: Functional Data Structures · 9/1/2017  · CSE 662 - Database Languages & Runtimes Immutable Data Structures • Once an object is created, it never changes. • When all pointers

CSE 662 - Database Languages & Runtimes

Example: Amortized Queues

24

enqueue(): Push onto ‘todo’ stack

‘current’ queue ‘todo’ stack

dequeue(): Pop ‘current’ queue if empty, reverse ‘todo’ stack to make new ‘current’ queue

push() is O(1) + 1 credit

Pop is O(1); Reverse uses N credits for O(1) amortized