Microsoft PowerPoint - 7.pptx

Similar documents
Microsoft PowerPoint - algo ppt [互換モード]

Microsoft PowerPoint - 05.pptx

Taro-2分探索木Ⅰ(公開版).jtd

PowerPoint Presentation

Microsoft PowerPoint - kougi10.ppt

memo

Taro-2分探索木Ⅱ(公開版).jtd

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft Word - 13

Microsoft PowerPoint - 06.pptx

PowerPoint Presentation

Microsoft Word - no206.docx

Microsoft PowerPoint - 6.pptx

Microsoft PowerPoint - ad11-09.pptx

memo

第2回

Microsoft Word - NonGenTree.doc

PowerPoint Presentation

Microsoft PowerPoint - 5.pptx

Microsoft PowerPoint - kougi11.ppt

データ構造

Microsoft Word - 中間試験 その1_解答例.doc

プログラム言語及び演習Ⅲ

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

PowerPoint Presentation

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

memo

離散数学

Microsoft PowerPoint - 10.pptx

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft PowerPoint - DA1_2018.pptx

Microsoft PowerPoint - 13approx.pptx

PowerPoint Template

INTRODUCTION TO ALGORITHMS

Microsoft Word - 12

Taro-再帰関数Ⅲ(公開版).jtd

memo

2015年度 2次数学セレクション(整数と数列)

memo

alg2015-6r3.ppt

Microsoft PowerPoint - ca ppt [互換モード]

memo

Microsoft PowerPoint - DA2_2018.pptx

PowerPoint Presentation

模擬試験問題(第1章~第3章)

Microsoft PowerPoint - DA2_2017.pptx

Taro-リストⅠ(公開版).jtd

Microsoft PowerPoint - DA1_2019.pptx

Microsoft PowerPoint - 9.pptx

Microsoft PowerPoint - 9.pptx

Microsoft PowerPoint - 13.ppt [互換モード]

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

Microsoft PowerPoint - kougi9.ppt

PowerPoint プレゼンテーション

学習指導要領

Microsoft PowerPoint - DA2_2017.pptx

論理と計算(2)

…好きです 解説

Taro-再帰関数Ⅱ(公開版).jtd

[Problem F] 古い記憶 良さそうな方法は思いつかなかった アイディア募集中!!! かなり強引に解いている 各判定データに対して 30 秒程度かかる 元の文章と改ざん文章の関係を考える ウィルス感染の可能性は高々 2 回であり 各々の感染では 1 文字削除 1 文字追加 1 文字変更が行われ

Microsoft PowerPoint - ca ppt [互換モード]

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

プログラミングI第10回

Microsoft Word - no205.docx

オートマトンと言語

Microsoft Word - no12.doc

第12回:木構造

PowerPoint プレゼンテーション

Microsoft PowerPoint - lecture02.pptx

2017年度 金沢大・理系数学

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

2011年度 筑波大・理系数学

20~22.prt

Microsoft PowerPoint - 7.pptx

Microsoft PowerPoint - DA2_2018.pptx

Microsoft Word - 漸化式の解法NEW.DOCX

喨微勃挹稉弑

2014年度 東京大・文系数学

2011年度 大阪大・理系数学

2015-2018年度 2次数学セレクション(整数と数列)解答解説

Microsoft PowerPoint - 10.pptx

Math-Aquarium 例題 図形と計量 図形と計量 1 直角三角形と三角比 P 木の先端を P, 根元を Q とする A 地点の目の位置 A' から 木の先端への仰角が 30,A から 7m 離れた AQB=90 と なる B 地点の目の位置 B' から木の先端への仰角が 45 であ るとき,

PG13-6S

ファイナンスのための数学基礎 第1回 オリエンテーション、ベクトル

プログラミング基礎

2011年度 東京大・文系数学

簡単な検索と整列(ソート)

