問題 車を組み立てる 2つのラインがある 各ライン には n 個 の ステーション S 1, j 、 S 2, j がある 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.
問題 車を組み立てる 2つのラインがある 各ライン には n 個 の ステーション S 1, j 、 S 2, j がある ステーション S i , j では 組立に a i , j 時間 かかる 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.
問題 車を組み立てる 2つのラインがある 各ライン には n 個 の ステーション S 1, j 、 S 2, j がある ステーション S i , j では 組立に a i , j 時間 かかる 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.
問題 車を組み立てる 2つのラインがある 各ライン には n 個 の ステーション S 1, j 、 S 2, j がある ステーション S i , j では 組立に a i , j 時間 かかる ラインを変える には t i , j 時間 かかる 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.
問題 車を組み立てる 2つのラインがある 各ライン には n 個 の ステーション S 1, j 、 S 2, j がある ステーション S i , j では 組立に a i , j 時間 かかる ラインを変える には t i , j 時間 かかる -> 最短時間の順路 を 求める 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
再帰 を そのまま解くと・・・ 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.
再帰 を そのまま解くと・・・ 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.
F ASTEST -WAY( a , t , e , x , n ) 最適解 の 値 を 計算 f i [ j ] を 計算 初期値 を 設定
問題 行列積 A 1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない ( A 1 ( A 2 ( A 3 A 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 ) ((( A 1 A 2 ) A 3 ) A 4 )
46.
問題 行列積 A 1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない ( A 1 ( A 2 ( A 3 A 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 ) : 中左右の順 ((( A 1 A 2 ) A 3 ) A 4 ) : 左から
47.
問題 行列積 A 1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない 計算量は括弧付けの順番に依存する A ( p × q 行列 ) と B ( q × r 行列 ) の 積 で は、 pqr 回 の 掛け算 が 実施 される
48.
行列積 A1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない 計算量は括弧付けの順番に依存する 問題 ( 例 ) 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.
行列積 A1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない 計算量は括弧付けの順番に依存する 問題 (( 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.
行列積 A1 A 2 … A n の計算量を小さくしたい 演算結果は括弧付けの順番に寄らない 計算量は括弧付けの順番に依存する -> A 1 A 2 … A n の 乗算回数 を 最小化 する 括弧付け を 決定 する A i の 次元 は p i -1 × p i 問題
51.
括弧付けの個数 P (n ) : N 個 の 行列 に対する 括弧付け の 個数 総当り には Ω (4 n / n 3/2 ) 必要
52.
括弧付けの個数 ( A1 ( 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.
括弧付けの個数 ( A1 ( 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.
括弧付けの個数 ( A1 ( 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) + × × × +
A i Ai +1 … A j の 最適括弧付け が A k と A k +1 で 分割すると仮定する A i A i +1 … A k A k +1 … A j
57.
A i Ai +1 … A j の 最適括弧付け が A k と A k +1 で 分割すると仮定する A i A i +1 … A k A k +1 … A j 部分括弧付け は A i … A k の 最適括弧付け となっている 部分括弧付け は A k +1 … A j の 最適括弧付け となっている
58.
より良い 括弧付け があればそれを使って A i A i +1 … A j を より良くできる なぜならば A i A i +1 … A k A k +1 … A j より良い括弧付け
59.
より良い 括弧付け があればそれを使って A i … A j を より良くできる なぜならば A i A i +1 … A k A k +1 … A j より良い括弧付け A i A i +1 … A j が 最適括弧付け であることと 矛盾
60.
部分問題最適性 問題 (A i A i +1 … A j ) の 最適解 に 部分問題 ( A i … A k と A k+ 1 … A j ) の 最適解 が 含 まれる
最適解 の 値m [ i, j ] = A i … A j の 計算 に 必要 な スカラ乗算 の 最小回数 A i A i +1 … A k A k +1 … A j
63.
最適解 の 値最適解 は A k と A k +1 で 分割 する と仮定する m [ i, j ] = A i … A j の 計算 に 必要 な スカラ乗算 の 最小回数 A i A i +1 … A k A k +1 … A j
64.
最適解 の 値最適解 は A k と A k +1 で 分割 する と仮定する 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.
未知 の 値 k を 求 める 全ての k を 調 べて 最良 のものを 選択 する 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)
M ATRIX- CHAIN- O RDER( p ) 初期値 を 設定 連鎖長 が l のもので ループ m [ i , j ] を 求める
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.
図で考える 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.
0 0 00 0 A 1 30×35 A 2 35×15 A 3 15×10 A 4 10×20 A 5 20×25
74.
0 i =1j =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.
0 15,750 00 0 0 A 1 30×35 A 2 35×15 A 3 15×10 A 4 10×20 A 5 20×25
76.
0 15,750 02,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.
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.
0 15,750 7,8750 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.
0 15,750 7,8750 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.
0 15,750 7,8750 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.
0 15,750 7,8750 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.
0 15,750 7,8750 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.
0 15,750 7,8750 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.
0 15,750 7,8750 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.
アルゴリズムの評価 計算量 3重ループなので O ( n 3 ) Ω( n 3 ) -> 練習問題 15.2-4 メモリ消費量 Θ( n 2 )
部分問題 の 空間の 特徴づけ を得る方法 最初 は できるだけ簡単 に 仮定 する 必要 に 応じて拡張 する 連鎖行列積 の 場合 A 1 A 2 … A j を 部分問題 の 空間 として 仮定していれば… A k と A k +1 で 分割 するとき 部分問題 A 1 … A k と A k +1 … A j を 生じる 部分問題 の 空間 に 含 まれない
99.
特徴量 元々与えられた問題の最適解が利用する部分問題の個数 最適解が利用する部分問題の候補の個数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.
計算時間 部分問題の総数 各部分問題の候補数高々 n 2 2. 候補数 O ( n 3 ) Θ( n ) 合計 Θ( n 2 ) 連鎖行列積 Θ( n ) 組み立てラインスケジューリング 1. 部分問題の総数
連鎖行列積 を 再帰で 解 いたら… (2) 置き換え法で T ( n )=Ω(2 n ) を証明する つまり… 少なくとも 2 n の 計算量!
113.
最適解の再構成 「 最適解の値」を求めたあとに「 最適解」 を求める 組み立てラインスケジューリング の 場合 直前のステーション を l i [ j ] に 記録 した l i [ j ] がなくても、 わずかな計算 O ( n ) で 再構成 できる f 1 [ j ] = f 1 [ j -1]+ a 1 ならば S 1, j を 経由 f 1 [ j ] = f 2 [ j -1]+t 2, j -1 + a 1 ならば S 2, j を 経由 連鎖行列積問題 の 場合 直前の分割 を s [ i , j] に 記録 した s [ i , j] を 利用しないと、再構成には Θ( j - i ) が必要 s [ i , j] があれば O (1) で計算できる
114.
メモ化 (memoize)再帰の過程で計算結果を覚えておく 重複する部分問題を O (1) で思い出せる O ( n 3 ) 再帰 + メモ化 2 n O ( n 3 ) 連鎖行列積 再帰のみ 動的計画法
問題 DNA の塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは 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 を 満 たす。 X = 〈 A , B , C , B , D , A , B 〉 Z = 〈 B , C , D , B 〉 部分系列
120.
問題 DNA の塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは 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 を 満 たす。 X = 〈 A , B , C , B , D , A , B 〉 Z = 〈 B , C , D , B 〉 〈 2, 3, 5, 7 〉 部分系列
121.
問題 DNA の塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは 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 を 満 たす。 共通部分系列 とは 2つの系列の共通する部分系列 X = 〈 A , B , C , B , D , A , B 〉 Y = 〈 B , D , C , A , B , A 〉 〈 B , C , A 〉 は 共通部分系列
122.
問題 DNA の塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは 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 を 満 たす。 共通部分系列 とは 2つの系列の共通する部分系列 X = 〈 A , B , C , B , D , A , B 〉 Y = 〈 B , D , C , A , B , A 〉 〈 B , C , A 〉 は 共通部分系列
123.
問題 DNA の塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは 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 を 満 たす。 共通部分系列 とは 2つの系列の共通する部分系列 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.
問題 DNA の塩基 がどれぐらい 一致 しているか 知 りたい 最長部分系列 を求める 部分系列 とは 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 を 満 たす。 共通部分系列 とは 2つの系列の共通する部分系列 最長共通部分系列問題 とは X = 〈 x 1 , x 2 ,…, x m 〉 と Y = 〈 y 1 , y 2 ,…, y n 〉の 最長共通部分系列 (LCS) を求める
125.
総当り作戦 の 破綻X の部分系列の個数 -> O (2 m ) 総当り には Ω (2 m ) 必要
LCS の 部分構造最適性X = 〈 x 1 , x 2 ,…, x m 〉 と Y = 〈 y 1 , y 2 ,…, y n 〉 の LCS が Z = 〈 z 1 , z 2 ,…, z k 〉 であると 仮定 すると x m = y n ならば z k = x m = y n であり、 Z k -1 は X m -1 と Y n -1 の LCS である x m ≠ y n のとき、 z k ≠ x m ならば Z は X m -1 と Y の LCS である x m ≠ y n のとき、 z k ≠ y n ならば Z は X と Y n -1 の LCS である 接頭語 X i = 〈 x 1 , x 2 ,…, x i 〉とする
例 (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.
例 (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.
例 (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.
例 (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.
例 (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.
例 (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.
例 (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.
例 (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.
例 (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
例 (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.
コードの改善 b [i , j ] を 利用しない c [ i, j ] の 矢印 の 方向 は O (1) で求められる 最適解の構成に要する時間: O ( m + n ) メモリ量の節約: Θ( mn ) c [ i , j ] の メモリ量 を 削減 する 直前 の 行 c [ i -1, j ] のみを 覚えて おけばよい 最適解の値 (長さ)のみを 求めればよい 場合 メモリ量の節約: Θ( mn ) ↑ 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
問題 2分探索木 Tを 最小の時間 で 探索 したい 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.
問題 2分探索木 Tを 最小の時間 で 探索 したい k 2 k 1 k 4 k 3 k 5 d 0 d 1 d 2 d 3 d 4 d 5 d i (ダミーキー)を 導入 d 0 : k 1 未満 の 全て の 値 d i : k i < d i < k i +1 を 満 たす 全て の 値 d n : k n より 大きい全て の 値
151.
問題 2分探索木 Tを 最小の時間 で 探索 したい 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.
問題 2分探索木 Tを 最小の時間 で 探索 したい k 2 k 1 k 4 k 3 k 5 d 0 d 1 d 2 d 3 d 4 d 5 この値 を 最小化 する T を 求 める
最適 2 分探索木T が キー k i ,… k j を含む部分木 T ’ を持つとする k x k r k i k j T ’ T’ は キー k 1 ,…, k j と ダミーキー d i ,…, d j から定義される 部分問題 の 最適解
156.
なぜならば もっと期待値が小さい部分木 T’’ が あるなら、 この部分木 を使って T をよりよくできる 矛盾 k x k r k i k j T ’’ T が 最適 2 分探索木 で あることと
157.
部分問題最適性 を 利用する キー k i ,… k j の 根 を k r とする k r 左部分木 k i ,…, k r -1 右部分木 k r +1 ,…, k j 全 ての k r に 対 して 左部分木 と 右部分木 の 最適 2 分探索木 を 決定 する r = i のとき 左部分木 は d i -1 のみを 含む r = j のとき 右部分木 は d j のみを 含む ※