SlideShare une entreprise Scribd logo
1  sur  27
Télécharger pour lire hors ligne
PFDS 9.3.1
   Skew Binary
Random-Access Lists

                @rf0444
Skew Binary Numbers

重みを 1, 3, 7, 15, 31, 63, ... にする



inc と dec が O(1) でできる
Skew Binary Numbers

重みを 1, 3, 7, 15, 31, 63, ... にする

  完全二分木のノード数

inc と dec が O(1) でできる

  cons, head, tail を O(1) に
データ構造

完全二分木のリスト

 木のサイズは持っておく

 後ろほどサイズが大きくなる

 先頭2つは同じサイズでもよい
データ構造
サイズ 9 の例




      9    8       7

               6       3

               5 4 2       1
cons


先頭2つの木のサイズが同じならくっつける

 新しい木のサイズは 1 + 2 w

そうでなければ、単一要素を追加
cons   1



[]


                1
cons   2




1              2   1
cons   3




2   1                  3

                   2       1
cons   4




    3              4       3

2       1              2       1
cons   5




4       3              5   4       3

    2       1                  2       1
cons   6




5   4       3                  6       3

        2       1          5 4     2       1
cons   7




6         3                      7

5 4   2       1              6       3

                             5 4 2       1
cons   8




    7                      8       7

6       3                      6       3

5 4 2       1                  5 4 2       1
cons       9




8       7                  9       8       7

    6       3                          6       3

    5 4 2       1                      5 4 2       1
cons     10




9   8       7               10           7

        6       3       9        8   6       3

        5 4 2       1                5 4 2       1
head


先頭木が単一要素なら、その要素

そうでなければ、ルートの要素
tail

先頭木が単一要素なら

 リストを tail

そうでなければ

 ルートの子をリストに追加、自身は削除

  子のサイズは floor (w / 2)
head, tail


9   8       7           8       7

        6       3           6       3

        5 4 2       1       5 4 2       1
head, tail


    10           7           9   8       7

9        8   6       3               6       3

             5 4 2       1           5 4 2       1
lookup


i が先頭木のサイズ以上なら

 先頭木のサイズを引いて次のリストへ

そうでなければ、その木の i 番目
lookup


その木の 0 番目の要素は、そのルート

i が子のサイズ以下なら、左側 i - 1 番目

超えていれば、右側 i - 1 - (子のサイズ) 番目
lookup
    8                        8-3=5       <7



    10           7                       7

9        8   6       3               6       3

             5 4 2       1           5 4 2       1
lookup
5                      5>3
                       5-1-3=1

        7
                             1
    6       3                        3

    5 4 2       1                2       1
lookup
1                  1 <= 1
                   1-1=0

        3
                         0
    2       1                2
update


lookup と同じように作れる

 子を探しにいく → 子を作り直す
計算量

 cons        O(1)

head         O(1)

 tail        O(1)

lookup     O(log n)

update     O(log n)

Contenu connexe

Plus de rf0444

FRP in Practice
FRP in PracticeFRP in Practice
FRP in Practicerf0444
 
Start FRP
Start FRPStart FRP
Start FRPrf0444
 
PFDS 11.2.2
PFDS 11.2.2PFDS 11.2.2
PFDS 11.2.2rf0444
 
PFDS 10.1.2
PFDS 10.1.2PFDS 10.1.2
PFDS 10.1.2rf0444
 
PFDS 9.3.2
PFDS 9.3.2PFDS 9.3.2
PFDS 9.3.2rf0444
 
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
 
Tapl 5
Tapl 5Tapl 5
Tapl 5rf0444
 
Haskellday rf
Haskellday rfHaskellday rf
Haskellday rfrf0444
 
PFDS 6.4.3
PFDS 6.4.3PFDS 6.4.3
PFDS 6.4.3rf0444
 

Plus de rf0444 (11)

SWF
SWFSWF
SWF
 
FRP in Practice
FRP in PracticeFRP in Practice
FRP in Practice
 
Start FRP
Start FRPStart FRP
Start FRP
 
PFDS 11.2.2
PFDS 11.2.2PFDS 11.2.2
PFDS 11.2.2
 
PFDS 10.1.2
PFDS 10.1.2PFDS 10.1.2
PFDS 10.1.2
 
PFDS 9.3.2
PFDS 9.3.2PFDS 9.3.2
PFDS 9.3.2
 
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
 
Tapl 5
Tapl 5Tapl 5
Tapl 5
 
Haskellday rf
Haskellday rfHaskellday rf
Haskellday rf
 
PFDS 6.4.3
PFDS 6.4.3PFDS 6.4.3
PFDS 6.4.3
 

PFDS 9.3.1