アルゴリズムとデータ構造 第7回探索のためのデータ構造(1) 2015/11/18 アルゴリズムとデータ構造 2015.

Slides:



Advertisements
Similar presentations
組合せ最適化輪講 2.3 連結性 川原 純. 2.3 連結性 内容 – グラフ上の節点をすべてたどるアルゴリズム 計算機上でのグラフの表現 – 強連結成分を求めるアルゴリズム トポロジカル順序を求める方法も – k- 連結、 k- 辺連結について – 2- 連結グラフの耳分解について.
Advertisements

4.3 マージソート.
基本情報技術概論 I 演習(第5回) 埼玉大学 理工学研究科 堀山 貴史
離散システム特論 整列(sorting)アルゴリズム 2.
ヒープソートの演習 第13回.
2 分探索木 Binary Search Tree 実行可能な操作 計算量 木の高さは,最悪 O(n) n = |A| : 要素の個数
アルゴリズムとデータ構造 第8回 ソート(3).
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
2分探索.
近似アルゴリズム 第10章 終了時刻最小化スケジューリング
第11回 整列 ~ シェルソート,クイックソート ~
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
アルゴリズムとデータ構造 2010年7月5日
第8講: 平成19年11月9日 (金) 4限 E252教室 探索アルゴリズム(1).
第11回 整列 ~ バケットソート,基数ソート,ヒープソート~
On the Enumeration of Colored Trees
Problem G : Entangled Tree
データ構造とプログラミング技法 (第8回) ーデータの探索ー.
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 補足資料13-4 「2分探索木の追加・削除(ダイジェスト)」
第10回 ソート(1):単純なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月14日
データ構造とアルゴリズム 第7回 木 ~ データ構造(3)~.
情報工学概論 (アルゴリズムとデータ構造)
2009/11/20 探索アルゴリズム(2) 第8講: 平成21年11月20日 (金) 4限 E252教室 コンピュータアルゴリズム.
探索アルゴリズム (1) 第7講: 平成21年11月13日 (金) 4限 E252教室.
エージェントを管理するボスの苦悩 問題 n人のエージェントを部下に持つボスがいる. エージェントは出張・帰還を頻繁に繰り返す.
ヒープソートの復習.
アルゴリズムとデータ構造 2011年6月14日
第11回 整列 ~ シェルソート,クイックソート ~
二分探索木によるサーチ.
7-3.高度な木 (平衡木) AVL木 平衡2分木。回転操作に基づくバランス回復機構により平衡を保つ。 B木
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
“Purely Functional Data Structures” セミナー
アルゴリズムとデータ構造1 2005年7月26日
アルゴリズムとデータ構造1 2006年7月4日
アルゴリズムとデータ構造1 2006年6月16日
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 第3章 ヒープ 6月10日分
第9回 優先度つき待ち行列,ヒープ,二分探索木
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
離散数学 07. 木 五島.
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
Cプログラミング演習 第10回 二分探索木.
復習+α JBuilderの使い方を思い出す。 配列とGUI 再帰とマージソート 木と二分木の探索
アルゴリズムとデータ構造 2010年7月26日
プログラミング 4 木構造とヒープ.
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
AVL木.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造1 2008年7月24日
アルゴリズムとデータ構造 2011年6月16日
算法数理工学 第4回 定兼 邦彦.
アルゴリズムとデータ構造 2013年7月1日
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
ヒープソートの復習 第12回.
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2009年7月2日
ヒープソート.
アルゴリズムとデータ構造 2013年6月20日
参考:大きい要素の処理.
グラフの列挙 中野 眞一    (群馬大学) 2019/9/14 列挙学校.
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

アルゴリズムとデータ構造 第7回探索のためのデータ構造(1) 2015/11/18 アルゴリズムとデータ構造 2015

C言語の標準ライブラリ関数qsortは一般的にクイックソートで実装されている。 前回の復習 整列のアルゴリズム 比較に基づくか? 基づかない バケットソート、基数ソート O(m+n)             m:バケット数 基づく 最悪/平均時間計算量の下界Ω(n log n) 最悪/平均時間計算量がΘ(n2)のアルゴリズム     挿入ソート、選択ソート、バブルソート 最悪/平均時間計算量がΘ(n log n)のアルゴリズム     マージソート、ヒープソート 最悪時間計算量がΘ(n2)だが平均時間計算量がΘ(n log n)のアルゴリズム     クイックソート 最悪時間計算量がΘ(n(log n)2)のアルゴリズム     シェルソート C言語の標準ライブラリ関数qsortは一般的にクイックソートで実装されている。 2015/11/18 アルゴリズムとデータ構造 2015

