アルゴリズム入門(1shuichi/algintro/alg-1s.pdf · 7...
TRANSCRIPT
宮崎修一京都大学 学術情報メディアセンター
アルゴリズム入門(1)(アルゴリズムの基礎)
2
アルゴリズムとは?
問題を解く手順、算法(あとで具体例)
問題とは?
入力と、それに対する出力がきっちり決まっているもの。(与えられた入力に対して、正しい出力を計算することを要求する。)
3
例1:最大公約数を求める問題入力:正の整数 x と y
出力:x と yの最大公約数
入力 (10, 8) → 出力 2入力 ( 3, 8) → 出力 1入力 ( 5,10) → 出力 5
例2:ソーティング(並べ替え)入力:n個の正の整数出力:小さい順に並べ替えたもの
入力 10,9,2,6,4,1,8,3↓
出力 1,2,3,4,6,8,9,10
4
もっと身近(実用的)な例
・文字列検索入力:文章と検索文字列出力:文章中で文字列が含まれる位置
5
・メールソフトの並べ替え入力:たくさんのメール出力:指定された順序に従った並べ替え
6
・WEBページ検索入力:キーワード出力:キーワードに関係の深いWEBページ
7
アルゴリズムの例(最大公約数を求める問題)ユークリッドの互除法 (世界最古のアルゴリズム)
入力 x, y (x>y)
ステップ 1: xを yで割って、余りを r とする。ステップ 2: r = 0 ならば、yを出力して終了。
r ≠ 0 ならば、ステップ3へ。ステップ 3: x ← y (yを xに代入)
y ← r (rを yに代入)ステップ1へ。
8
ユークリッドの互除法の動作例
入力 (10, 8)
ステップ 1: 10÷8=1 余り2。ステップ 2: r=2。0でないのでステップ3へ。ステップ 3: x=8、y=2。ステップ1へ。ステップ 1: 8÷2=4 余り0。ステップ 2: r=0なので終了。
このとき、y =2なので、2を出力。
x y r
(10, 8) 2
(8, 2) 0
9
ユークリッドの互除法の動作例
入力 (8, 3)
ステップ 1: 8÷3=2 余り2。ステップ 2: r=2。0でないのでステップ3へ。ステップ 3: x=3、y=2。ステップ1へ。ステップ 1: 3÷2=1 余り1。ステップ 2: r=1。0でないのでステップ3へ。ステップ 3: x=2、y=1。ステップ1へ。ステップ 1: 2÷1=2 余り0。ステップ 2: r=0なので終了。
このとき、y =1なので、1を出力。
x y r
(8, 3) 2
(3, 2) 1
(2, 1) 0
10
ユークリッドの互除法は、入力(10, 8)や(8, 3)に対しては正しく動作することが分かった。しかし、アルゴリズムは、どんな入力に対しても正しく動作しなければならない。
どんな入力に対しても正しく動作することの証明
入力 x, yに対して、正しい答を d とする。(つまり、x = ds, y = dtで、sとtは互いに素)
11
ステップ 1: xを yで割って、余りを r とする。
まず、r =0ならば、yが最大公約数なのは簡単に分かる。なので、r ≠0の場合を考える。
x = uy + r (uは商)ds = udt + r
r = ds - udt
= d (s- ut)
x = ds, y = dtで、sとtは互いに素
y = dt, r = d (s- ut) である。
tとs- utは互いに素であることを言う。
もし、共通素因数を持ったら。。。それを a として、t= ap, s- ut = aq と書ける。
s= aq + ut = aq + uap = a(q+up)
となり、sとtが素因数 aを持つので、sとtが互いに素であることに反する。
12
y = dt, r = d (s- ut) である。
tとs- utは互いに素である。
y と rの最大公約数も d。
ステップ3では、y と rを新しい x と yにして、ステップ1に戻る。→ y と rの最大公約数を求めに行っている。
要約すると:r =0 ならば yが答で、それをステップ2で出力する。r ≠0 ならば、x と yの最大公約数は y と rの最大公約数なので、次のラウンドで y と rの最大公約数を求めに行く。(答を保存している。)
13
例えば(10, 8)のケース(10, 8) の最大公約数
↓
(8, 2) の最大公約数↓
2
例えば(8, 3)のケース(8, 3) の最大公約数
↓
(3, 2) の最大公約数↓
(2, 1) の最大公約数↓
1
x y r
(10, 8) 2
(8, 2) 0
x y r
(8, 3) 2
(3, 2) 1
(2, 1) 0
14
アルゴリズムは、正しい答を出力するか、または、答を保存することは分かった。
↓
つまり、出力したときは、それが正しい答であることは保証される。↓
しかし、これだけでは、常に答を出力することの保証にはなっていない。(無限に答を保存し続ける可能性がある)
停止性の証明:ステップ 1: xを yで割って、余りを r とする。なので、r < y
ステップ3で、x ← y, y ← rのときに、yの値は必ず小さくなる。しかし、絶対に負にはならないので、どこかの時点で必ず0になる。
↓
アルゴリズムは必ず終了する。
15
ステップ 1: xを yで割って、余りを r とする。ステップ 2: r = 0 ならば、yを出力して終了。
r ≠ 0 ならば、ステップ3へ。ステップ 3: x ← y (yを xに代入)
y ← r (rを yに代入)ステップ1へ。
アルゴリズムとプログラム
アルゴリズムは、計算の手順を書いたもの。(たとえば、日本語、英語など。) プログラムは、それが計算機上で実行できるように具体的なプログラミング言語(例えばC、JAVAなど)で書いたもの。
while(r!=0)
{r:=x;
for (r>=y) {r:=r-y;}.
x:=y; y:=r;}
print(y);
アルゴリズム プログラム
16
問題 : ユークリッドの互除法を使って、次の2数の最大公約数を求めよ。(a) 1470と63。(b) 89と55。
17
安定マッチング問題
就職斡旋会
参加者学生: 1, 2, 3, 4, 5会社: a, b, c, d, e
イベント終了後に、5組のペアを作りたい。
これを、「マッチング」と言う。
各参加者に、希望を出してもらう。
別の例
18
1: c e a d b a: 4 1 3 2 5
2: a b c d e b: 5 1 2 3 4
3: a d c e b c: 2 3 1 5 4
4: b e d a c d: 3 4 2 5 1
5: d a e b c e: 3 1 5 2 4
安定マッチング問題学生: 1, 2, 3, 4, 5会社: a, b, c, d, e
それぞれの人は、左から右に向かって、好きな相手を順番に書いている。
19
例
1: c e a d b a: 4 1 3 2 5
2: a b c d e b: 5 1 2 3 4
3: a d c e b c: 2 3 1 5 4
4: b e d a c d: 3 4 2 5 1
5: d a e b c e: 3 1 5 2 4
これは、なかなか良い。全員が第3位以内とペアになっている。
全員が第2位以内とペアになるマッチングは存在しない。
問題:なぜ?
20
例
1: c e a d b a: 4 1 3 2 5
2: a b c d e b: 5 1 2 3 4
3: a d c e b c: 2 3 1 5 4
4: b e d a c d: 3 4 2 5 1
5: d a e b c e: 3 1 5 2 4
ところが、このマッチングには欠点がある。
(1, e)は、今の相手よりお互いが好き。今のマッチングに逆らって、「駆け落ち」する可能性がある。こういうペアを「ブロッキングペア」と呼ぶ。
ブロッキングペアがあるとマッチングが壊れる → 不安定
問題:何が欠点?
ブロッキングペアのないマッチング:安定マッチング
21
1: c e a d b a: 4 1 3 2 5
2: a b c d e b: 5 1 2 3 4
3: a d c e b c: 2 3 1 5 4
4: b e d a c d: 3 4 2 5 1
5: d a e b c e: 3 1 5 2 4
問題: この例に対する安定マッチングを求めよ。
22
安定マッチングはどういうところで使われているの?
例:大学での研究室配属
研究室A(定員3名)アルゴリズム
研究室B(定員4名)インターネット
研究室C(定員3名)画像処理
。。。
aさん
bさん
cさん
eさん
dさん
。。。
a: A D B C
b: E A B D
c: F B C A
d: B A C F
e: C B F C
A: g f c b a e …
B: d b c a f e g …
C: b e d c f e a …どの研究室に行きたいかの希望リストを書く どの学生に来て欲しいかの
希望リストを書く
これらの希望リストを使って安定マッチングを求める
23
例:日本の研修医マッチング(JRMP) https://www.jrmp.jp/
2004年にスタート(アメリカでは1950年代から)8,500人の研修医を1,000病院の10,000~11,000ポストに配属
医学部を卒業して医師国家試験に合格した医師は、2年間どこかの病院で研修を行う。どの病院に行くかの配属を決めるもの。
24
25
例:腎臓交換移植
Aさんが腎臓病の息子aのために腎臓を提供したいが、型が合わない。
Bさんが腎臓病の弟bのために腎臓を提供したいが、型が合わない。
A
a
B
b
× ×
ところが、Aさんがbさんに、Bさんがaさんにだったら型が合う。
このとき、A-a と B-b で腎臓を交換して移植すると、どちらもハッピー。
26
例:腎臓交換移植
A
a
B
b
× ×
C
c
D
d
× ×
E
e
F
f
× × …
Y
y
×
Z
z
×
B
b
×
D
d
×
移植したいけど型が合わない(不幸な)ペア
C
c
×
Y
y
×
F
f
×
Z
z
×
ペア同士のペア(マッチング)を作って交換する。これまで助からなかった者が助かる。
27
2012年 ノーベル経済学賞
Lloyd S. Shapley
安定配分の理論とマーケットデザインの実践・安定マッチングの理論研究・その結果を世の中のマッチングに応用(研修医配属、学校配属、腎臓交換移植など)
Alvin E. Roth
28
素朴な疑問さっきの例には「たまたま」安定マッチングがあったが、どんな場合でも安定マッチングはあるの?
・誰かの希望リストが今のと違っていたら?
・今の例は5人対5人だったが、10人対10人では?100人対100人では?
安定マッチングは必ずある。人数がどれだけ増えても、どんな希望リストであっても、必ずある。
1: c e a d b a: 4 1 3 2 5
2: a b c d e b: 5 1 2 3 4
3: a d c e b c: 2 3 1 5 4
4: b e d a c d: 3 4 2 5 1
5: d a e b c e: 3 1 5 2 4
29
単純なアルゴリズム:マッチングを全て求めて、それぞれが安定かどうかを1個ずつチェックする。
1-a
2-b
3-c
4-d
5-e
1-a
2-b
3-c
4-e
5-d
1-a
2-b
3-d
4-c
5-e
1-a
2-b
3-d
4-e
5-c
1-a
2-b
3-e
4-d
5-c
…
安定なマッチングが見つかった所で、それを出力する。
安定マッチングを求めるには、どうしたらいいか?
全部のマッチングを調べているので、必ず答は求まる。
30
計算時間は、どれぐらい掛かるだろうか?
問題:学生5人、採用担当5人の場合、マッチングは何通りある?
1-a
2-b
3-c
4-d
5-e
1-a
2-b
3-c
4-e
5-d
1-a
2-b
3-d
4-c
5-e
1-a
2-b
3-d
4-e
5-c
1-a
2-b
3-e
4-d
5-c
…
ここの異なる順列に、異なるマッチングが1対1に対応するので、全部で5!(=120)通り。
学生n人、会社n個だと n! 通り。
31
宇宙の年齢≒138億年< 10 年11
1時間= 3,600秒1日 = 86,400秒1年 = 31,536,000秒< 10 秒8
1秒間に1億(=10 )個のマッチングを生成し、
その安定性をチェックできたとしても、10 秒以上かかる。32
8
10 秒 > 10 年32 24
n!ってどれぐらい?
n 1 2 … 5 … 10 … 50
n! 1 2 120
4050! > 10
宇宙の年齢の10,000,000,000,000回分待っても答えが出ない。
3,628,800 50!
1: c e a d b a: 4 1 3 2 5
2: a b c d e b: 5 1 2 3 4
3: a d c e b c: 2 3 1 5 4
4: b e d a c d: 3 4 2 5 1
5: d a e b c e: 3 1 5 2 4
32
安定マッチングを求める Gale-Shapley アルゴリズム
×× ×
×
問題:どうしてこのアルゴリズムで安定マッチングが求まる?
もっと速く求めることはできないか?
n ステップで終わる2
33
求まったマッチングが安定でないとすると、ブロッキングペアが存在する。
2: ・ ・ ・ e ・ ・ ・ e: ・ ・ ・ 2 ・ ・ ・
学生2は会社eに申請したが断られた。(学生はリストの前から順番に申請するので)
e: ・ ・ ・ 2 ・ ・ ・×その時点では、会社eは学生2よりも良い人を得ていた。
それ以後、会社が相手を変える場合は、より良い相手にしか変えない。
最終的に学生2より下の会社とペアになっているのは矛盾。
(証明終わり)
×
(安定性の証明)
n 1 2 … 5 … 10 … 50
n 1 4 25 100 2,500
n! 1 2 120 3,628,800 > 10
34
2
1秒間に1億個のマッチングを生成し、その安定性をチェック
できたとしても、10 秒> 10 年かかる2432
宇宙の年齢≒138億年< 10 年11
1秒間に1億ステップ計算できるなら、0.000025秒で終わる
40
35
アルゴリズムの時間計算量できるだけ速く答を求めるアルゴリズム=良いアルゴリズム。
n2
2n
< < n! (≈ )
多項式時間アルゴリズム( の形のもの)n c
指数時間アルゴリズム( の形のもの)c n
超指数時間アルゴリズム
効率の良いアルゴリズム
36
「フカシギの数え方」
計算時間の爆発、アルゴリズムの効率を題材にした動画
JST ERATO
湊離散構造処理系プロジェクト
「アルゴリズムが世界を変える」JST ERATO
河原林巨大グラフプロジェクト
37
アルゴリズム研究(の1つ)
問題に対して、できるだけ早いアルゴリズムを構築する。
[Rolf,05]32216.1
Tamaki,04][Iwama,)3227.1(3238.1
[Rolf,03]3280.1]Schuler,03[Baumer,3290.1
al.,02]et r [Hofmeiste3302.1
,99][Schoening334.1
al.,98]et [Paturi362.1
er,79]Speckenmey[Monien,618.1
n
nn
n
n
n
n
n
n
・・・
n → n → n → n → …1.5235
2 → 1.8 → 1.7 → 1.4 → …n n n n
1つの例:3SAT
[Iwama, Takai, Seto, Tamaki,10]32113.1n
[Hertli, Moser, Scheder , 10]32065.1n
[Hertli,11]30704.1n
38
計算量のより厳密な話
入力の「サイズ」:入力の長さ。例えば安定マッチング問題では、希望リストの長さの総和。入力xの長さを | x | と書く。
操作の単位:1ステップでどういう操作ができるか。例えば安定マッチング問題では、・学生mの第i希望がどの会社であるか調べる・学生mと会社wをペアにする・ペア(m, w)を解消する
など。
※もっと厳密にやると、チューリング機械を使う。
39
入力xに対する、アルゴリズムAの計算量:Aがxを処理し終えるまでにかかるステップ数。
例入力 x:
に対して、Aが前ページで規定した操作を134回行ったら、この入力に対するAの計算量は134。
入力長nに対する、アルゴリズムAの計算量:長さがnである入力全てに対するAの計算量の中の最大値。
)(xfA
)(nfA
max|| nx =
)(xfA=)(nfA
長さnのどんな入力に対しても、Aは ステップで終わる。)(nfA
1: c e a d b a: 4 1 3 2 5
2: a b c d e b: 5 1 2 3 4
3: a d c e b c: 2 3 1 5 4
4: b e d a c d: 3 4 2 5 1
5: d a e b c e: 3 1 5 2 4
40
入力長
)(nfA
一般に、 や などのように、きれいな関数にはならない。
2n n5
41
入力長
)(nfAきれいな関数で近似する(有限個を除いて、全て曲線の下)
42
漸近的評価
nnnnfA 2
3 log8.152)( ++=
例えば、近似した後、
だったとしよう。
nの増加に対する計算時間の増加の度合いに着目して、
と書く。
)()( 3nOnf A =
※nが大きくなると、 や は に比べて無視できる。※「増加の割合」に興味があるので、定数倍は無視する。
32nn2log8.1n5
厳密な定義は省略。「最大次の項だけ残して、その項の係数を1にする。」
43
O記法の厳密な定義
)(),( ngnf2つの関数
であること。に対して、
(定数)が存在し、(定数)、であるとは、
)()()(
))(()(
0
0
ngcnfnn
ncngOnf
=
問題:以下のうち正しいものはどれか? 正しいものについては、上記の定義に乗っ取って、厳密に証明せよ。正しくないものについては、正しくないことを証明せよ。
)(22)4()(1.0)3(
)(520
3)2()(1035)1(
3224
33
nOnnnOn
nOnnOnn
=+=
=−=−+
44
45