SlideShare una empresa de Scribd logo
1 de 42
Descargar para leer sin conexión
ナイーブツリーの
入れ子集合
@akuraru
自己紹介
•

akuraru
!

•

iOSプログラマ

•

SQLはチューリング完全って聞いてた
注意
•

このスライドでは上が子になる図を使っています

子

親
ナイーブツリー
•

SQLのアンチパターン

•

再帰が使えれば問題ない

•

使えない場合の解決策として以下がある
•

経路列挙

•

入れ子集合

•

閉包テーブル
!

•

詳しくはSQLアンチパターンを読んでください
入れ子集合だけ詳しく説明してみる
概要:入れ子集合とは
•

Lelt値とRight値で親子関係を示す。

•

あるノードのL値はすべての子のL値より小さく、
R値はすべての子のR値より大きい

•

L値はR値より小さい
図解

Left値とRight値を割り当てていく
図解

L値: 2

L値: 1

Left値とRight値を割り当てていく
図解
L値: 3

L値: 2

1

Left値とRight値を割り当てていく
図解
L値: 3

R値: 4

2

1

Left値とRight値を割り当てていく
図解
3

R値: 4

2

R値: 5

1

Left値とRight値を割り当てていく
図解
3

4

2

5

6

1

Left値とRight値を割り当てていく
図解
3

4

2

7

5

6

1

Left値とRight値を割り当てていく
図解
3

4

2

7

8

5

6

1

Left値とRight値を割り当てていく
図解
3

4

2

7

8

9

5

6

11

1

12

Left値とRight値を割り当てていく

10
図解
3

4

2

L値すべてサブツリーの

7

8

9

5

6

11

1

12

L値より小さい

Left値とRight値を割り当てていく

10
図解
3

4

2

7

8

9

5

6

11

1

10

12
R値すべてサブツリーの
R値より小さい

Left値とRight値を割り当てていく
図解
3

4

2

7

8

9

5

6

11

1

12

図をわかりやすくしてみます

10
図解
3

2

4

7

5

6

1

8

9 10

11

12

数字を等間隔に配置
図解
3
2

4

7
5

6

1

8

9

10
11
12

縦幅を小さくする
図解

1

2

3

4

5

6

7

8

9

10

Left値を  で表し、Right値を  で表す

11 12
図解

1

2

3

4

5

6

7

8

9

10

11 12
図解

1

2

3

4

5

6

7

8

9

10

11 12

L値すべてサブツリーの

R値すべてサブツリーの

L値より小さい

R値より小さい
図解

1

2

3

4

5

6

7

8

9

L値はR値より小さい

10

11 12
子孫ツリーの取得
(L値が1∼12のノード)

1

2

3

4

5

6

7

8

間にあるのが子孫

9

10

11 12
根の子孫ツリーの取得
(L値が1∼12のノード)

1

2

3

4

5

6

7

8

9

10

間にあるのが子孫
2,3,6,7,9がL値のノードが子

11 12
L:R=7:8の親の取得
(L値<7<R値 のノード)

1

2

3

4

5

6

7

8

9

10

11 12
L:R=7:8の親の取得
(L値<7<R値 のノード)

1

2

3

4

5

6

7

8

9

10

11 12

1:12と6:9が親
そのうちL値が最大のノードが直近の親
L:R=2:4 にノードを追加する

1

2

3

4

5

6

7

8

9

10

11 12

この位置(親になるノードのR値)に追加する
L:R=2:4 にノードを追加する

1

2

3

4

5

6

7

8

9

10

5以上のLR値をすべて+2する

11 12 13

14
L:R=2:4 にノードを追加する

1

2

3

4

5

6

7

間に挿入

8

9

10

11 12 13

14
L:R=2:4 の親になるように
ノードのを追加する

1

2

3

4

5

6

7

8

9

10

11 12
L:R=2:4 の親になるように
ノードのを追加する

1

2

3

4

5

6

7

8

9

10

11 12 13

R値+1(6)以上のLR値をすべて+2する

14
L:R=2:4 の親になるように
ノードのを追加する

1

2

3

4

5

6

7

8

9

10

L値以上、R値以下のLR値を
すべて+1する

11 12 13

14
L:R=2:4 の親になるように
ノードのを追加する

1

2

3

4

5

6

7

8

9

10

L値、R値+2のノードを追加

11 12 13

14
L:R=2:4 の親になるように
ノードのを追加する

1

2

3

4

5

6

7

8

9

10

11 12 13

親子関係は自動的に解決される

14
L:R=2:5の削除

1

2

3

4

5

6

7

8

9

10

11 12
L:R=2:5の削除

1

2

3

4

5

6

7

削除する

8

9

10

11 12
L:R=2:5の削除

1

2

3

4

5

6

7

8

9

10

自動的に親子関係は解決される
開いた番号はほっといても良い

11 12
更新

•

削除して追加すればいいじゃん
連番
•

削除すると連番でなくなる

•

なくすこともできるがアルゴリズムが複雑になっ
て大変

•

別に連番じゃなくても問題無い

•

人間が見て気持ち悪いなんて甘え
まとめ
•

ORMとかが実際にやってくれたりするので、こ
んなこと気にしてはいけない。

•

案件に対して合っている木の構造を選ぶことが
大事

Más contenido relacionado

Más de Akura Pi

Metaprogramming
MetaprogrammingMetaprogramming
MetaprogrammingAkura Pi
 
Ns user defaults
Ns user defaultsNs user defaults
Ns user defaultsAkura Pi
 
Storyboard
StoryboardStoryboard
StoryboardAkura Pi
 
Mvcのすすめ
MvcのすすめMvcのすすめ
MvcのすすめAkura Pi
 
Groovy base
Groovy baseGroovy base
Groovy baseAkura Pi
 

Más de Akura Pi (6)

Metaprogramming
MetaprogrammingMetaprogramming
Metaprogramming
 
Ns user defaults
Ns user defaultsNs user defaults
Ns user defaults
 
Currying
CurryingCurrying
Currying
 
Storyboard
StoryboardStoryboard
Storyboard
 
Mvcのすすめ
MvcのすすめMvcのすすめ
Mvcのすすめ
 
Groovy base
Groovy baseGroovy base
Groovy base
 

ナイーブツリーの入れ子集合