辞書とは? 次の3つの基本操作を伴う集合Sを辞書(dictionary)という。 member(x,S) : x∈Sならばyes, x  Sならばnoを出力 Insert(x,S) : SをS∪{x}に更新 delete(x,S) : SをS -{x}に更新 ∈ ここでは、辞書に適したデータ構造について学ぶ。 2015/11/18 アルゴリズムとデータ構造 2015

整列された配列 S: 全順序集合 A[0],A[1],…,A[n-1]: 配列AにSの要素を小さい順に格納 member(2,S) 整列された配列 left mid right 1 3 5 7 9 10 12 14 16 18 S: 全順序集合 A[0],A[1],…,A[n-1]: 配列AにSの要素を小さい順に格納 member(x,S) : 2分探索(binary search)が適用可能  (最悪時間計算量O(log n)) insert(x,S), delete(x,S) : 配列への挿入,削除操作を伴う (最悪時間計算量O(n)) left mid right 1 3 5 7 9 10 12 14 16 18 left mid right 1 3 5 7 9 10 12 14 16 18 1 3 5 7 9 10 12 14 16 18 [2分探索によるmember(x,S)操作] Step 1 left←0, right←n Step 2 left≧rightであればnoを出力して停止 Step 3 mid← (left+right)/2 Step 4 if x<A[mid] then right←mid else if x=A[mid] then yesを出力して停止       else left←mid+1 Step 2 へ 1 3 5 7 9 10 12 14 16 18 no! このループを最悪 高々(log2 n)+1 回まわる! 1回で範囲を半分以下に絞れる。 k回で範囲をn/2k以下に絞れる。 範囲が空となったら終わりだから n/2k<1。よってlog2n<k。これを満た す最小の整数は (log2n)+1以下 。 2015/11/18 アルゴリズムとデータ構造 2015

2分探索木 S: 全順序集合 2分木(binary tree)とは 各節点が高々2つの子をもつ根付き木      各節点が高々2つの子をもつ根付き木 2分木の各節点にSの要素を辞書に適した構造で格納することを考える。 2分探索木(binary search tree)とは      任意の節点uに対して次の条件が成り立つ2分木     uの左部分木の任意の節点の要素<                      uの要素<uの右部分木の任意の節点の要素 2分探索木の例 5 2分木の例 7 根 u 10 3 7 vの親 3 u 10 uの左部分木 8 1 4 6 1 4 v 8 uの子 6 同じ要素が格納された 異なる2分探索木 uの右部分木 2015/11/18 アルゴリズムとデータ構造 2015 5

2分探索木における操作 [2分探索木のmember(x,S)操作] Step 1 u←根の節点 Step 2 y←節点uの要素 Step 3 if x=y then yesを出力して停止      else if x>y then if 右の子が存在 then u←右の節点   else noを出力して停止      else        if 左の子が存在 then u←左の節点      Step 2へ member(5,S) member(9,S) 5< u 7 u 7 <9 9< u u <5 10 10 3 3 u 8 8 <9 1 u 4 1 4 <5 右の子が ない! u 6 <5 6 5= 5 u 5 no! yes!               [2分探索木のinsert(x,S)操作]                        Step 1 u←根の節点                        Step 2 y←節点uの要素 Step 3 if x=y then 何もしないで停止      else if x>y then if 右の子が存在 then u←右の節点   else uの右の子としてxを要素とする節点を追加して停止      else        if 左の子が存在 then u←左の節点   else uの左の子としてxを要素とする節点を追加して停止      Step 2へ insert(9,S) u 7 <9 9< u 10 3 u 8 <9 1 4 9 6 5 2015/11/18 アルゴリズムとデータ構造 2015

