第2回 - Donald Home Page

はじめに

H27 情報数学特論
動的計画法 (DP: Dynamic Programming)


第2回:動的計画法
最適性の原理 : 最適解へ至る途中計算も最適である
DPはこの性質を満たす問題に対して有効
ある問題の計算木
―出来るだけ長い部分列を求める―
初期状態
坂本比呂志
九州工業大学大学院情報工学研究院
最適解の計算経路
途中計算もそこまでの解の中で最適
DPの応用 (部分列に関する二つの
問題)
最適性の原理が成立する例


グラフ上の最短経路問題
部分列とは

2点間 (例えばa~c) の最短経路がわかっており、
それが b を経由するとき、a~b までの部分経路は
a~b 間の最短経路でもある
L(a,b)


b

L(b,c)
c
L’(a,b)
e
d
九州工業大学 情報工学部 坂本比呂志
3
配列から値が増加している部
分を取り出す
スケジューリングなどに応用
最長共通部分列 (LCS)

もしそれ以外の最短経路L’(a,b)が存在する
なら、L’(a,b)+L(b,c) < L(a,b)+L(b,c) = L(a,c)
となり、L(a,c)が最短であることに反する



(オブジェクトの)列からいくつ
かの要素を取り出した列
最長増加部分列 (LIS)

a
2
LIS


1,4,2,5,6,8,7,8,1,2,9
LCS

1,3,2,5,7,8
of
2,3,1,3,4,2,5,8,7,8 and
1,4,3,1,2,5,5,7,8
二つの配列の共通部分を取
り出す
DNA配列の類似性を決定
編集距離の問題とほぼ等し
い
4
1
最長増加部分列

最長増加部分列
[マトリョーシカの問題]




高さと幅を持つ人形がいくつか与えられている(マトリョーシカ)
高さと幅がともに大きい人形の内部に小さい方を格納できる
入れ子にできる最大個数を求めよ
配列 S= s1, s2, …, snの部分列 (Subsequence)


S のいくつかの要素を取り出して、元の順番を保って
並べたもの
例:S = 8,2,9,4,7,3,5,6 のとき


通常のマトリョーシカ(右図)では
人形は相似形なので、単に体積で
ソートすれば、すべてのものを
入れ子にできる。
しかし、上の問題はパラメータが
二つあるため単純ではない。


部分列として 8,4,3 や 9,3,5,6 などがある
配列 S に対して S も自分自身の部分列である
部分列の可能な場合は 2|S| 通りある
増加部分列 (Increasing subsequence)


右に行くほど値が増加している部分列 (2,4,7 など)
減少部分列も同様
http://www.sankei.co.jp
5
最長増加部分列

最長増加部分列(LIS)の解法
‘マトリョーシカの問題’は高さと幅のどちらかでソートし、
残りの値の配列から最長増加部分列 (LIS: Longest
Increasing Sequence) を求めることと同じ
高さでソート
高さ 1, 3, 4, 7, 8, 11, 12, 13
6, 7, 10, 9, 1, 2, 4, 5
幅



この一組の数が1個の
マトリョーシカを決める
パラメータ

簡略化のため、すべての値は異なると仮定

失敗する戦略


この配列では、1,2,4,5が最長増加部分列
しらみつぶしは困難 (可能な場合は指数的)
この問題を効率よく計算する方法は?

左から順番に値を取り出す
i+1番目の値を i番目までに得られた最長増加部分列
に加えて新しい増加列が得られるかどうかをチェック
最終的に得られた部分列を出力
6, 7, 10, 9, 1, 2, 4, 5
7
九州工業大学 情報工学部 坂本比呂志
6
失敗
8
正解
2
演習問題2-1
LISの解法

戦略の修正:




戦略1:同じ長さの部分列はどちらかを残す
例:6,7,10,9,1,2,4で4文字目まで読んだとき、(6,7,10)と
(6,7,9)のうち必要なのは末尾の値が小さい方のみ


戦略2:i 文字目まで読んだとき、1~i の各長さの部
分列をひとつ覚えておく



[問題] 与えられた配列から、LISを計算するアル
ゴリズムを完成させよ

例:3,4,9,5,6,7,8 で、i = 3 までで記憶する増加部分列は、
(3), (3,4), (3,4,9),
最長の(3,4,9)だけでは、以下に続く 5,6,7,8 を増加部分列
として加えることができないため失敗する
実際は、(3,4) に 5,6,7,8 を加えたものが全体の最長

仮定:配列中のすべての値は異なるとしてよい
目標:なるべく効率的なアルゴリズムを設計
補足:アルゴリズムは手順がわかれば概略でよい
そのアルゴリズムが、例えば以下の入力に対し
て正しく動作することを確かめよ (LIS長は 5 )
10, 3, 2, 5, 8, 12, 6, 13, 9, 4
9
補足:LISの数学的性質
[発展的課題]

