SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
PFDS 10.1.2
Binary 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       0個

  CONS 1 NIL     1個

  CONS 1 (CONS (2, 3) NIL)    3個

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

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

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

      1個        2個                4個
       a       a*a         (a * a) * (a * a)
9.2.1 Binary Random-Access Lists
a Tree = LEAF of a | NODE of a Tree * a Tree

a Digit = ZERO | ONE of a Tree

a RList = a Digit list



                ONE ZERO ONE




        1                      2   3   4   5
9.2.1 Binary Random-Access Lists

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




            ONE ZERO ONE




サイズが                               5
        1   2
おかしい                       3   4
                                   完全じゃない
10.1.2 Binary Random-Access
            Lists Revisited

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

           | ONE of a * (a * a) Seq

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

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


a
        a*a              (a * a) * (a * a)
head, tail



大体 9.2.1 と同じ
lookup
lookup 5
     ONE    ONE     ZERO                   ONE
      1    (2, 3)          (((4, 5), (6, 7)), ((8, 9), (10, 11)))
lookup
lookup 5
     ONE    ONE     ZERO                   ONE
      1    (2, 3)          (((4, 5), (6, 7)), ((8, 9), (10, 11)))



lookup 4
    ZERO    ONE     ZERO                   ONE
           (2, 3)          (((4, 5), (6, 7)), ((8, 9), (10, 11)))
lookup
lookup 4
    ZERO      ONE      ZERO                    ONE
             (2, 3)            (((4, 5), (6, 7)), ((8, 9), (10, 11)))




lookup 2 の左
            ONE       ZERO                   ONE
           (2, 3)            (((4, 5), (6, 7)), ((8, 9), (10, 11)))
lookup
lookup 2 の左
         ONE     ZERO                   ONE
        (2, 3)          (((4, 5), (6, 7)), ((8, 9), (10, 11)))




lookup 1 の左
            ZERO ZERO                   ONE
                        (((4, 5), (6, 7)), ((8, 9), (10, 11)))
lookup
lookup 1 の左
         ZERO ZERO                   ONE
                     (((4, 5), (6, 7)), ((8, 9), (10, 11)))




lookup 0 の右 の左
              ZERO                   ONE
                     (((4, 5), (6, 7)), ((8, 9), (10, 11)))
lookup
lookup 0 の右 の左
          ZERO                   ONE
                 (((4, 5), (6, 7)), ((8, 9), (10, 11)))




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




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

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

          6
update
update 5 20
     ONE    ONE     ZERO                   ONE
      1    (2, 3)          (((4, 5), (6, 7)), ((8, 9), (10, 11)))
update
update 5 20
     ONE     ONE     ZERO                   ONE
      1     (2, 3)          (((4, 5), (6, 7)), ((8, 9), (10, 11)))




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




cons 1 . ZERO . update 2 (20, 7)
             ONE     ZERO                   ONE
            (2, 3)          (((4, 5), (6, 7)), ((8, 9), (10, 11)))
update
cons 1 . ZERO . update 2 (20, 7)
            ONE     ZERO                   ONE
           (2, 3)          (((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)))
update
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))
                  ZERO                   ONE
                         (((4, 5), (6, 7)), ((8, 9), (10, 11)))
update
cons 1 . ZERO . cons (2, 3) . ZERO .
update 0 ((4, 5), (20, 7))
                  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)))
                                         ONE
                         (((4, 5), (6, 7)), ((8, 9), (10, 11)))
update
cons 1 . ZERO . cons (2, 3) . ZERO . ZERO .
update 0 (((4, 5), (20, 7)), ((8, 9), (10, 11)))
                                       ONE
                       (((4, 5), (6, 7)), ((8, 9), (10, 11)))




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




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

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

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



変更する値ではなく、変更する関数を渡すよ
うにする
update
update 5 20
      ONE     ONE     ZERO                    ONE
       1     (2, 3)           (((4, 5), (6, 7)), ((8, 9), (10, 11)))




fupdate (fn _ -> 20) 5
     ONE     ONE      ZERO                   ONE
      1     (2, 3)           (((4, 5), (6, 7)), ((8, 9), (10, 11)))
update
fupdate (fn _ -> 20) 5
     ONE     ONE     ZERO                   ONE
      1     (2, 3)          (((4, 5), (6, 7)), ((8, 9), (10, 11)))




cons 1 . fupdate (fn _ -> 20) 4
     ZERO    ONE     ZERO                   ONE
            (2, 3)          (((4, 5), (6, 7)), ((8, 9), (10, 11)))