自己紹介 ( 専門分野 ) プログラミング言語の研究 特に基礎理論 研究の出発点 : 自分がうまくプログラムが書けないのを言語のせいにする プログラムの間違いを自動発見する仕組みを作る そもそも間違いを犯しにくいプログラミング言語を作る

DVIOUT-SS_Ma

Microsoft PowerPoint - e-stat(OLS).pptx

LIFO(last in first out, ) 1 FIFO(first in first out, ) 2 2 PUSH POP : 1

データ構造

データ解析

スライド 1

論理と計算(2)

Microsoft PowerPoint - H21生物計算化学2.ppt

2018年度 筑波大・理系数学

文字数は1~6なので 同じ本数の枝を持つパスで生成される呪文の長さは最大で6 倍の差がある 例えば 上図のようなケースを考える 1サイクル終了した時点では スター節点のところに最強呪文として aaaaaac が求まる しかしながら サイクルを繰り返していくと やがてスター節点のところに aaaaaa

Transcription:

7. 木構造 7-1. データ構造としての木 グラフ理論での木の定義 根付き木 7-2.2 分探索木 7-3. 高度な木 ( 平衡木 ) AVL 木 B 木 1

7-1 1. データ構造としての木 2

木構造 木構造を表すデータ構造の一つとしてヒープがある しかし ヒープでは 配列を用いプではるため 要素数で木の形状が一通りに決定してしまった ここでは 再帰的なデータ構造を用いることにより より柔軟な木構造が構築可能なより柔軟な木構造が構築可能なことを見ていく 3

グラフ理論における木 グラフ理論では 木は以下のように定義される 定義 : ( グラフ理論での ) 木 閉路のない連結なグラフ 4