vは部分木の最小要素をもつ節点なので子の数は高々1つ 2分探索木における操作 delete(5,S) delete(4,S) 5< u 4< u 7 7 u 10 u 10 3 <5 3 <4 [2分探索木のdelete(x,S)操作] Step 1 u←根の節点 Step 2 y←節点uの要素 Step 3 if x=y then Step 4 へ      else if x>y then if 右の子が存在 then u←右の節点   else 何もしないで停止      else        if 左の子が存在 then u←左の節点      Step 2へ Step 4 if uは葉 then uを木から除いて停止      else if uが1つの子をもつ then uの子をuの位置に上げて停止      else (uが2つの子をもつ場合) v←uの右部分木の最小要素をもつ節点 Step 5 uの要素←vの要素 Step 6 if vは葉 then vを木から除いて停止      else (vが1つの子を持つ場合) vの子をvの位置に上げて停止 8 8 1 u 4 1 <5 4 u =4 6 5 u 6 <5 6 5 5 u 5= delete(7,S) delete(3,S) 7= u 3< u 8 7 7 10 u 10 3 3 4 =3 8 v 8 1 4 1 v 6 5 4 6 6 5 5 vは部分木の最小要素をもつ節点なので子の数は高々1つ 2015/11/18 アルゴリズムとデータ構造 2015

n要素の2分探索木に対する操作の時間計算量 n要素の2分探索木に対するmember(x,S), insert(x,S), delete(x,S)操作の 計算時間は、    x∈Sの場合、 xを要素としてもつ節点の深さに比例する。 (2つの子をもつ節点のdeleteはその節点の右部分木の最小要素の節点の深さに比例する)    x Sの場合は、insert(x,S)を行うことによってできる xを要素としてもつ節点の深さ(から1を引いた値)に比例する。 ∈ 最悪時間計算量 O(n) 節点の深さがn-1の場合(S=φから小さい順、大きい順にinsert(x,S)を行った場合) 4 1 大きい順 格納 3 2 小さい順 格納 2 3 1 4 平均時間計算量 O(log n) 節点の深さの期待値はO(log n) 2015/11/18 アルゴリズムとデータ構造 2015

2分探索木の節点の深さの期待値はO(log n) もとの節点を内点、新しく加えた節点を外点と呼ぶ。     外点の深さの平均≧内点の深さの平均 であるから外点の深さの平均がO(log n)であること を示せばよい。 D(n)を外点の深さの平均とする。 最初に格納されるものがi番目の大きさである確率 を1/n(等確率)とすれば 7 内点 3 10 外点 1 4 8 6 5 i(D(i-1)+1) + (n-i+1)(D(n-i)+1) n n+1 Σ i=1 n D(n)= i番目の要素 外点の数=内点の数+1 2 n(n+1) n = ΣiD(i-1) + 1 i=1   2 2 n(n-1) n(n-1) n(n+1) n(n-1) 2 2 n-1 = ΣiD(i-1) + 1 - +nD(n-1) +1 i=1 i-1個 の要素 (内点) n-i個 の要素 (内点) 2 n+1 = D(n-1) + 2015/11/18 アルゴリズムとデータ構造 2015

証明つづき … ∫ よってD(n)-D(n-1)=2/(n+1)、D(0)=0であるから     D(n)=2Σ ≦ 2 (1/x) dx=2loge (n+1) したがってD(n)=O(log n)である。 n+1 1 i ∫ 1 n+1 i=2 (証明終わり) 1 1/2 1/3 … n n+1 1 2 2015/11/18 アルゴリズムとデータ構造 2015

木のなぞり 木のなぞり(traverse)とは、 木のすべての節点を組織だった方法で訪問すること          木のすべての節点を組織だった方法で訪問すること 深さ優先探索(depth-first search)による木のなぞり すべての節点の要素を次の3種類の順番で出力できる。 7 1 14 11 前順(行きがけ順、preorder)       最初の訪問時に出力 7, 3, 1, 4, 6, 5, 10, 8 中順(通りがけ順、inorder)         左の部分木のなぞりが終わった後に出力 1, 3, 4, 5, 6, 7, 8, 10 後順(帰りがけ順, postorder) 最後の訪問時に出力  1, 5, 6, 4, 3, 8, 10, 7 10 10 3 12 2 9 13 3 4 8 1 4 8 5 6 6 7 5 2分探索木を中順出力すると 整列された要素のリストが えられる! 2015/11/18 アルゴリズムとデータ構造 2015

