27
PFDS 9.3.1 Skew Binary Random-Access Lists @rf0444

PFDS 9.3.1

  • Upload
    rf0444

  • View
    509

  • Download
    4

Embed Size (px)

Citation preview

Page 1: PFDS 9.3.1

PFDS 9.3.1Skew Binary

Random-Access Lists

@rf0444

Page 2: PFDS 9.3.1

Skew Binary Numbers

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

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

Page 3: PFDS 9.3.1

Skew Binary Numbers

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

完全二分木のノード数

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

cons, head, tail を O(1) に

Page 4: PFDS 9.3.1

データ構造

完全二分木のリスト

木のサイズは持っておく

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

先頭2つは同じサイズでもよい

Page 5: PFDS 9.3.1

データ構造

9 8 7

6 3

5 4 2 1

サイズ 9 の例

Page 6: PFDS 9.3.1

cons

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

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

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

Page 7: PFDS 9.3.1

cons

1

1

[ ]

Page 8: PFDS 9.3.1

cons

1

2

2 1

Page 9: PFDS 9.3.1

cons

2 1

3

3

2 1

Page 10: PFDS 9.3.1

cons

3

2 1

4

3

2 1

4

Page 11: PFDS 9.3.1

cons

34

2 1

5

35 4

2 1

Page 12: PFDS 9.3.1

cons

35 4

2 1

6

6 3

5 4 2 1

Page 13: PFDS 9.3.1

cons

6 3

5 4 2 1

7

7

6 3

5 4 2 1

Page 14: PFDS 9.3.1

cons

7

6 3

5 4 2 1

8

8 7

6 3

5 4 2 1

Page 15: PFDS 9.3.1

cons

8 7

6 3

5 4 2 1

9 8 7

6 3

5 4 2 1

9

Page 16: PFDS 9.3.1

cons

10

9 8

7

6 3

5 4 2 1

9 8 7

6 3

5 4 2 1

10

Page 17: PFDS 9.3.1

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

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

head

Page 18: PFDS 9.3.1

先頭木が単一要素なら

リストを tail

そうでなければ

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

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

tail

Page 19: PFDS 9.3.1

8 7

6 3

5 4 2 1

head, tail

9 8 7

6 3

5 4 2 1

Page 20: PFDS 9.3.1

head, tail

10

9 8

7

6 3

5 4 2 1

9 8 7

6 3

5 4 2 1

Page 21: PFDS 9.3.1

lookup

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

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

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

Page 22: PFDS 9.3.1

lookup

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

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

超えていれば、右側 i - 1 - (子のサイズ) 番目

Page 23: PFDS 9.3.1

lookup

10

9 8

7

6 3

5 4 2 1

7

6 3

5 4 2 1

8 8 - 3 = 5 < 7

Page 24: PFDS 9.3.1

lookup

7

6 3

5 4 2 1

5 5 > 3

3

2 1

5 - 1 - 3 = 1

1

Page 25: PFDS 9.3.1

lookup1 1 <= 1

2

1 - 1 = 0

03

2 1

Page 26: PFDS 9.3.1

update

lookup と同じように作れる

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

Page 27: PFDS 9.3.1

計算量

cons

head

tail

lookup

update

O(1)

O(1)

O(1)

O(log n)

O(log n)