木の性質 N 点からなる木の辺数は N-1 である 木に1 辺を加えると 閉路ができる ( 閉路の無い連結グラフで辺数が最大である ) 木から1 辺を削除すると 非連結になる ( 木は 連結グラフで辺数が最小である 任意の 2 点からなる道は唯一に定まる 特に 最後の性質は ファイルシステムに利用されている 5

木の用語定義 木の各頂点をノードという 木の特別な1つの頂点を根といい 根の指定された木を根付き木という ( 根以外の ) 次数 1の点を葉という 根からの道の長さを深さという 最大の道の長さを高さという ある頂点 vに対して 根に向かう道で 一番近い頂点をv の親という 頂点 vを親とする頂点 wを 頂点 vの子という ある頂点 v に対して v の子孫からなる部分グラフを頂点 vにおける部分木という 6

木に関する用語 1 深さ : 根までの道の長さ 高さ : 木中の最大の深さ 根 深さ0 高さ 3 ノード u 親 深さ 1 子 v 深さ 2 深さ 3 葉 7

木に関する用語 2 部分木 : ある頂点の子孫からなる部分グラフ 根 v 親 子孫 u 部分木 8

2 分木 高々 2 つの子しかない木 左と右の子を区別する 親 左の子 右の子 9

データ構造としての木 2つの子供を直接ポインタで指すようにする ノードを再帰的なデータ構造として定義する 葉では 子供を指すポインタ2つに対して 双方ともNULLにする 10

データ構造の基本単位 ( ノード ) 自己参照構造体を用いる struct node { double data; struct node * left;/* 左の子供を指す */ struct node * right;/* 右の子供を指す */ }; 11

strcut node 型 イメージ data left right strcut tnode 型 data left right 12

ノード型の定義 typedef strcuct node Node; data lf left right Node 型 Node * 型 root 13

データ構造としての 2 分木 root 6 5 9 NULL NULL 3 8 NULL NULL NULL 14

データ構造としての 2 分木 2 6 5 9 3 8 右の子が無い 根は全ての子供が NULL 15

7-2.2 分探索木 2 分木 各頂点 v に対して 左の子を根とする部分木 ( 左の子孫 ) のデータは頂点 vのデータ未満 右の子を根する部分木 ( 右の子孫 ) のデータは頂点 vのデータ以上 16

イメージ (2 分探索木 ) 条件が再帰的になっていることに注意する v left right < v v 17

様々な 2 分探索木 6 5 9 8 9 3 8 6 8 5 9 3 5 3 6 18

2 分探索木ではない木 5 6 8 9 8 3 9 6 3 5 5 6 3 9 8 19

練習次の木が 2 分探索木であるか答えよ (1) 2 4 5 (2) 4 3 5 1 3 1 2 (3) (4) 3 2 2 5 1 4 4 1 5 3 20

練習 { 1, 2, 3} の3つのデータを2 分探索木に保存するとき 2 分探索木の形状を全て示せ 21

2 分探索木における探索 2 分探索木の性質を利用する ある頂点 v のデータと キーの値の大小関係を調の値の大小関係を調べる キーが小さければ 左の子孫を調べる ( 左の子に再帰的に探索を繰り返す ) キーが大きければ 右の子孫を調べる 根から探索を開始する ( 探索の概略は 配列における 2 分探索との類似点がある ) 22

2 分探索木を用いた探索の実現 /* 2 分探索木による探索 */ 1. Node* search(node* node,double key){ 2. if(node==null)return NULL;/* 基礎 */ 3. else{ /* 帰納 */ 4. if(node->data==key)return node;/* 発見 */ 5. else if(key<node->data){/* 小さい方 */ 6. return search(node->left,key); 7. }else if(node->data<key){/* 大きい方 */ 8. return search(node->right,key); 9. } 10. } 11.} 呼び出し方 Node *pos; pos=search(root,key); 23

参考 2 分探索の実現 ( 再帰版 ) /* 再帰版 2 分探索 */ 1. int search(double k,int left,int right){ 2. int mid; 3. if(left>right)return -1;/* 基礎 */ 4. else{ /* 帰納 */ 5. mid=(left+right)/2; 6. if(a[mid]==k)return mid;/* 発見 */ 7. else if(k<a[mid]){/* 小さい方 */ 8. return search(k,left,mid-1);, 9. }else if(a[mid]<k){/* 大きい方 */ 10. return search(k,mid+1,right); 11. } 12. } 13.} 24

探索の動き 1 6 8 6 5 9 5 9 8 3 8 3 8 6 5 9 3 8 8 25

6 探索の動き 2 4 6 5 9 5 4 9 3 8 3 8 6 6 5 9 5 9 3 4 8 return NULL; 3 4 8 26

練習 下記のデータ構造に対して 7を探索するときの動作および10 を探索するときの動作を示せ 6 7 5 9 3 8 27

高さの高い 2 分探索木 高さ n n 2 分探索木の高さは n になるこもある 28

高さの低い 2 分探索木 高さ log2 n 完全 2 分木状になれば 2 分探索木の高さは log n である 2 29

2 分探索木における探索計算量 2 分探索木における探索では 高さに比例した時間計算量が必要である 最悪の場合を考慮 n すると 高さがの場合が存在する したがって 2 分探索木における探索の最悪時間計算量は On ( ) 時間 である この場合は線形探索と同じように探索される 30

2 分探索木への挿入 探索と同様に 挿入データ v の 2 分探索木での位置を求める 子供がない位置に 新しく v を子供として追加する 31

2 分探索木への挿入の実現 1 /* 2 分探索木への挿入位置を求める 親を返す ( 概略 ) */ 1. Node* find_pos(node* node,double value){ 2. if(value< node->data){/* 左部分木への挿入 */ 3. if(node->left==null){/* 左子が挿入場所 */ 4. return node; 5. } 6. else return find_pos(node->left,value); 7. } 8. else{/* 左部分木への挿入 */ 9. if(node->right==null){/* 右子が挿入場所 */ 10. return node; 11. } 12. else retrun find_pos(node->right,value); 13. } 14.} 32

2 分探索木への挿入の実現 2 /* 2 分探索木への挿入する */ 1. void insert(node* root,double value){ 2. Node* pos;/* 挿入位置 */ 3. Node* new;/* 挿入点 */ 4. new=(node*)malloc(sizeof(node)); 5. new->data=value; 6. new->left=null; 7. new->right=null; 8. pos=find_pos(root,value); 9. if((value< pos->data)&&(pos->left==null)) 10. pos->left=new; 11. } 12. else if((pos->data<value)&&(pos->right==null)) 13. pos->right=new; 14. } 15. return; 16. } 33