平衡探索木 平衡探索木(balanced search tree)とは 各節点において、その子節点を根とする全ての部分木の高さが     各節点において、その子節点を根とする全ての部分木の高さが     ほぼ平衡している探索木 [主な平衡探索木] AVL木 どの節点においても、その左部分木と右部分木の高さの差が1以下      である2分探索木。AVLは2人の提唱者の頭文字      (G. M. Adel’son-Vel’skii and Y. M. Landis) 2色木 2分探索木の各辺に次の条件を満たすように赤か黒の色を塗れるもの      1. 外点に接続する辺の色は黒。      2. 根から外点に至るどの路の上でも、赤い辺が連続することはない。      3. 根から外点に至るどの路も、含む黒色の辺の本数は同じ。 B木  根と葉を除く各節点が m/2 個以上、m個以下の子をもつ探索木。      ただし、mは自然数。 2-3 木 m=3の場合のB木。 1≧ 2015/11/18 アルゴリズムとデータ構造 2015

AVL木における操作 [AVL木のinsert(x,S)操作] T :節点uの左部分木 T :節点uの右部分木 s(u) : 節点uの状態。 挿入前には以下のように設定されている。       L if T の高さ > T の高さ  s(u)=  E if T の高さ = T の高さ       R if T の高さ < T の高さ Step 1 一般の2分木の同じように挿入を行う。      挿入した節点の親節点をuとする。 Step 2 s(u)≠Eとなるまで次のことを繰り返す。 1. s(u)の更新(挿入して高くなった方(L or R)に更新 2. u←uの親 Step 3 if s(u)=R かつT が高くなった or s(u)=L かつ T が高くなった    then        s(u)←Eとして停止 else 回転して停止 [挿入に伴う回転操作] u L L E u v u R E→L v E u 回転 u L u R u L u R L u u L u R E→R v E→L w 回 転 E w E R v u u L u R 2015/11/18 アルゴリズムとデータ構造 2015

AVL木における操作(2) [AVL木のdelete(x,S)操作] Step 1 一般の2分木の同じように削除を行う。      削除した最も下の節点の親節点をuとする。 Step 2 s(u)=Eとなるまで次のことを繰り返す。 1. if s(u)=LかつT が低くなった or s(u)=RかつT が低くなった then s(u)←E else if s(u)=RかつT が低くなった or s(u)=LかつT が低くなった then             (1) 回転             (2) s(u)≠Eならば停止 2. u←uの親 Step 3 s(u)の更新(低くなった方の逆(L or R)に更新) [削除に伴う回転操作] L R v u E R v u u L 回転 u R u L u R 高さ変化せず E R v u R E v u 回転 R u E w L v E E w u v E 高さ1減少 回転 高さ1減少 2015/11/18 アルゴリズムとデータ構造 2015

n要素のAVL木に対する操作の時間計算量 n要素のAVL木に対するmember(x,S), insert(x,S), delete(x,S)操作の 計算時間は、 最悪時間計算量 O(log n) n節点のAVL木の高さはO(log n) 平均時間計算量 O(log n) [n節点のAVL木の高さはO(log n)の証明] f(h)を高さhのAVL木の最小節点数とすれば、 以下の漸化式が成り立つ。    f(h)=f(h-1)+f(h-2)+1, f(0)=1, f(1)=2 F(h)=f(h)+1とすれば    F(h)=F(h-1)+F(h-2), F(0)=2, F(1)=3 F(h)はフィボナッチ数列だから       F(h)=(φ1h+3 – φ2h+3)/ 5 ただし、 φ1=(1+ 5)/2, φ2=(1- 5)/2 高さhのAVL木の節点数をnとすれば、      f(h) ≦ n 高さhの節点数最小の木 高さh-2の節点数 最小の木 高さh-1の節点数 最小の木 φ1h+3 – φ2h+3 ≦  5 (n+1) |φ2|<1だから φ1h+3 – 1 ≦  5 (n+1)      log( 5 (n+1)+1) log φ1 したがってh=O(log n) h ≦            - 3 2015/11/18 アルゴリズムとデータ構造 2015