pfds 10.1.2

Post on 20-Aug-2015

282 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

PFDS 10.1.2Binary Random-Access

List Revisited

@rf0444

a Seq = NIL | CONS of a * (a * a) Seq

NIL

CONS 1 NIL

CONS 1 (CONS (2, 3) NIL)

CONS 1 (CONS (2,3) (CONS ((4,5),(6,7)) NIL))

a Seq = NIL | CONS of a * (a * a) Seq

NIL

CONS 1 NIL

CONS 1 (CONS (2, 3) NIL)

CONS 1 (CONS (2,3) (CONS ((4,5),(6,7)) NIL))

0個

1個

3個

7個

a Seq = NIL | CONS of a * (a * a) Seq

CONS 1 (CONS (2,3) (CONS ((4,5),(6,7)) NIL))

1個a

2個a * a

4個(a * a) * (a * a)

a Tree = LEAF of a | NODE of a Tree * a Tree

a Digit = ZERO | ONE of a Tree

a RList = a Digit list

9.2.1 Binary Random-Access Lists

ZERO ONE ONE

31 2 4 5

型だけ見ると下の構成もできるように見える

9.2.1 Binary Random-Access Lists

ZERO ONE ONE

43

5

21

サイズがおかしい

完全じゃない

a Seq = NIL | ZERO of (a * a) Seq

| ONE of a * (a * a) Seq

10.1.2 Binary Random-AccessLists Revisited

ZERO

ONE1

ONE((2, 3), (4,5))

aa * a (a * a) * (a * a)

((a * a) * (a * a)) * ((a * a) * (a * a)) Seq

head, tail

大体 9.2.1 と同じ

lookup

ZERO

ONE1

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 5

lookup

ZERO

ONE1

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 5

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 4ZERO

lookup

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 4ZERO

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 2 の左

lookup

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 2 の左

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 1 の左ZERO

lookup

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 0 の右 の左

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 1 の左ZERO

lookup

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 0 の左 の右 の左

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 0 の右 の左

lookup

(((4, 5), (6, 7)), ((8, 9), (10, 11))) の左 の右 の左

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

lookup 0 の左 の右 の左

((4, 5), (6, 7))     の右 の左 (6, 7)        の左

6

update

ZERO

ONE1

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

update 5 20

update

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . update 4 20ZERO

ZERO

ONE1

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

update 5 20

update

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . update 4 20ZERO

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . update 2 (20, 7)

update

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . update 2 (20, 7)

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . update 1 (20, 7)ZERO

update

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . update 1 (20, 7)ZERO

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO .update 0 ((4, 5), (20, 7))

update

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO .update 0 ((4, 5), (20, 7))

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO . ZERO .update 0 (((4, 5), (20, 7)), ((8, 9), (10, 11)))

update

ONE(((4, 5), (20, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO . ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO . ZERO .update 0 (((4, 5), (20, 7)), ((8, 9), (10, 11)))

update

ONE(((4, 5), (20, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO . ZERO

ZERO

ONE1

ONE(2, 3)

ONE(((4, 5), (20, 7)), ((8, 9), (10, 11)))

update

先頭要素が ZERO の時に毎回 lookup が走る

結果、update は O(log^2 n)

変更する値ではなく、変更する関数を渡すようにする

update

ZERO

ONE1

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

update 5 20

ZERO

ONE1

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

fupdate (fn _ -> 20) 5

update

ZERO

ONE1

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

fupdate (fn _ -> 20) 5

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . fupdate (fn _ -> 20) 4ZERO

update

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . fupdate (fn (x, y) -> (20, y)) 2

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . fupdate (fn x -> 20) 4ZERO

update

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) .fupdate (fn (x, y) -> (20, y)) 1

ZERO

ONE(2, 3)

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . fupdate (fn (x, y) -> (20, y)) 2

ZERO

update

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) .fupdate (fn (x, y) -> (20, y)) 1

ZERO

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO .fupdate (fn (w, (x, y)) -> (w, (20, y))) 0

update

ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO .fupdate (fn (w, (x, y)) -> (w, (20, y))) 0

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO . ZERO .fupdate (fn ((w, (x, y)), z) -> ((w, (20, y)), z)) 0

update

ONE(((4, 5), (20, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO . ZERO

ONE(((4, 5), (6, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO . ZERO .fupdate (fn ((w, (x, y)), z) -> ((w, (20, y)), z)) 0

update

ONE(((4, 5), (20, 7)), ((8, 9), (10, 11)))

cons 1 . ZERO . cons (2, 3) . ZERO . ZERO

ZERO

ONE1

ONE(2, 3)

ONE(((4, 5), (20, 7)), ((8, 9), (10, 11)))

top related