アルゴリズムイントロダクション15章 動的計画法

31,683 views

Published on

アルゴリズムイントロダクション輪講用の発表資料。

Published in: Education
0 Comments
57 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
31,683
On SlideShare
0
From Embeds
0
Number of Embeds
3,405
Actions
Shares
0
Downloads
323
Comments
0
Likes
57
Embeds 0
No embeds

No notes for slide

アルゴリズムイントロダクション15章 動的計画法

  1. 1. 動的計画法 2009/3/2 id:nitoyon アルゴリズムイントロダクション 15 章
  2. 2. 動的計画法 (dynamic programming) 部分問題 を ボトムアップ に 解いて 統合 する
  3. 3. 動的計画法のアルゴリズム <ul><li>最適解 の 構造 を 特徴 づける </li></ul><ul><li>最適解 の 値 を 再帰的 に 定義 する </li></ul><ul><li>ボトムアップ に 最適解 の 値 を 求 める </li></ul><ul><li>最適解 を 構成 する </li></ul>
  4. 4. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  5. 5. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  6. 6. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.1 組み立てライン スケジューリング
  7. 7. 問題 <ul><li>車を組み立てる 2つのライン がある </li></ul>ライン1 ライン2 入口 出口
  8. 8. 問題 <ul><li>車を組み立てる 2つのライン がある </li></ul><ul><li>各ライン には n 個 の ステーション S 1, j 、 S 2, j がある </li></ul>S 1,1 入口 出口 S 2,1 S 1,2 S 2,2 S 1,3 S 2,3 S 1, n -1 S 2, n -1 S 1, n S 2, n ・・・ n 個
  9. 9. 問題 <ul><li>車を組み立てる 2つのライン がある </li></ul><ul><li>各ライン には n 個 の ステーション S 1, j 、 S 2, j がある </li></ul><ul><li>ステーション S i , j では 組立に a i , j 時間 かかる </li></ul>a 1,1 入口 出口 a 2,1 a 1,2 a 2,2 a 1,3 a 2,3 a 1, n -1 a 2, n -1 a 1, n a 2, n ・・・ e 1 e 2 x 1 x 2
  10. 10. 問題 <ul><li>車を組み立てる 2つのライン がある </li></ul><ul><li>各ライン には n 個 の ステーション S 1, j 、 S 2, j がある </li></ul><ul><li>ステーション S i , j では 組立に a i , j 時間 かかる </li></ul>a 1,1 入口 出口 a 2,1 a 1,2 a 2,2 a 1,3 a 2,3 a 1, n -1 a 2, n -1 a 1, n a 2, n ・・・ e 1 e 2 x 1 x 2 ( 例 ) ライン1を通過する時間 =
  11. 11. 問題 <ul><li>車を組み立てる 2つのライン がある </li></ul><ul><li>各ライン には n 個 の ステーション S 1, j 、 S 2, j がある </li></ul><ul><li>ステーション S i , j では 組立に a i , j 時間 かかる </li></ul><ul><li>ラインを変える には t i , j 時間 かかる </li></ul>a 1,1 入口 出口 a 2,1 a 1,2 a 2,2 a 1,3 a 2,3 a 1, n -1 a 2, n -1 a 1, n a 2, n ・・・ t 1,1 t 2,1 t 1,2 t 2,2 t 1, n -1 t 2, n -1 e 1 e 2 x 1 x 2
  12. 12. 問題 <ul><li>車を組み立てる 2つのライン がある </li></ul><ul><li>各ライン には n 個 の ステーション S 1, j 、 S 2, j がある </li></ul><ul><li>ステーション S i , j では 組立に a i , j 時間 かかる </li></ul><ul><li>ラインを変える には t i , j 時間 かかる -> 最短時間の順路 を 求める </li></ul>a 1,1 入口 出口 a 2,1 a 1,2 a 2,2 a 1,3 a 2,3 a 1, n -1 a 2, n -1 a 1, n a 2, n ・・・ t 1,1 t 2,1 t 1,2 t 2,2 t 1, n -1 t 2, n -1 e 1 e 2 x 1 x 2
  13. 13. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2
  14. 14. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 2 + 7 + 2 + 5 + 1 + 3 + 1 + 4 + 5 + 1 + 4 + 3 =38
  15. 15. 総当り作戦 の 破綻 <ul><li>ある道筋 の コスト を 計算 するには -> O ( n ) </li></ul><ul><li>全て の 道筋 は -> 2 n 通り </li></ul>総当り には Ω (2 n ) 必要 ※ Ω(2 n ) = 少なくとも 2 n の 計算量 を要する
  16. 16. 1. 最適解の構造を 特徴づける
  17. 17. ステーション S 1, j を 最速 で 終了 する 順路 が <ul><li>S 1, j -1 を 経由 していた 場合 </li></ul>S 1, j -1 S 2, j -1 S 1, j 入口
  18. 18. ステーション S 1, j を 最速 で 終了 する 順路 が <ul><li>S 1, j -1 を 経由 していた 場合 </li></ul><ul><ul><li>S 1, j -1 を 最速 で 終了 する 順路 を 辿ってきた </li></ul></ul>入口 S 1, j -1 S 2, j -1 S 1, j
  19. 19. なぜならば <ul><li>もっと速く S 1, j -1 に到達する道 が あるなら、 この順路 を使って S 1, j に もっと速く着ける </li></ul>入口 S 1, j -1 S 2, j -1 S 1, j 矛盾
  20. 20. 同様に…
  21. 21. ステーション S 1, j を 最速 で 終了 する 順路 が <ul><li>S 1, j -1 を 経由 していた 場合 </li></ul><ul><ul><li>S 1, j -1 を 最速 で 終了 する 順路 を 辿ってきた </li></ul></ul><ul><li>S 2, j -1 を 経由 していた 場合 </li></ul><ul><ul><li>S 2, j -1 を 最速 で 終了 する 順路 を 辿ってきた </li></ul></ul><ul><li>j =1 のとき </li></ul><ul><ul><li>1 通り </li></ul></ul>S 1, j -1 S 2, j -1 S 1, j
  22. 22. ステーション S 1, j を 最速 で 終了 する 順路 が <ul><li>S 1, j -1 を 経由 していた 場合 </li></ul><ul><ul><li>S 1, j -1 を 最速 で 終了 する 順路 を 辿ってきた </li></ul></ul><ul><li>S 2, j -1 を 経由 していた 場合 </li></ul><ul><ul><li>S 2, j -1 を 最速 で 終了 する 順路 を 辿ってきた </li></ul></ul><ul><li>j =1 のとき </li></ul><ul><ul><li>1 通り </li></ul></ul>S 1, j -1 S 2, j -1 S 1, j 問題 の 最適解 部分問題 の 最適解
  23. 23. 部分問題最適性 問題 の 最適解 に 部分問題 の 最適解 が 含 まれる
  24. 24. 2. 最適解 の 値 を 再帰的 に 定義 する
  25. 25. 最適解 の 値 f i [ j ] = 入口 から S i, j までの 最短時間 S 1, j -1 S 2, j -1 S 1, j 入口 t 2, j -1
  26. 26. 最適解 の 値 f 1 [ j ] = a 1, j -1 a 2, j -1 S 1, j 入口 t 2, j -1 e 1 + a 1,1 min( f 1 [ j -1] + a 1 ,j -1 , f 2 [ j -1]+ a 2, j -1 + t 2, j -1 ) ( j= 1) ( j >1) f 1 [ j -1]
  27. 27. 最適解 の 値 f 1 [ j ] = e 1 + a 1,1 min( f 1 [ j -1] + a 1 ,j -1 , f 2 [ j -1]+ a 2, j -1 + t 2, j -1 ) ( j= 1) ( j> 1) f 2 [ j ] = e 2 + a 2,1 min( f 2 [ j -1] + a 2 ,j -1 , f 1 [ j -1]+ a 1, j -1 + t 1, j -1 ) ( j= 1) ( j >1) 同様 に… f* = min( f 1 [ n ] + x 1 , f 2 [ n ] + x 2 ) 求めたい最適解 の 値 は…
  28. 28. 3. ボトムアップ に 最適解 の 値 を 求 める
  29. 29. 再帰 を そのまま解 くと・・・ O (2 n ) f 1 [ j ] = e 1 + a 1,1 min( f 1 [ j -1] + a 1 ,j -1 , f 2 [ j -1]+ a 2, j -1 + t 2, j -1 ) ( j= 1) ( j> 1) f 2 [ j ] = e 2 + a 2,1 min( f 2 [ j -1] + a 2 ,j -1 , f 1 [ j -1]+ a 1, j -1 + t 1, j -1 ) ( j= 1) ( j >1) f* = min( f 1 [ n ] + x 1 , f 2 [ n ] + x 2 )
  30. 30. 再帰 を そのまま解 くと・・・ O (2 n ) f 1 [ j ] = e 1 + a 1,1 min( f 1 [ j -1] + a 1 ,j -1 , f 2 [ j -1]+ a 2, j -1 + t 2, j -1 ) ( j= 1) ( j> 1) f 2 [ j ] = e 2 + a 2,1 min( f 2 [ j -1] + a 2 ,j -1 , f 1 [ j -1]+ a 1, j -1 + t 1, j -1 ) ( j= 1) ( j >1) f* = min( f 1 [ n ] + x 1 , f 2 [ n ] + x 2 ) ボトムアップ ( 昇順 ) に 解く
  31. 31. F ASTEST -W AY( a , t , e , x , n ) 最適解 の 値 を 計算 f i [ j ] を 計算 初期値 を 設定
  32. 32. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 f 1 [ j ] 2 1 4 3 5 f 2 [ j ] 6 j
  33. 33. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 9 f 1 [ j ] 2 12 1 4 3 5 f 2 [ j ] 6 j
  34. 34. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 18 9 f 1 [ j ] 2 12 1 4 3 5 f 2 [ j ] 6 j
  35. 35. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 18 9 f 1 [ j ] 16 2 12 1 4 3 5 f 2 [ j ] 6 j
  36. 36. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 20 18 9 f 1 [ j ] 16 2 12 1 4 22 3 5 f 2 [ j ] 6 j
  37. 37. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 35 32 24 20 18 9 f 1 [ j ] 16 2 12 1 25 4 22 3 30 5 37 f 2 [ j ] 6 j
  38. 38. 4. 最適解 を 構成 する
  39. 39. <ul><li>l *, l [ j ] から順路を出力する </li></ul>P RINT- S TATIONS ( l , l *, n )
  40. 40. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 35 32 24 20 18 9 f 1 [ j ] 16 2 12 1 25 4 22 3 30 5 37 f 2 [ j ] 6 j
  41. 41. 例 ( p .8 ) 7 入口 出口 8 9 5 3 6 8 5 4 7 2 2 3 1 4 1 2 4 3 2 4 4 1 2 3 2 35 32 24 20 18 9 f 1 [ j ] 16 2 12 1 25 4 22 3 30 5 37 f 2 [ j ] 6 j
  42. 42. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  43. 43. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.2 連鎖行列積
  44. 44. 問題 <ul><li>行列積 A 1 A 2 … A n の計算量を小さくしたい </li></ul>
  45. 45. 問題 <ul><li>行列積 A 1 A 2 … A n の計算量を小さくしたい </li></ul><ul><ul><li>演算結果は括弧付けの順番に寄らない </li></ul></ul><ul><ul><ul><li>( A 1 ( A 2 ( A 3 A 4 ))) </li></ul></ul></ul><ul><ul><ul><li>( A 1 (( A 2 A 3 ) A 4 )) </li></ul></ul></ul><ul><ul><ul><li>(( A 1 A 2 )( A 3 A 4 )) </li></ul></ul></ul><ul><ul><ul><li>(( A 1 ( A 2 A 3 )) A 4 ) </li></ul></ul></ul><ul><ul><ul><li>((( A 1 A 2 ) A 3 ) A 4 ) </li></ul></ul></ul>
  46. 46. 問題 <ul><li>行列積 A 1 A 2 … A n の計算量を小さくしたい </li></ul><ul><ul><li>演算結果は括弧付けの順番に寄らない </li></ul></ul><ul><ul><ul><li>( A 1 ( A 2 ( A 3 A 4 ))) : 右から </li></ul></ul></ul><ul><ul><ul><li>( A 1 (( A 2 A 3 ) A 4 )) : 中右左の順 </li></ul></ul></ul><ul><ul><ul><li>(( A 1 A 2 )( A 3 A 4 )) : 左右を先に </li></ul></ul></ul><ul><ul><ul><li>(( A 1 ( A 2 A 3 )) A 4 ) : 中左右の順 </li></ul></ul></ul><ul><ul><ul><li>((( A 1 A 2 ) A 3 ) A 4 ) : 左から </li></ul></ul></ul>
  47. 47. 問題 <ul><li>行列積 A 1 A 2 … A n の計算量を小さくしたい </li></ul><ul><ul><li>演算結果は括弧付けの順番に寄らない </li></ul></ul><ul><ul><li>計算量は括弧付けの順番に依存する </li></ul></ul>A ( p × q 行列 ) と B ( q × r 行列 ) の 積 で は、 pqr 回 の 掛け算 が 実施 される
  48. 48. <ul><li>行列積 A 1 A 2 … A n の計算量を小さくしたい </li></ul><ul><ul><li>演算結果は括弧付けの順番に寄らない </li></ul></ul><ul><ul><li>計算量は括弧付けの順番に依存する </li></ul></ul>問題 ( 例 ) A 1 (10×100 行列 ) A 2 (100×5 行列 ) A 3 (5×50 行列 ) (( A 1 A 2 ) A 3 ) : 10×100×5+10×5×50 ( A 1 ( A 2 A 3 )) : 100×5×50+10×100×50
  49. 49. <ul><li>行列積 A 1 A 2 … A n の計算量を小さくしたい </li></ul><ul><ul><li>演算結果は括弧付けの順番に寄らない </li></ul></ul><ul><ul><li>計算量は括弧付けの順番に依存する </li></ul></ul>問題 (( A 1 A 2 ) A 3 ) : 10×100×5+10×5×50 ( A 1 ( A 2 A 3 )) : 100×5×50+10×100×50 = 7,500 = 75,000 ( 例 ) A 1 (10×100 行列 ) A 2 (100×5 行列 ) A 3 (5×50 行列 )
  50. 50. <ul><li>行列積 A 1 A 2 … A n の計算量を小さくしたい </li></ul><ul><ul><li>演算結果は括弧付けの順番に寄らない </li></ul></ul><ul><ul><li>計算量は括弧付けの順番に依存する </li></ul></ul><ul><li>-> A 1 A 2 … A n の 乗算回数 を 最小化 する 括弧付け を 決定 する </li></ul><ul><ul><li>A i の 次元 は p i -1 × p i </li></ul></ul>問題
  51. 51. 括弧付けの個数 P ( n ) : N 個 の 行列 に対する 括弧付け の 個数 総当り には Ω (4 n / n 3/2 ) 必要
  52. 52. 括弧付けの個数 ( A 1 ( A 2 ( A 3 A 4 ))) ( A 1 (( A 2 A 3 ) A 4 )) P (4) : 4 個 の 行列 に対する 括弧付け の 個数 (( A 1 A 2 )( A 3 A 4 )) (( A 1 ( A 2 A 3 )) A 4 ) ((( A 1 A 2 ) A 3 ) A 4 )
  53. 53. 括弧付けの個数 ( A 1 ( A 2 ( A 3 A 4 ))) ( A 1 (( A 2 A 3 ) A 4 )) P (4) : 4 個 の 行列 に対する 括弧付け の 個数 (( A 1 A 2 )( A 3 A 4 )) (( A 1 ( A 2 A 3 )) A 4 ) ((( A 1 A 2 ) A 3 ) A 4 ) P (1) P (3) P (3) P (1) P (2) P (2)
  54. 54. 括弧付けの個数 ( A 1 ( A 2 ( A 3 A 4 ))) ( A 1 (( A 2 A 3 ) A 4 )) P (4) : 4 個 の 行列 に対する 括弧付け の 個数 (( A 1 A 2 )( A 3 A 4 )) (( A 1 ( A 2 A 3 )) A 4 ) ((( A 1 A 2 ) A 3 ) A 4 ) P (1) P (3) P (3) P (1) P (2) P (2) + × × × +
  55. 55. 1. 最適解の構造を 特徴づける
  56. 56. A i A i +1 … A j の 最適括弧付け が <ul><li>A k と A k +1 で 分割すると仮定する </li></ul>A i A i +1 … A k A k +1 … A j
  57. 57. A i A i +1 … A j の 最適括弧付け が <ul><li>A k と A k +1 で 分割すると仮定する </li></ul>A i A i +1 … A k A k +1 … A j 部分括弧付け は A i … A k の 最適括弧付け となっている 部分括弧付け は A k +1 … A j の 最適括弧付け となっている
  58. 58. <ul><li>より良い 括弧付け があれば それを使って A i A i +1 … A j を より良くできる </li></ul>なぜならば A i A i +1 … A k A k +1 … A j より良い括弧付け
  59. 59. <ul><li>より良い 括弧付け があれば それを使って A i … A j を より良くできる </li></ul>なぜならば A i A i +1 … A k A k +1 … A j より良い括弧付け A i A i +1 … A j が 最適括弧付け であることと 矛盾
  60. 60. 部分問題最適性 問題 ( A i A i +1 … A j ) の 最適解 に 部分問題 ( A i … A k と A k+ 1 … A j ) の 最適解 が 含 まれる
  61. 61. 2. 最適解 の 値 を 再帰的 に 定義 する
  62. 62. 最適解 の 値 m [ i, j ] = A i … A j の 計算 に 必要 な スカラ乗算 の 最小回数 A i A i +1 … A k A k +1 … A j
  63. 63. 最適解 の 値 <ul><li>最適解 は A k と A k +1 で 分割 する と仮定する </li></ul>m [ i, j ] = A i … A j の 計算 に 必要 な スカラ乗算 の 最小回数 A i A i +1 … A k A k +1 … A j
  64. 64. 最適解 の 値 <ul><li>最適解 は A k と A k +1 で 分割 する と仮定する </li></ul>m [ i, j ] = A i … A j の 計算 に 必要 な スカラ乗算 の 最小回数 A i A i +1 … A k A k +1 … A j m [ i, j ] = m [ i , k ] + m [ k +1, j ] + p i -1 p k p j
  65. 65. 未知 の 値 k を 求 める <ul><li>全ての k を 調 べて 最良 のものを 選択 する </li></ul>m [ i , j ] = 0 min( m [ i , k ] + m [ k +1, j ]+ p i -1 p k p j ) 0≦ k ≦ j ( j= 1) ( j >1)
  66. 66. 3. ボトムアップ に 最適解 の 値 を 求 める
  67. 67. 再帰 だと 指数時間 が 必要 -> 理由は 15.3 にて
  68. 68. 部分問題 の 数 が 少 ない <ul><li>1 ≦ i ≦ k ≦ n を 満たす部分問題 の 個数 は </li></ul><ul><ul><li>n C 2 + n =Θ( n 2 ) 通り </li></ul></ul><ul><li>再帰 の 途中 で 同じ部分問題 が 繰り返し 表れる </li></ul>部分問題重複性
  69. 69. そこで ボトムアップ に
  70. 70. M ATRIX- C HAIN- O RDER( p ) 初期値 を 設定 連鎖長 が l のもので ループ m [ i , j ] を 求める
  71. 71. 図で考える m [1,1] m [1,2] m [1,3] m [2,2] m [2,3] m [3,3] m [4,4] m [3,4] m [2,4] m [1,4] m [2,5] m [3,5] m [4,5] m [5,5] m [1,5] A 1 A 2 A 3 A 4 A 5
  72. 72. 図で考える m [1,1] m [1,2] m [1,3] m [2,2] m [2,3] m [3,3] m [4,4] m [3,4] m [2,4] m [1,4] m [2,5] m [3,5] m [4,5] m [5,5] m [1,5] i =1 A 1 A 2 A 3 A 4 A 5 l j =3
  73. 73. 0 0 0 0 0 A 1 30×35 A 2 35×15 A 3 15×10 A 4 10×20 A 5 20×25
  74. 74. 0 i =1 j =2 0 i =2 j =3 0 0 i =3 j =4 i =4 j =5 0 A 1 30×35 A 2 35×15 A 3 15×10 A 4 10×20 A 5 20×25
  75. 75. 0 15,750 0 0 0 0 A 1 30×35 A 2 35×15 A 3 15×10 A 4 10×20 A 5 20×25
  76. 76. 0 15,750 0 2,625 0 0 750 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20
  77. 77. 0 15,750 i =1 j= 3 0 2,625 0 0 750 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 min( m [1, k ] + m [ k +1, 3]+ p 0 p k p 3 ) 1≦ k ≦ 2
  78. 78. 0 15,750 7,875 0 2,625 0 0 750 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 min( m [1, k ] + m [ k +1, 3]+ p 0 p k p 3 ) 1≦ k ≦ 2 k =1 7,875
  79. 79. 0 15,750 7,875 0 2,625 0 0 750 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 min( m [1, k ] + m [ k +1, 3]+ p 0 p k p 3 ) 1≦ k ≦ 2 k =2 18,000 k =1 7,875
  80. 80. 0 15,750 7,875 0 2,625 0 0 750 4,375 2,500 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20
  81. 81. 0 15,750 7,875 0 2,625 0 0 750 4,375 i =1 j =4 2,500 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 min( m [1, k ] + m [ k +1, 4]+ p 0 p k p 4 ) 1≦ k ≦3
  82. 82. 0 15,750 7,875 0 2,625 0 0 750 4,375 9,375 2,500 1,000 0 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 min( m [1, k ] + m [ k +1, 4]+ p 0 p k p 4 ) 1≦ k ≦3
  83. 83. 0 15,750 7,875 0 2,625 0 0 750 4,375 9,375 7,125 2,500 1,000 0 11,875 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20
  84. 84. 0 15,750 7,875 0 2,625 0 0 750 4,375 9,375 7,125 2,500 1,000 0 11,875 A 1 30×35 A 2 35×15 A 3 15×5 A 4 5×10 A 5 10×20 m [1, 5] 最適解の値
  85. 85. アルゴリズムの評価 <ul><li>計算量 </li></ul><ul><ul><li>3 重ループなので O ( n 3 ) </li></ul></ul><ul><ul><li>Ω( n 3 ) -> 練習問題 15.2-4 </li></ul></ul><ul><li>メモリ消費量 </li></ul><ul><ul><li>Θ( n 2 ) </li></ul></ul>
  86. 86. 4. 最適解 を 構成 する
  87. 87. <ul><li>s [ i , j ] から 最適解 を 構成 する </li></ul>P RINT- O PTIMAL- P ARENS ( s , i , j )
  88. 88. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  89. 89. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.3 動的計画法の基本要素
  90. 90. 15.3 の目次 <ul><li>部分構造最適性 </li></ul><ul><ul><li>発見の手順 </li></ul></ul><ul><ul><li>特徴・計算量 </li></ul></ul><ul><ul><li>間違 って 発見 しないように : 独立 </li></ul></ul><ul><li>部分問題重複性 </li></ul><ul><ul><li>重複問題の個数 </li></ul></ul><ul><ul><li>最適解の再構成 </li></ul></ul><ul><ul><li>メモ化 </li></ul></ul>
  91. 91. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 部分構造最適性
  92. 92. 部分構造最適性 を 発見 する 手順 <ul><li>問題の解 が ある選択 から 構成 されていることを 観察 する。 </li></ul><ul><li>最適解 を 導 く 選択 が 与 えられている と 仮定 する。 </li></ul><ul><li>選択 から 生 ずる 部分問題 を 決定 する。 部分問題 の 空間 を 特徴づける 。 </li></ul><ul><li>部分問題 の 解 が 最適解 であることを 決定 する。 </li></ul>
  93. 93. 例題 1 、例題 2 で 考 える <ul><li>問題の解 が ある選択 から 構成 されていることを 観察 する。 </li></ul><ul><li>最適解 を 導 く 選択 が 与 えられている と 仮定 する。 </li></ul><ul><li>選択 から 生 ずる 部分問題 を 決定 する。 部分問題 の 空間 を 特徴づける 。 </li></ul>
  94. 94. 例題 1 、例題 2 で 考 える <ul><li>部分問題 の 解 が 最適解 であることを 決定 する。 切り貼り法 を使って 証明 する (最適ではないと仮定して矛盾を導く) </li></ul>
  95. 95. 例題 1 、例題 2 で 考 える <ul><li>部分問題 の 解 が 最適解 であることを 決定 する。 切り貼り法 を使って 証明 する (最適ではないと仮定して矛盾を導く) </li></ul>
  96. 96. 部分構造最適性 を 発見 する 手順 <ul><li>問題の解 が ある選択 から 構成 されていることを 観察 する。 </li></ul><ul><li>最適解 を 導 く 選択 が 与 えられている と 仮定 する。 </li></ul><ul><li>選択 から 生 ずる 部分問題 を 決定 する。 部分問題 の 空間 を 特徴づける 。 </li></ul><ul><li>部分問題 の 解 が 最適解 であることを 決定 する。 </li></ul>どのように?
  97. 97. 部分問題 の 空間 の 特徴づけ を得る方法 <ul><li>最初 は できるだけ簡単 に 仮定 する </li></ul><ul><li>必要 に 応じて拡張 する </li></ul><ul><li>組み立てラインスケジューリング の 場合 </li></ul><ul><li>S 1, j と S 2, j を 仮定 </li></ul>うまく行く
  98. 98. 部分問題 の 空間 の 特徴づけ を得る方法 <ul><li>最初 は できるだけ簡単 に 仮定 する </li></ul><ul><li>必要 に 応じて拡張 する </li></ul><ul><li>連鎖行列積 の 場合 </li></ul><ul><li>A 1 A 2 … A j を 部分問題 の 空間 として 仮定していれば… </li></ul>A k と A k +1 で 分割 するとき 部分問題 A 1 … A k と A k +1 … A j を 生じる 部分問題 の 空間 に 含 まれない
  99. 99. 特徴量 <ul><li>元々与えられた問題の最適解が利用する部分問題の個数 </li></ul><ul><li>最適解が利用する部分問題の候補の個数 </li></ul>j - i ( k = i , i +1,…, j ) 2 ( A i … A k と A k +1 … A j ) 連鎖行列積 2 ( S 1, j と S 2, j ) 1 ( S 1, j もしくは S 2, j ) 組み立てラインスケジューリング 2. 候補の個数 1. 部分問題の個数
  100. 100. 計算時間 <ul><li>部分問題の総数 </li></ul><ul><li>各部分問題の候補数 </li></ul>高々 n 2 2. 候補数 O ( n 3 ) Θ( n ) 合計 Θ( n 2 ) 連鎖行列積 Θ( n ) 組み立てラインスケジューリング 1. 部分問題の総数
  101. 101. 貪欲アルゴリズム との 比較 <ul><li>共通点 </li></ul><ul><ul><li>どちらも 部分問題最適性 を利用する </li></ul></ul><ul><li>違うところ </li></ul><ul><ul><li>動的計画法 = ボトムアップ </li></ul></ul><ul><ul><li>貪欲アルゴリズム = トップダウン </li></ul></ul>
  102. 102. 間違えて部分問題最適性を 仮定しないために <ul><li>有向グラフ G =( V , E ) で 以下 の 問題 を 考 える </li></ul><ul><ul><li>重みなし最短 ( 単純 ) 路 </li></ul></ul><ul><ul><li>重みなし最長単純路 </li></ul></ul>単純路 = ループ や 多重辺 を 含 まない
  103. 103. 重みなし最短路問題 <ul><li>部分構造最適性を持つ </li></ul><ul><ul><li>p 1 は u から w への 最短路 </li></ul></ul><ul><ul><li>もし そうでないならば、 最短路 を p 1 ’ とすれば p 1 ’ と p 2 を 組み合わせて より 最短 な 経路 を 作成 できる </li></ul></ul>
  104. 104. 重みなし最長単純路問題 <ul><li>部分構造最適性を持たない </li></ul><ul><ul><li>( 反例 ) </li></ul></ul>q -> t への 最長路 部分問題 q -> r への 最長路 部分問題 r -> t への 最長路 2 3 3 q s r t q s r t q s r t
  105. 105. 重みなし最長単純路問題 <ul><li>動的計画法ではとけない </li></ul><ul><li>NP 問題 </li></ul><ul><ul><li>多項式時間でも解けていない </li></ul></ul>
  106. 106. 違いは「 独立 」 <ul><li>最短単純路 : 独立 </li></ul><ul><li>最長単純路 : 独立でない </li></ul>独立 = 部分問題の解 が 別の部分問題の解 に 影響を与えない
  107. 107. 最長単純路 は 「 独立」 か? <ul><li>2つ の 最適解 を 組み合わせると、 経路 は 単純 でなくなる </li></ul>部分問題 q -> r への 最長路 部分問題 r -> t への 最長路 3 3 部分問題の最適解が別の問題へ影響を与えている q s r t q s r t
  108. 108. 最短路は 「単純」 か? <ul><li>2つ の 部分問題 は w 以外 の 点 を 共有 しない ので 「単純」 </li></ul><ul><li>もし w 以外 の 点 x を 共有 すると </li></ul><ul><ul><li>u -> x -> w -> x -> v </li></ul></ul><ul><ul><li>x -> w -> x を ショートカット すれば、より 最短 な 経路になる </li></ul></ul><ul><ul><li>矛盾! </li></ul></ul>
  109. 109. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 部分問題重複性
  110. 110. 部分問題重複性 の 性質 <ul><li>再帰の仮定で同じ問題が何度も出てくる </li></ul><ul><ul><li>動的計画法では部分問題の解を表に記録することで対応する </li></ul></ul><ul><li>分割統治法 </li></ul><ul><ul><li>再帰の仮定で新しい問題が生まれる </li></ul></ul>
  111. 111. 連鎖行列積 を 再帰 で 解 いたら… <ul><li>T ( n ) := 再帰で解いた場合の計算時間 </li></ul>
  112. 112. 連鎖行列積 を 再帰 で 解 いたら… (2) <ul><li>置き換え法で T ( n )=Ω(2 n ) を証明する </li></ul>つまり… 少なくとも 2 n の 計算量!
  113. 113. 最適解の再構成 「 最適解の値」 を求めたあとに「 最適解」 を求める <ul><li>組み立てラインスケジューリング の 場合 </li></ul><ul><ul><li>直前のステーション を l i [ j ] に 記録 した </li></ul></ul><ul><ul><li>l i [ j ] がなくても、 わずかな計算 O ( n ) で 再構成 できる </li></ul></ul><ul><ul><ul><li>f 1 [ j ] = f 1 [ j -1]+ a 1 ならば S 1, j を 経由 </li></ul></ul></ul><ul><ul><ul><li>f 1 [ j ] = f 2 [ j -1]+t 2, j -1 + a 1 ならば S 2, j を 経由 </li></ul></ul></ul><ul><li>連鎖行列積問題 の 場合 </li></ul><ul><ul><li>直前の分割 を s [ i , j] に 記録 した </li></ul></ul><ul><ul><li>s [ i , j] を 利用しないと、再構成には Θ( j - i ) が必要 </li></ul></ul><ul><ul><li>s [ i , j] があれば O (1) で計算できる </li></ul></ul>
  114. 114. メモ化 (memoize) <ul><li>再帰の過程で計算結果を覚えておく </li></ul><ul><li>重複する部分問題を O (1) で思い出せる </li></ul>O ( n 3 ) 再帰 + メモ化 2 n O ( n 3 ) 連鎖行列積 再帰のみ 動的計画法
  115. 115. 動的計画法 v.s. 再帰+メモ化 <ul><li>全ての部分問題を解く必要がある場合 </li></ul><ul><ul><li>動的計画法の方が優れている </li></ul></ul><ul><ul><li>再帰のオーバーヘッドが少ない </li></ul></ul><ul><ul><li>時間や表の領域を節約するアルゴリズムもある </li></ul></ul><ul><li>一部の部分問題を解く必要がない場合 </li></ul><ul><ul><li>再帰+メモ化は不要な問題を解かなくてよい </li></ul></ul>
  116. 116. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  117. 117. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.4 最長共通 部分系列
  118. 118. 問題 <ul><li>DNA の 塩基 がどれぐらい 一致 しているか 知 りたい </li></ul><ul><li>最長部分系列 を求める </li></ul>
  119. 119. 問題 <ul><li>DNA の 塩基 がどれぐらい 一致 しているか 知 りたい </li></ul><ul><li>最長部分系列 を求める </li></ul><ul><ul><li>部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 </li></ul></ul>X = 〈 A , B , C , B , D , A , B 〉 Z = 〈 B , C , D , B 〉 部分系列
  120. 120. 問題 <ul><li>DNA の 塩基 がどれぐらい 一致 しているか 知 りたい </li></ul><ul><li>最長部分系列 を求める </li></ul><ul><ul><li>部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 </li></ul></ul>X = 〈 A , B , C , B , D , A , B 〉 Z = 〈 B , C , D , B 〉 〈 2, 3, 5, 7 〉 部分系列
  121. 121. 問題 <ul><li>DNA の 塩基 がどれぐらい 一致 しているか 知 りたい </li></ul><ul><li>最長部分系列 を求める </li></ul><ul><ul><li>部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 </li></ul></ul><ul><ul><li>共通部分系列 とは 2つの系列の共通する部分系列 </li></ul></ul>X = 〈 A , B , C , B , D , A , B 〉 Y = 〈 B , D , C , A , B , A 〉 〈 B , C , A 〉 は 共通部分系列
  122. 122. 問題 <ul><li>DNA の 塩基 がどれぐらい 一致 しているか 知 りたい </li></ul><ul><li>最長部分系列 を求める </li></ul><ul><ul><li>部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 </li></ul></ul><ul><ul><li>共通部分系列 とは 2つの系列の共通する部分系列 </li></ul></ul>X = 〈 A , B , C , B , D , A , B 〉 Y = 〈 B , D , C , A , B , A 〉 〈 B , C , A 〉 は 共通部分系列
  123. 123. 問題 <ul><li>DNA の 塩基 がどれぐらい 一致 しているか 知 りたい </li></ul><ul><li>最長部分系列 を求める </li></ul><ul><ul><li>部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 </li></ul></ul><ul><ul><li>共通部分系列 とは 2つの系列の共通する部分系列 </li></ul></ul>X = 〈 A , B , C , B , D , A , B 〉 Y = 〈 B , D , C , A , B , A 〉 最長部分系列 (LCS) は 〈 B , C , A, B 〉 と 〈 B , D , A, B 〉
  124. 124. 問題 <ul><li>DNA の 塩基 がどれぐらい 一致 しているか 知 りたい </li></ul><ul><li>最長部分系列 を求める </li></ul><ul><ul><li>部分系列 とは X = 〈 x 1 , x 2 ,…, x m 〉 の 部分系列 が Z = 〈 z 1 , z 2 ,…, z k 〉 であるとは、 増加する添え字の列〈 i 1 , i 2 ,… i k 〉 が 存在 し、 x i j = z j を 満 たす。 </li></ul></ul><ul><ul><li>共通部分系列 とは 2つの系列の共通する部分系列 </li></ul></ul><ul><ul><li>最長共通部分系列問題 とは X = 〈 x 1 , x 2 ,…, x m 〉 と Y = 〈 y 1 , y 2 ,…, y n 〉の 最長共通部分系列 (LCS) を求める </li></ul></ul>
  125. 125. 総当り作戦 の 破綻 <ul><li>X の部分系列の個数 -> O (2 m ) </li></ul>総当り には Ω (2 m ) 必要
  126. 126. 1. 最適解の構造を 特徴づける
  127. 127. LCS の 部分構造最適性 <ul><li>X = 〈 x 1 , x 2 ,…, x m 〉 と Y = 〈 y 1 , y 2 ,…, y n 〉 の LCS が Z = 〈 z 1 , z 2 ,…, z k 〉 であると 仮定 すると </li></ul><ul><li>x m = y n ならば z k = x m = y n であり、 Z k -1 は X m -1 と Y n -1 の LCS である </li></ul><ul><li>x m ≠ y n のとき、 z k ≠ x m ならば Z は X m -1 と Y の LCS である </li></ul><ul><li>x m ≠ y n のとき、 z k ≠ y n ならば Z は X と Y n -1 の LCS である </li></ul>接頭語 X i = 〈 x 1 , x 2 ,…, x i 〉とする
  128. 128. 2. 最適解 の 値 を 再帰的 に 定義 する
  129. 129. LCS を求める手順 <ul><li>x m = y n のとき </li></ul><ul><ul><li>X m -1 と Y n -1 の LCS を 求める </li></ul></ul><ul><li>x m ≠ y n のとき </li></ul><ul><ul><li>「 X m -1 と Y の LCS 」と「 X と Y n -1 の LCS 」 の 長い ほうを 採用する </li></ul></ul>部分問題の部分問題を共有している -> 部分問題重複性
  130. 130. 最適解 の 値 c [ i , j ] = X i と Y j の LCS の 長さ ※ 利用しない部分問題が存在する
  131. 131. 3. ボトムアップ に 最適解 の 値 を 求 める
  132. 132. 動的計画法 の 利用 <ul><li>再帰(メモ化なし)で計算すると指数時間 </li></ul><ul><li>部分問題の個数は Θ( nm ) 個のみ </li></ul>動的計画法で ボトムアップ ( 昇順 ) に 解く
  133. 133. LCS-L ENGTH( X , Y ) 左上から1つ ずつ計算 i =0, j =0 を設定
  134. 134. 例 (p35) i =0, j =0 を 初期化 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  135. 135. 例 (p35) i =1, j =1 のとき x i ≠ y j , c [ i -1, j ]≧ c [ i , j -1] 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  136. 136. 例 (p35) i =1, j =2 のとき x i ≠ y j , c [ i -1, j ]≧ c [ i , j -1] 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  137. 137. 例 (p35) i =1, j =3 のとき x i ≠ y j , c [ i -1, j ]≧ c [ i , j -1] 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  138. 138. 例 (p35) i =1, j =4 のとき x i = y j 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  139. 139. 例 (p35) i =1, j =5 のとき x i ≠ y j , c [ i -1, j ]< c [ i , j -1] ← 1 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  140. 140. 例 (p35) i =1, j =5 のとき x i = y j ← 1 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 0 B 2 ↖ 1 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  141. 141. 例 (p35) ↖ 2 ← 1 0 B 5 0 0 0 0 0 0 x i 0 0 B 4 0 B 7 0 A 6 0 D 5 0 C 3 ← 2 ↑ 1 ← 1 ← 1 ↖ 1 0 B 2 ↖ 1 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  142. 142. 例 (p35) ↖ 4 ↑ 3 ↑ 3 ↖ 3 ↑ 2 ↖ 2 ← 1 0 B 5 0 0 0 0 0 0 x i 0 ← 3 ↑ 2 ↑ 2 ↑ 1 ↖ 1 0 B 4 ↑ 4 ↑ 3 ↑ 2 ↑ 2 ↖ 1 0 B 7 ↖ 4 ↑ 3 ↑ 2 ↑ 2 ↑ 1 0 A 6 ↑ 3 ↑ 3 ↑ 2 ↖ 2 ↑ 1 0 D 5 ↑ 2 ← 2 ↖ 2 ↑ 1 ↑ 1 0 C 3 ← 2 ↑ 1 ← 1 ← 1 ↖ 1 0 B 2 ↖ 1 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  143. 143. 4. 最適解 を 構成 する
  144. 144. P RINT- LCS ( b , X , i , j )
  145. 145. 例 (p35) ↖ 4 ↑ 3 ↑ 3 ↖ 3 ↑ 2 ↖ 2 ← 1 0 B 5 0 0 0 0 0 0 x i 0 ← 3 ↑ 2 ↑ 2 ↑ 1 ↖ 1 0 B 4 ↑ 4 ↑ 3 ↑ 2 ↑ 2 ↖ 1 0 B 7 ↖ 4 ↑ 3 ↑ 2 ↑ 2 ↑ 1 0 A 6 ↑ 3 ↑ 3 ↑ 2 ↖ 2 ↑ 1 0 D 5 ↑ 2 ← 2 ↖ 2 ↑ 1 ↑ 1 0 C 3 ← 2 ↑ 1 ← 1 ← 1 ↖ 1 0 B 2 ↖ 1 ↖ 1 ↑ 0 ↑ 0 ↑ 0 0 A 1 A A C D B y j i 6 4 3 2 1 0 j
  146. 146. コードの改善 <ul><li>b [ i , j ] を 利用しない </li></ul><ul><ul><li>c [ i, j ] の 矢印 の 方向 は O (1) で求められる </li></ul></ul><ul><ul><li>最適解の構成に要する時間: O ( m + n ) </li></ul></ul><ul><ul><li>メモリ量の節約: Θ( mn ) </li></ul></ul><ul><li>c [ i , j ] の メモリ量 を 削減 する </li></ul><ul><ul><li>直前 の 行 c [ i -1, j ] のみを 覚えて おけばよい </li></ul></ul><ul><ul><li>最適解の値 (長さ)のみを 求めればよい 場合 </li></ul></ul><ul><ul><li>メモリ量の節約: Θ( mn ) </li></ul></ul>↑ 2 B 5 x i 0 ↑ 1 ↖ 1 0 B 4 B 7 A 6 D 5 ↑ 2 ← 2 ↖ 2 ↑ 1 ↑ 1 0 C 3 B 2 A 1 A A C D B y j i 6 4 3 2 1 0 j
  147. 147. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5
  148. 148. 15 章の構成 例 題 1 例 題 2 一 般 化 例 題 3 例 題 4 15.1 15.2 15.3 15.4 15.5 15.5 最適2分 探索木
  149. 149. 問題 <ul><li>2分探索木 T を 最小の時間 で 探索 したい </li></ul>k 2 k 1 k 4 k 3 k 5 k i を 検索 する 確率 : pi 0.20 0.10 0.05 0.10 0.15 p i 5 4 3 2 1 i
  150. 150. 問題 <ul><li>2分探索木 T を 最小の時間 で 探索 したい </li></ul>k 2 k 1 k 4 k 3 k 5 d 0 d 1 d 2 d 3 d 4 d 5 <ul><li>d i (ダミーキー)を 導入 </li></ul><ul><li>d 0 : k 1 未満 の 全て の 値 </li></ul><ul><li>d i : k i < d i < k i +1 を 満 たす 全て の 値 </li></ul><ul><li>d n : k n より 大きい全て の 値 </li></ul>
  151. 151. 問題 <ul><li>2分探索木 T を 最小の時間 で 探索 したい </li></ul>k 2 k 1 k 4 k 3 k 5 d 0 d 1 d 2 d 3 d 4 d 5 k i を 検索 する 確率 : p i d i を 検索 する 確率 : q i 0.05 0 0.10 0.05 0.05 0.05 0.10 q i 0.20 0.10 0.05 0.10 0.15 p i 5 4 3 2 1 i
  152. 152. 問題 <ul><li>2分探索木 T を 最小の時間 で 探索 したい </li></ul>k 2 k 1 k 4 k 3 k 5 d 0 d 1 d 2 d 3 d 4 d 5 この値 を 最小化 する T を 求 める
  153. 153. 総当り作戦 の 破綻 <ul><li>全ての2分木の個数 -> Ω(4 n / n 3/2 ) </li></ul>総当り は 非現実的
  154. 154. 1. 最適解の構造を 特徴づける
  155. 155. 最適 2 分探索木 T が <ul><li>キー k i ,… k j を含む部分木 T ’ を持つとする </li></ul>k x k r k i k j T ’ T’ は キー k 1 ,…, k j と ダミーキー d i ,…, d j から定義される 部分問題 の 最適解
  156. 156. なぜならば <ul><li>もっと期待値が小さい部分木 T ’’ が あるなら、 この部分木 を使って T をよりよくできる </li></ul>矛盾 k x k r k i k j T ’’ T が 最適 2 分探索木 で あることと
  157. 157. 部分問題最適性 を 利用 する <ul><li>キー k i ,… k j の 根 を k r とする </li></ul>k r 左部分木 k i ,…, k r -1 右部分木 k r +1 ,…, k j 全 ての k r に 対 して 左部分木 と 右部分木 の 最適 2 分探索木 を 決定 する <ul><li>r = i のとき </li></ul><ul><li>左部分木 は d i -1 のみを 含む </li></ul><ul><li>r = j のとき </li></ul><ul><li>右部分木 は d j のみを 含む </li></ul>※
  158. 158. 2. 最適解 の 値 を 再帰的 に 定義 する
  159. 159. 最適解 の 値 e [ i , j ] = キー ki ,… kj を含む 最適 2 分探索木 の探索コストの期待値 最終目的: e [1, n ] を求める
  160. 160. 最適解の値を求める <ul><li>部分木の深さが1増えると 探索コストの期待値は 部分木の中の確率の和だけ増加する </li></ul><ul><li>k r が キー k i ,… k j を 含む 最適 2 部分探索木 の 根であるとき </li></ul>
  161. 161. 未知 の 値 k を 求 める root [ i , j ] を k r の 添え字 と定義する
  162. 162. 3. ボトムアップ に 最適解 の 値 を 求 める
  163. 163. O PTIMAL- BST ( p , q , n )
  164. 164. アルゴリズムの評価 <ul><li>計算量 </li></ul><ul><ul><li>3 重ループなので O ( n 3 ) </li></ul></ul><ul><ul><li>Ω( n 3 ) -> 練習問題 15.2-4 </li></ul></ul><ul><li>メモリ消費量 </li></ul><ul><ul><li>Θ( n 2 ) </li></ul></ul>
  165. 165. ご清聴ありがとうございました

×