離散数学 スキップリスト...

27
スキップリスト (スキップグラフ) 落合 秀也 離散数学

Upload: others

Post on 23-Jul-2021

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップリスト(スキップグラフ)

落合秀也

離散数学

Page 2: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

今日の内容

•連結リスト (復習)

• スキップリスト

• スキップグラフ

2

Page 3: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

連結リスト (復習)

• 「値とnextポインタ」で構成された要素(ノード)を連結して作られる値のリスト

3

8 67134開始

4

struct list_element {int value;struct list_element* next;

};値 nextポインタ

nil or null (終了)を意味する

Page 4: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

連結リストにおける検索

値xを持つノードを検索(search)する場合

4

8 67134開始

struct list_element* search(int x){struct list_element* p=start;while((p=p->next)!=null){if ( p->value == x ){

return p;}

} return null;

}

開始点からnextポインタをつたって、そのノードの値がxと一致するまで探索する(あるいはnextポインタ=nullで終了する)

Page 5: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

連結リストにおける挿入・削除

• 8の後ろに2を入れたい場合: insert(8,2)の操作• 2へのポインタをqとする• 8をsearchした結果をpとする• pp=p->nextと置く• p->next=q, q->next=ppと置く

5

8 67134開始

8 67134開始

2

p pp

q next

next

• 8を削除したい場合: delete(8)の操作• 8をsearchした結果をpとする (8の前をppとする)• pp->next=p->nextと置く

pp pnext next

Page 6: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

連結リストの計算量

• 検索の場合• 検索対象の出現パターンに依存するが、すべて等しい確率で出現すると仮定すると、期待値 n/2回の操作でヒットする。

• ヒットしない場合: n回の操作が必要

いずれにしても O(n)

• 挿入・削除の場合• 検索したのちに、ポインタの組換え操作を行う: O(n)

• 先頭にだけ挿入する場合は O(1)6

8 67134開始

n

Page 7: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

今日の内容

•連結リスト (復習)

• スキップリスト

• スキップグラフ

7

Page 8: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

連結リストの高速化を考える

•順序関係が定義される値であれば、順序関係に基づいて、ソートしておくことによって、リストでの検索効率を向上させることができる

具体的にはスキップリスト

8

8 67134開始

7 86431開始

昇順にソートされた連結リストの例

Page 9: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

• 通常の連結リストは各駅停車である

• スキップリストでは快速、準急、急行、特急を用意する

• 高速化のレベルを L0, L1, L2, L3, … と呼ぶことにする

スキップリストの高速化原理

9

1 2 3 4 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0

L1

L2

L3

L4

Page 10: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップリストの階層の作り方• スキップリストでは「レベル Liに属するノードが、確率pで、レベルLi+1に属する」ように階層を作る。pには1/2や1/4などが使われる。

• Headの直後のノードはすべてのレベルに属する

• 平均的に Li+1に属するノード数 = p×Liに属するノード数 となる。

• L0のノード数をnとすると、Liに属するノード数の期待値は npiとなる。

10

1 2 3 4 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0

L1

L2

L3

L4

Page 11: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップリストの検索• xを検索する場合を考える

• 上位の階層から検索を始める

• Liで pi≦ x < qi (or nil) となる pi, qiを見つける (pi, qiはLiで直前直後の関係にあるものとする)

• Li-1で piから開始し、pi-1≦ x < qi-1となるとなる pi-1, qi-1を見つける (pi-1, qi-1はLi-1で直前直後の関係にあるものとする)

• 同様の操作を繰り返す (どこかの時点で、x=pとなればそこで終了。あるいはL0まで検索して見つからなければ終了)

11

1 2 3 4 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0

L1

L2

L3

L4 例: 9の検索1 ≦ 9 < (nil)

1 ≦ 9 < 10

6≦ 9 < 10

8≦ 9 < 10

Page 12: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

練習• 以下のスキップリストにおいて

• 5の検索• 7の検索• 11の検索• 12の検索

を行った際の探索経路をそれぞれ図示せよ (水平移動の操作数も数えてみよ)

12

1 2 3 4 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0

L1

L2

L3

L4

Page 13: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

解1/4: 5の検索

13

1 2 3 4 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0

L1

L2

L3

L4 1 ≦ 5 < (nil)

1 ≦ 5 < 10

1 ≦ 5 < 6

3 ≦ 5 < 6

水平移動の操作数: 4回

Page 14: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

解2/4: 7の検索

14

1 2 3 4 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0

L1

L2

L3

L4 1 ≦ 5 < (nil)

1 ≦ 5 < 10

6≦ 7 < 10

6≦ 7 < 8

水平移動の操作数: 3回

Page 15: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

解3/4: 11の検索

15

1 2 3 4 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0

L1

L2

L3

