pfds 10.1.2
Post on 20-Aug-2015
278 Views
Preview:
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