挿入の動き 1 6 4 6 5 9 5 4 9 3 8 3 8 6 5 9 3 4 8 6 5 9 3 8 4 34

挿入の動き 2 6 10 6 5 9 5 9 10 3 8 3 8 6 5 9 3 8 10 35

挿入の最悪時間計算量 挿入には 最悪 2 分探索木の高さ分の時間計算量が必要である したがって On ( ) 時間 である 36

練習 次の2 分探索木に以下で示す要素を順に挿入せよ 15 7 27 11 19 5 12 20 23 10 37

2 分探索木からの削除 削除する点を根とする部分木中の 最大値あるいは最小値で置き換える 削除は 少し煩雑なので ココードは示さずに 動作だけを示す 38

削除動作 1( 葉の削除 ) 単に削除すればよい 39

削除動作 2( 子供が一つの場合の削除 ) 唯一の子供を 親にリンクする 40

削除動作 3( 子供が 2 つの場合の削除 ) 左部分木の最大値 ( あるいは右部分木最小値 ) を求め更新する 41

練習 次のから 2 分探索木から 以下で示す順序に要素を削除せよ ただし 2 つの子がある点が削除される場合には 右部分木の最小値を用いて更新すること 41 16 73 7 37 52 81 12 22 68 17 25 59 12 37 73 68 22 42

削除の最悪時間計算量 挿入には 最悪 2 分探索木の高さ分の時間計算量が必要である したがって On ( ) 時間 である 43

2 分探索木における各操作の 平均時間量解析 各操作は 2 分探索木の高さに比例する時間量で行える ここでは 空木 ( データの無い木 ) からはじめて n 個のデータをランダムに挿入して作成される 2 分探索木の高さ ( 平均の深さ ) を評価する n! ここでのランダムとは 個の順列が均等におきると仮定して その順列に従って挿入することである 44