update
cons 1 . fupdate (fn x -> 20) 4
     ZERO    ONE     ZERO                   ONE
            (2, 3)          (((4, 5), (6, 7)), ((8, 9), (10, 11)))




cons 1 . ZERO . fupdate (fn (x, y) -> (20, y)) 2
             ONE     ZERO                   ONE
            (2, 3)          (((4, 5), (6, 7)), ((8, 9), (10, 11)))
update
cons 1 . ZERO . fupdate (fn (x, y) -> (20, y)) 2
            ONE     ZERO                   ONE
           (2, 3)          (((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)))
update
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
                  ZERO                    ONE
                          (((4, 5), (6, 7)), ((8, 9), (10, 11)))
update
cons 1 . ZERO . cons (2, 3) . ZERO .
fupdate (fn (w, (x, y)) -> (w, (20, y))) 0
                   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
                                          ONE
                          (((4, 5), (6, 7)), ((8, 9), (10, 11)))
update
cons 1 . ZERO . cons (2, 3) . ZERO . ZERO .
fupdate (fn ((w, (x, y)), z) -> ((w, (20, y)), z)) 0
                                       ONE
                       (((4, 5), (6, 7)), ((8, 9), (10, 11)))




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




    ONE    ONE     ZERO                   ONE
     1    (2, 3)          (((4, 5), (20, 7)), ((8, 9), (10, 11)))

Weitere ähnliche Inhalte

Mehr von rf0444

FRP in Practice
FRP in PracticeFRP in Practice
FRP in Practicerf0444
 
Start FRP
Start FRPStart FRP
Start FRPrf0444
 
PFDS 9.3.2
PFDS 9.3.2PFDS 9.3.2
PFDS 9.3.2rf0444
 
PFDS 9.3.1
PFDS 9.3.1PFDS 9.3.1
PFDS 9.3.1rf0444
 
PFDS 8.4.1
PFDS 8.4.1PFDS 8.4.1
PFDS 8.4.1rf0444
 
PFDS 7.4
PFDS 7.4PFDS 7.4
PFDS 7.4rf0444
 
PFDS 6.4.3
PFDS 6.4.3PFDS 6.4.3
PFDS 6.4.3rf0444
 

Mehr von rf0444 (7)

FRP in Practice
FRP in PracticeFRP in Practice
FRP in Practice
 
Start FRP
Start FRPStart FRP
Start FRP
 
PFDS 9.3.2
PFDS 9.3.2PFDS 9.3.2
PFDS 9.3.2
 
PFDS 9.3.1
PFDS 9.3.1PFDS 9.3.1
PFDS 9.3.1
 
PFDS 8.4.1
PFDS 8.4.1PFDS 8.4.1
PFDS 8.4.1
 
PFDS 7.4
PFDS 7.4PFDS 7.4
PFDS 7.4
 
PFDS 6.4.3
PFDS 6.4.3PFDS 6.4.3
PFDS 6.4.3
 

