pfds 9.3.1
TRANSCRIPT
PFDS 9.3.1Skew 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 8 7
6 3
5 4 2 1
サイズ 9 の例
cons
先頭2つの木のサイズが同じならくっつける
新しい木のサイズは 1 + 2 w
そうでなければ、単一要素を追加
cons
1
1
[ ]
cons
1
2
2 1
cons
2 1
3
3
2 1
cons
3
2 1
4
3
2 1
4
cons
34
2 1
5
35 4
2 1
cons
35 4
2 1
6
6 3
5 4 2 1
cons
6 3
5 4 2 1
7
7
6 3
5 4 2 1
cons
7
6 3
5 4 2 1
8
8 7
6 3
5 4 2 1
cons
8 7
6 3
5 4 2 1
9 8 7
6 3
5 4 2 1
9
cons
10
9 8
7
6 3
5 4 2 1
9 8 7
6 3
5 4 2 1
10
先頭木が単一要素なら、その要素
そうでなければ、ルートの要素
head
先頭木が単一要素なら
リストを tail
そうでなければ
ルートの子をリストに追加、自身は削除
子のサイズは floor (w / 2)
tail
8 7
6 3
5 4 2 1
head, tail
9 8 7
6 3
5 4 2 1
head, tail
10
9 8
7
6 3
5 4 2 1
9 8 7
6 3
5 4 2 1
lookup
i が先頭木のサイズ以上なら
先頭木のサイズを引いて次のリストへ
そうでなければ、その木の i 番目
lookup
その木の 0 番目の要素は、そのルート
i が子のサイズ以下なら、左側 i - 1 番目
超えていれば、右側 i - 1 - (子のサイズ) 番目
lookup
10
9 8
7
6 3
5 4 2 1
7
6 3
5 4 2 1
8 8 - 3 = 5 < 7
lookup
7
6 3
5 4 2 1
5 5 > 3
3
2 1
5 - 1 - 3 = 1
1
lookup1 1 <= 1
2
1 - 1 = 0
03
2 1
update
lookup と同じように作れる
子を探しにいく → 子を作り直す
計算量
cons
head
tail
lookup
update
O(1)
O(1)
O(1)
O(log n)
O(log n)