次のように記号を定義する Dn ( ) = ( n この Dn ( ) を求めるために ランダムに挿入する際の比較回数 Cn ( ) を考察する ここで Cn ( ) = ( n である このとき 各頂点 vに対して 作成時に深さー 1 回の比較を行っていることに注意すると 次の関係が成り立つ 1 Dn ( ) 1 Cn ( ) n 平均の深さ 作成時の平均比較総数 45

イメージ dv ( 1) ( ) dv i dv ( n ) v n v i v 1 dv ( i): vi n 1 Dn ( ) = dv ( i) n i = 1 D(0) = 0, D(1) = 0 46

次にデータの挿入される順に と定める x, x,, x 1 2 n このとき x 1 は根におかれ 2 分探索木完成までには 回の比較が行われる n 1 C (1) = 0 x1 1 x 2 x x1 x x 1 x 2 x n x 3 n 1 点の木 47

一方 x1 の大きさが i 番目であるとする x 1 i 1 点の木 n i 点の木 ランダムなので 順位ことに注意する i は 1 から n の全て均等におきる 48

これらのことを考慮すると 2 分探索木の構成時における平均の総比較回数は 次の漸化式を満たす n 1 C( n) = ( n 1 + C( i 1) + C( n i)) n i = 1 根との比較数 左部分木の平均比較総数 右部分木の平均比較総数 ランダムなので 全ての順位が均等に起こる 全ての場合の総和を求めて nで割れば 平均比較総数となる クイックソートの平均時間計算量が満たすべき漸化式とまったく同じである 49

忘れた人のために もう一度解く n 1 C( n) = ( n 1 + C( i 1) + C( n i)) n i = 1 n 1 nc ( n ) = n ( n 1) + 2 C () i 1 1 に n 1 を代入して i = 0 n 22 ( n 1) C( n 1) = ( n 1)( n 2) + 2 C( i) 1-2 nc( n) ( n 1) C( n 1) i= 0 = nn ( 1) ( n 1)( n 2) + 2 Cn ( 1) 2 nc ( n ) ( n + 1) C ( n 1) = n ( n 1) ( n 1)( n 2) 3 50

3 のすべての項を nn+ ( 1) で割ってまとめる C( n) C( n 1) n( n 1) ( n 1)( n 2) = n + 1 n n ( n + 1) n ( n + 1) C( n) C( n 1) 2 n + 1 n n 辺々加えてまとめる C( n) 2( H n 1 n + 1 1)( C (1) = 0) C ( n ) 2n log e n n 以上 より点をランダムにして2 分探索木を構築するための総比較回数 ( 平均時間計算量 ) は である O( ( n log n ) 51

ここで n 点の2 分探索木における各頂点の平均深さと n 点の 2 分探索木構築する平均比較総数の関係を思い出す この関係式より である 1 Dn ( ) 1 Cn ( ) n Dn ( ) = O(log n) 2 分探索木における各操作に必要な平均時間計算量は 平均深さ Dn ( ) に比例すると考えられる したがって n 点からなる2 分探索木における 探索 挿入 削除 の各操作を行うための平均時間計算量は である O(log n) 52

2 分探索木のまとめ 探索挿入削除 最悪 時間計算量 On ( ) On ( ) O( ( n ) 平均 時間計算量 O(log n) O(log n) O(l (log n ) 2 構築 O( ( n ) O( ( nlog n) n : データ数 53

2 分探索木と整列 2 分探索木を用いても ソートを行うことができる v v lft left right < v v <v v v left right 左優先で木をなぞったとき 点 v において v の左部分木のすべてをなぞったら を出力し 右の部分木をなぞるようにすればよい v 54

2 分探索木と整列 16 41 73 7 37 52 81 12 22 68 17 25 59 55

2 分探索木とヒープ ( イメージ ) 2 分探索木 ヒープ 大きくなる方向 56

AVL 木 7-3. 高度な木 ( 平衡木 ) 平衡 2 分木 回転操作に基づくバランス回復機構により平衡を保つ B 木 平衡多分木 各ノードの分割 併合操作により平衡を保つ 57

2 分探索木の問題点 高さが On ( ) になることがある 各操作の最悪計算量は になってしまう O(log n) On ( ) 時間 ( 平均計算量は 時間である ) 最悪計算時間でも n O(log n) : 時間にしたい 58

平衡木とは 根から 葉までの道の長さが どの葉に対してもある程度の範囲にある ( 厳密な定義は 各々の平衡木毎に定義される 概して 平衡木の高さは O(log n) である ) 平衡木に対する各操作は 最悪計算時間で時間にできることが多い O(log n) 59

平衡木のイメージ ほぼ完全 (2 分 ) 木に近い形状をしている 葉までの経路長がほぼ等しい 60

AVL 木 Adel son-vel skiiとlandisが考案したデータ構造 探索 挿入 削除の操作が最悪でも O(log n) 時間で行える2 分探索木の一種 全てのノードにおいて 左部分木と右部分木の高さの差が 1 以内に保つ 最後の 性質を保つために バランス回復操作を行う また この性質より 高性能となる 61

様々な AVL 木 6 5 5 9 2 8 3 8 1 4 6 9 8 5 9 3 6 62

AVL 木でない例 8 5 9 4 5 7 3 6 3 8 1 6 1 9 5 8 3 7 9 1 63

AVL 木の高さの導出 各ノードにおいて 右部分木の高さと左部分木の高さの差が高々 1 という条件から AVL 木の高さが O(l (log n ) になることが導かれる ここでは できるだけ少ないノードで 高さを増加させることを考える AVL 木のバランス条件 64

少ないノードの AVL 木 1 高さ 0 高さ 1 高さ 2 3 点 1 点 2 点 4 点 65

少ないノードの AVL 木 2 高さ 3 高さ 4 7 点 12 点 66

高さ h Nh ( ) のAVL 木を実現する最小のノード数をと表す 例より N (0) = 1, N (1) = 2, N (3) = 4, N (4) = 7, という数列になるはずである ここで この数列 Nh () が満たすべき漸化式を導く 67

高さ h を実現する最小ノード数の AVL 木 h h 1 h 2 Nh ( 1) Nh ( 2) Nh ( ) = Nh ( 1) + Nh ( 2) + 1 左部分木の点数 ( 右部分木の点数 ) 右部分木の点数 ( 左部分木の点数 ) 根 68

以上の考察より 次の漸化式が成り立つ N(0) = 1 h = 0 N(1) 2 h 1 = = Nh ( ) = Nh ( 1) + Nh ( 2) + 1 h 2 この漸化式を解けば 高さ Nh ( ) が求められる h を実現する最小のノード数 特殊解を N とする 再帰式より N = N + N + N = 1 1 69

この同次解を求める すなわち 以下の漸化式を満たす解を求める Nh ( ) Nh ( 1) Nh ( 2) = 0 特性方程式を解く よって x α 2 x 1 = 0 1± 5 x = 2 と置くと 任意定数 1 + 5 1 5, β 2 2 c, c 1 2 を持ちいて 次のようにあらわせる h h h ( ) h Nh = c α + c β + N = c α + c β 1 1 2 1 2 70

N(0) = c + c 1 = 1 1 2 1+ 5 1 5 N(1) = c 1 + c 2 1= 2 2 2 これを解いて c 2+ 5 1 2 5 1 = = α, c = = β 5 5 5 5 3 3 1 2 1 ( + 3 + 3 ) h h h h Nh ( ) = c1α + c2β + N= α β 1 5 これより n 点の AVL 木の高さは 次式を満たす Nh ( ) n 71

これより h = O (log n ) と高さを導くことができる とができる ( この評価は 最悪時も考慮されていることに注意する ) 72

AVL への挿入 挿入によっても AVLのバランス条件を満足していれば 通常の 2 分探索木の挿入をおこなう 挿入によりバランス条件を破ってしまったとき 挿入状況により バランス回復操作 をおこなう 1 重回転操作 2 重回転操作 73

バランスを崩す挿入 A B 挿入前 h T T 1 2 h T 3 h 1 挿入後 A A B B h T 1 h h T 3 T 2 1 h T T2 h T 3 h X 1 重回転 X 2 重回転 74

1 重回転 回転前 回転後 h+2 T 1 X h B T 2 A h T 3 2 h h+1 T h X 1 h B T 2 A T 3 h 高さの差は 0 75

2 重回転 1 回転前 詳細化 h+2 B A h+2 B A T 1 h T 2 X h T 3 2 h T 1 h C T 21 X T h 11 3 T 22 2 h 76

2 重回転 2 回転前 h+22 T 1 h B T 21 A 回転後 h+1 C B A h 1 C h T T 22 h 1 1 T 22 T 3 2 h T 21 X 高さの差は 0 1 X T 3 h 77

1 重回転 2 回での 2 重回転の実現 回転前 h+22 T 1 h B C T21 X A h 1 1 T 22 T 3 2 h 1 回転後 T 1 B 2 回転後 T 1 T 21 X C B T 21 X A T 22 h 1 C T 22 A T 3 T 3 78 h

AVL 木への挿入例 1 30 1 15 39 10 18 34 50 5 12 16 25 79

30 バランスが崩れる 15 39 10 18 34 50 5 12 16 25 1 1 重回転 80

15 10 30 1 5 12 18 39 16 25 34 50 1 重回転後 81

AVL 木への挿入例 2 30 28 15 39 10 18 34 50 5 12 16 25 82

30 バランスが崩れる 15 39 10 18 34 50 5 12 16 25 28 2 重回転 83

バランスが崩れる 18 15 30 10 16 25 39 5 12 28 34 50 2 重回転後 84

練習次の AVL 木に 各要素を順に挿入した結果を示せ 33 17 46 8 24 41 3 11 27 28 10 35 23 85

AVL への挿入の計算量 挿入位置の確認とバランス条件のチェックに 木の高さ分の時間計算量が必要である また 回転操作には 部分木の付け替えだけであるので 定数時間 ( O(1) () 時間 ) で行うことができる 以上より 挿入に必要な最悪時間計算量は である O (log n ) 86

AVL への削除の計算量 削除時に バランス条件が崩された場合も 挿入時と同様に 回転操作によって バランスを回復することができる 削除位置を求めることと バランス条件のチェックに 木の高さ分の時間計算量が必要である 以上より 削除に必要な最悪時間計算量も である O (log n ) 87

B 木の概略 多分木 ( d 分木 ) を基にした平衡木 各ノードには データそのものと 部分木へのポインタを交互に蓄える 各葉ノードまでの道は全て等しい ( したがって 明らかに平衡木である ) 部分木中の全てのデータは 親ノードのデータで範囲が限定される 88

B 木の満たすべき条件 2 m 1 根は 葉になるかあるいは個の子を持つ m 2 根 葉以外のノードは m 個の子を 持つ 2 3 根からすべての葉までの道の長さは等しい 4 部分木全てのデータは その部分木へのポインタを はさんでいる データにより 制限される 89

B 木の例 35 d d m = 2 = 2, m = 3 10 20 45 2 5 13 15 27 37 40 50 90

簡単のため 根以外は B 木の高さ d 個以上の個があるとする このとき 高さ h の B 木に含まれるノード数をとする このとき 次が成り立つ Nh () h h 1 i d + i= 0 d 1 n = N() h d = h = O(log n) d 1 91

B 木への挿入 43 35 10 20 45 2 5 13 15 27 37 40 50 92

オーバーフロー時のノード分割 1 35 10 20 45 2 5 13 15 27 37 40 50 43 93

オーバーフロー時のノード分割 2 35 10 20 40 45 2 5 13 15 27 37 43 50 オーバーフローが起きたときには ノードを分割して 親に向かって再帰的にB 木の条件を満足するように更新していく 94

B 木からの削除 delete(50) 35 10 20 40 45 2 5 13 15 27 37 43 50 アンダーフローが起きたときには ノードを結合や データの再配置等を行い 再帰的に B 木の条件を満足するように更新していく 95

アンダーフローにおけるデータの再配置 35 10 20 40 2 5 13 15 27 37 43 45 アンダーフローが起きたときには ノードを結合や データの再配置等を行い 再帰的に B 木の条件を満足するように更新していく 96

B 木の最悪計算量 O(log n) d B 木の高さが であることに注意する また 1つのノードを処理するために Om ( ) 時間必要である 以上より 各操作は 最悪時間計算量として O ( m + log n) m 2 m 時間である パラメータの値により性能に違いが生じる m =Ω( n) とすると高速に動作しない 97

B 木の応用 ディスクアクセスは メモリアクセスに比べて極端に遅い したがって ある程度もまとまったデータたデを1 度の読み込んだ方が全体として高速に動作することが多い よって B 木の各ノードに蓄えられているデータを 一度に読み込むようにすれば ディスクアクセスの回数が軽減される 各ノード内の処理は メモリ上で効率よく実現できる 98

平衡木のまとめ 平衡木の高さは O(log n) となる 平衡を実現するための条件により 各種平衡木が定義される 平衡状態を満足するために 各種バランス回復処理が行われる 99