PFDS 10.1.2 Binary Random-Access List Revisited

  • 1. PFDS 10.1.2 Binary Random-Access List Revisited @rf0444
  • 2. 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))
  • 3. a Seq = NIL | CONS of a * (a * a) Seq NIL 0個 CONS 1 NIL 1個 CONS 1 (CONS (2, 3) NIL) 3個 CONS 1 (CONS (2,3) (CONS ((4,5),(6,7)) NIL)) 7個
  • 4. a Seq = NIL | CONS of a * (a * a) Seq CONS 1 (CONS (2,3) (CONS ((4,5),(6,7)) NIL)) 1個 2個 4個 a a*a (a * a) * (a * a)
  • 5. 9.2.1 Binary Random-Access Lists a Tree = LEAF of a | NODE of a Tree * a Tree a Digit = ZERO | ONE of a Tree a RList = a Digit list ONE ZERO ONE 1 2 3 4 5
  • 6. 9.2.1 Binary Random-Access Lists 型だけ見ると下の構成もできるように見える ONE ZERO ONE サイズが 5 1 2 おかしい 3 4 完全じゃない
  • 7. 10.1.2 Binary Random-Access Lists Revisited a Seq = NIL | ZERO of (a * a) Seq | ONE of a * (a * a) Seq ((a * a) * (a * a)) * ((a * a) * (a * a)) Seq ONE ZERO ONE 1 ((2, 3), (4,5)) a a*a (a * a) * (a * a)
  • 9. lookup lookup 5 ONE ONE ZERO ONE 1 (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 10. lookup lookup 5 ONE ONE ZERO ONE 1 (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11))) lookup 4 ZERO ONE ZERO ONE (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 11. lookup lookup 4 ZERO ONE ZERO ONE (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11))) lookup 2 の左 ONE ZERO ONE (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 12. lookup lookup 2 の左 ONE ZERO ONE (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11))) lookup 1 の左 ZERO ZERO ONE (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 13. lookup lookup 1 の左 ZERO ZERO ONE (((4, 5), (6, 7)), ((8, 9), (10, 11))) lookup 0 の右 の左 ZERO ONE (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 14. lookup lookup 0 の右 の左 ZERO ONE (((4, 5), (6, 7)), ((8, 9), (10, 11))) lookup 0 の左 の右 の左 ONE (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 15. lookup lookup 0 の左 の右 の左 ONE (((4, 5), (6, 7)), ((8, 9), (10, 11))) (((4, 5), (6, 7)), ((8, 9), (10, 11)))  の左 の右 の左 ((4, 5), (6, 7))     の右 の左 (6, 7)        の左 6
  • 16. update update 5 20 ONE ONE ZERO ONE 1 (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 17. update update 5 20 ONE ONE ZERO ONE 1 (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11))) cons 1 . update 4 20 ZERO ONE ZERO ONE (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 18. update cons 1 . update 4 20 ZERO ONE ZERO ONE (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11))) cons 1 . ZERO . update 2 (20, 7) ONE ZERO ONE (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 19. update cons 1 . ZERO . update 2 (20, 7) ONE ZERO ONE (2, 3) (((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)))
  • 20. update 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)) ZERO ONE (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 21. update cons 1 . ZERO . cons (2, 3) . ZERO . update 0 ((4, 5), (20, 7)) 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))) ONE (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 22. update cons 1 . ZERO . cons (2, 3) . ZERO . ZERO . update 0 (((4, 5), (20, 7)), ((8, 9), (10, 11))) ONE (((4, 5), (6, 7)), ((8, 9), (10, 11))) cons 1 . ZERO . cons (2, 3) . ZERO . ZERO ONE (((4, 5), (20, 7)), ((8, 9), (10, 11)))
  • 23. update cons 1 . ZERO . cons (2, 3) . ZERO . ZERO ONE (((4, 5), (20, 7)), ((8, 9), (10, 11))) ONE ONE ZERO ONE 1 (2, 3) (((4, 5), (20, 7)), ((8, 9), (10, 11)))
  • 24. update 先頭要素が ZERO の時に毎回 lookup が走る 結果、update は O(log^2 n) 変更する値ではなく、変更する関数を渡すよ うにする
  • 25. update update 5 20 ONE ONE ZERO ONE 1 (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11))) fupdate (fn _ -> 20) 5 ONE ONE ZERO ONE 1 (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 26. update fupdate (fn _ -> 20) 5 ONE ONE ZERO ONE 1 (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11))) cons 1 . fupdate (fn _ -> 20) 4 ZERO ONE ZERO ONE (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 27. update cons 1 . fupdate (fn x -> 20) 4 ZERO ONE ZERO ONE (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11))) cons 1 . ZERO . fupdate (fn (x, y) -> (20, y)) 2 ONE ZERO ONE (2, 3) (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 28. update cons 1 . ZERO . fupdate (fn (x, y) -> (20, y)) 2 ONE ZERO ONE (2, 3) (((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)))
  • 29. update 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 ZERO ONE (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 30. update cons 1 . ZERO . cons (2, 3) . ZERO . fupdate (fn (w, (x, y)) -> (w, (20, y))) 0 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 ONE (((4, 5), (6, 7)), ((8, 9), (10, 11)))
  • 31. update cons 1 . ZERO . cons (2, 3) . ZERO . ZERO . fupdate (fn ((w, (x, y)), z) -> ((w, (20, y)), z)) 0 ONE (((4, 5), (6, 7)), ((8, 9), (10, 11))) cons 1 . ZERO . cons (2, 3) . ZERO . ZERO ONE (((4, 5), (20, 7)), ((8, 9), (10, 11)))
  • 32. update cons 1 . ZERO . cons (2, 3) . ZERO . ZERO ONE (((4, 5), (20, 7)), ((8, 9), (10, 11))) ONE ONE ZERO ONE 1 (2, 3) (((4, 5), (20, 7)), ((8, 9), (10, 11)))