L4 1 ≦ 11 < (nil)

10 ≦ 11 < (nil)

水平移動の操作数: 3回

10 ≦ 11 < (nil)

10 ≦ 11 < 12

Page 16: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

解4/4: 12の検索

16

1 2 3 4 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0

L1

L2

L3

L4 1 ≦ 12 < (nil)

10 ≦ 12 < (nil)

水平移動の操作数: 3回

10 ≦ 12 < (nil)

12 = 12

Page 17: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップリストへのノードの挿入

17

1 2 3 4 5

6

7 8 9 10 11 12H

1 3

6

8 10 12H

1

6

10H

1 10H

1H

L0

L1

L2

L3

L4

6 を挿入する場合: insert(6) (1) 6がどのレベルにまで入るかを乱数を用いて確率的に選ぶ以下の例では L2まで(2) p<6<qとなるp, qを該当する各レベルで求め、p.next = &6; 6.next = q とする

1 ≦ 6 < (nil)

1 ≦ 6 < 10

1 ≦ 6 < 10

3≦ 6 < 8

5 ≦ 6 < 7

Page 18: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップリストからのノードの削除

18

1 2 3 4 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0

L1

L2

L3

L4 1 ≦ 6 < (nil)

1 ≦ 6 < 10

6 < 10

6 を削除する場合: delete(6) p<6<qとなるp, qを該当する各レベルで求め、p.next = q とする

1 < 6

3 < 6 6 < 8

6 < 75 < 6

Page 19: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップリストの計算量

• スキップリストは、確率的に作られる。そのため、期待値で考えることにする (以下、nはリスト長, pは確率)• まず、階層の高さNは npN = 1より (1/p)N=n

∴ N= log1/p n

• 各レベルでのホップ数は、オーダーで 1/p

• よって、探索の数は• N×1/p = ( log1/p n ) / p

•通常 pは定数なので O(log n) となる19

3 6 10 12

3 12

Li

Li+1確率pで選出: ノード数は p倍になる

Li+1での1区間あたりのLiでのノード数は 1/p個になる

Page 20: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップリストの強み• 各ノードをインターネット上のPCとして考えてみよう

=分散環境を考える

• 検索は、広域に渡って行われるが、ノードの追加・削除の操作は、各レベルでの隣接ノードとの関係で行われる

平衡二分探索木の場合は、広域ロックをする必要がある。

20

1 2 3 4 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0L1L2L3L4

Page 21: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

今日の内容

•連結リスト (復習)

• スキップリスト

• スキップグラフ

21

Page 22: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップグラフ

• スキップリストをベースに(分散環境への応用を目的に)開発されたデータ構造• 完全な自律分散を実現• 耐障害性を向上

• スキップグラフの特徴• 双方向連結リスト• どのノードからでも検索を開始できる• 各レベルに複数の双方向連結リストが存在

スキップリストの特徴• 単方向連結リスト。探索開始ノードが決まっていた。各レベルには一つの連結リスト

• 障害性に強くない (1ノードが消えると、修復が難しい)

22

Page 23: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップリストの耐障害性

23

1 2 3 4 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0L1L2L3L4

障害発生!!

1 2 3 5 6 7 8 9 10 11 12H

1 3 6 8 10 12H

1 6 10H

1 10H

1H

L0L1L2L3L4

5を検索できなくなる3から5への接続をどう修復する?

Page 24: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップグラフ• 双方向連結リスト

• どのノードからでも検索を開始できる

• 各レベルに複数の連結リストが存在

24

1 2 3 4 5 6 7 8 9 10 11 12

3 6 8 10 12

3 6 10

3 10

1 4 7 9 11

1 7 11

1 11

L0

L1

L2

L3

完全に分散耐障害性の向上

Page 25: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップグラフでの検索方法

25

1 2 3 4 5 6 7 8 9 10 11 12

3 6 8 10 12

3 6 10

3 10

1 4 7 9 11

1 7 11

1 11

L0

L1

L2

L3

例: ノード10 からノード4を検索する場合

スキップリストと同じように考えれば良い

Page 26: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

スキップグラフの耐障害性•特定のノードが消失して、ある探索パスで到達できなくても、別の探索パス(=バックアップパス)が存在すれば、耐障害性がある、と言える

26

1 2 3 4 5 6 7 8 9 10 11 12

3 6 8 10 12

3 6 10

3 10

1 4 7 9 11

1 7 11

1 11

L0

L1

L2

L3

例: ノード4の検索

Page 27: 離散数学 スキップリスト スキップグラフjo2lxq/dm/lecture/11.pdf連結リスト(復習) •「値とnextポインタ」で構成された要素(ノード)を連 結して作られる値のリスト

今日の内容

•連結リスト (復習)

• スキップリスト

• スキップグラフ

27