10
[問題] 最長増加部分列問題は、入力長 n に対
して O(n log n) 時間、O(n) 領域で計算可能であ
るが、どうすればよいか?
(二分探索を使う)
[定理] (Paul Erdös)
任意の配列 S (|S|=n)に対して、少なくとも
以上の
長さを持つ増加部分列または減少部分列のいずれか
が存在する
[証明]
与えられた配列をS= s1, s2, …, snとする
の長さの増加部分列がないと仮定すると、
以上の減少部分列が存在することを示す
http://www.sankei.co.jp
11
九州工業大学 情報工学部 坂本比呂志
12
3
[証明つづき]
[証明つづき]
定義: k∈Ki ⇔ skで終わるLISの長さがi
その他の値は以下のようにKiに配分される
括弧内は実際の値



以下の例を考える。i=3 とする
5番目を末尾に持つLISの長さは 3 であるので 5∈K3
7番目についても同様で、 K3={5,7} (それ以外は異なる)
i
1
2
3
4
5
6
7
si
10 3
2
5
8
12 6
8
9
13 9
i
1
2
3
4
5
6
si
10 3
2
5
8
12 6
7
8
9
13 9
10
4
6を末尾に持つ最長増加部分列の長さは3
よって7→K3
10
4
この値を末尾に持つ最長増加部分列
(3,5,8など)の長さは3
よって5→ K3
13
K1 = {1(10), 2(3), 3(2) }
K2 = { 4(5), 10(4)}
K3 = {5(8),7(6), }
K4 = {6(12), 9(9)}
K5 = {8(9),}
K6 = {∅} …
このとき一般に次が成り立つ
 任意の1~nはあるKi (1≤ i ≤n) に含まれる
(その値で終わるLISが少なくともひとつは存在する)
 i ≠ j ならば Ki ⋂ Kj = ∅
14
(ある値で終わるLISが二つ以上存在するのはi=jに限る)
[証明つづき]
[証明つづき]
ここで仮定より、K = ∅であるので、
1~nはすべてK1 ~K -1のいずれかに含まれる
このとき、ある j に対して |Kj|≥
である
あるjに対して|Kj|≥ である
この要素をi1<i2<…<imとすると、これらが示す配列の値は
この順に小さくなっているはず(そうでなければ、jより長い
増加部分列がとれてしまいKjの定義に反する)
11
12
13
5
7
2
3
6
15
8
1
14
4
鳩ノ巣原理
よって、長さ
9
10
以上の増加または減少部分列が存在する
16
K1 ~K
どれかが
-1 の箱に1~nを詰めると
を超える
15
九州工業大学 情報工学部 坂本比呂志
16
4
最長共通部分列 (LCS)

LCSの応用例
最長共通部分列 (LCS: Longest Common
Subsequence) の発見




塩基配列のアライメント

共通部分列:ある配列が、二つの配列に共に現れる
部分列であること
LCSは最長の共通部分列を見つける問題
この問題もDPを用いてO(n2)時間で計算可能(ただし、
nは二つの配列の長い方の配列長)

二つの塩基配列に適当にギャップ(空白)を挿入して、
対応する塩基をなるべく一致させる操作
赤い文字の部分は二つの配列のLCS
入力
GAGGTTATCAAAAGCTACTAGTCCA
GAGGATAACAAGGCTACTATCACA
出力
GAGGTTATCAA AA GCTACTAGTC CA
GAGG AT AACAAGGCTACTA TCACA
17
18
http://www.dna.bio.keio.ac.jp/
LCSの解法

LCSの解法
接頭辞のLCS





配列 S の i 番目の文字を S[i] と表す
配列 S の先頭から連続する k 文字の並びを、
S の長さ k の接頭辞という
二つの配列 S,S’ のそれぞれのある接頭辞(長さi,j)に
ついて、それらのLCSの長さを LCS(i,j) とする
例:S=abcde, S’=adbbcd に対して、
LCS(3,4)=LCS(abc,adbb)=2,
LCS(3,5)=LCS(abc,adbbc)=3
19
九州工業大学 情報工学部 坂本比呂志
LCSの性質:LCS(i,j)は末尾の文字 S[i] と S’[j] によって
場合分けできる (i,jのどちらかが0のときはLCS(i,j)=0)


S[i] = S ’[j]のとき:LCS(i,j) = LCS(i-1,j-1)+1
s[i-1]
s[i]
s’[j-1]
s’[j]
...
...
末尾を一致させ、残りの色つきの部分
のLCSと結合したものが最長
S[i] ≠S ’[j]のとき:LCS(i,j) = max{ LCS(i-1,j), LCS(i,j-1) }
s[i-1]
s[i]
s’[j-1]
s’[j]
...
...
末尾が一致しないので、色つきの部分
が一致するのが限度(LCS(i-1,j)の場合)
20
5
演習問題2-2
LCSの解法

LCSの計算:S=bcbd, S’=adbdcd のとき、以下の
行列の各成分のうち、最大値が求めるLCS
a
d
b
(i,j)成分の計算
d
c
d
b
i
c
[問題] 以下の配列のLCSを計算し、さらに長さだけでは
なく実際のLCSの配列を求める方法を述べよ
ヒント:まず i=0 や j=0 と固定して求める
j
初期状態

a
d
b
d
c
b
d
b
(i,j)
c
b
b
d
d
d
a
c
d
a
b
b
a
(i,j)
c
c
a
b
LCS(i,j)の値を格納するセル:
この場合はLCS(bc,adb)=1
九州工業大学 情報工学部 坂本比呂志
末尾が等しいときの計算
それ以外のときの計算
d
21
22
6