SlideShare una empresa de Scribd logo
1 de 20
アルゴリズムとデータ構
造
15.「アルゴリズムの
設計」2011 年 4 月 27 日(水)
服部 健太
2011/4/27 アルゴリズムとデータ構造 15 2
N クイーン問題
 N×N のチェス盤に, N 個のクイーンの駒を置いて,それぞれが
他のクイーンの利き筋(縦,横,斜め)に当たらないようにす
る
 N =8の例:正しい配置 間違った配置
2011/4/27 アルゴリズムとデータ構造 15 3
N クイーン問題の力まかせ法による
解
 サイズ n の N クイーン問題を解く
def n_queen(n):
A = array(n)
for i in range(n): A[i] = 0
while A != None:
if valid(A, n): return A
A = next(A, n)
return None
 次候補となる盤面を返す
def next(A, n):
for i in range(n):
if A[i] == n-1:
A[i] = 0
else:
A[i] = A[i] + 1
return A
return None
 盤面が有効かどうかチェック
def valid(A, n):
for i in range(n-1):
k = 1
for j in range(i+1, n):
if A[i] == A[j]:
return False
if (A[i] == A[j] + k
or A[j] == A[i] + k):
return False
k = k + 1
return True
2011/4/27 アルゴリズムとデータ構造 15 4
バックトラック法
 力まかせをより効率的に行
う
 問題の解が n 個の部分から
構成されるとする.
 これらの値を一つずつ決め
ていく
 いくつかの部分の値を決め
た時点で,これ以降どう決
めても解が得られないとわ
かったら,その決め方に関
する計算はそこで打ち切る
 以上の手順を深さ優先探索
の要領で,すべての解の可
能性を調べ終わるまで続け
る
1 2 3 n・・・
・・・
1 2 3 4 n 21 3 4 n
× × × × ×
× × × ×
1 2 3 4 5 n
・・・
1 列目のク
イーンの位置
2 列目のク
イーンの位置
3 列目のク
イーンの位置
・・・
2011/4/27 アルゴリズムとデータ構造 15 5
N クイーン問題のバックトラック
解法
def n_queen(n):
B = board(n); backtrack(B, n, 0)
def board(n):
b = array(n);
for i in range(n):
b[i] = array(n);
for j in range(n):
b[i][j] = False
return b
def backtrack(B, n, level):
if level >= n: print(B); return
row = level
for col in range(n):
if check(B, row, col):
B[row][col] = True
backtrack(B, n, level + 1)
B[row][col] = False
2011/4/27 アルゴリズムとデータ構造 15 6
N クイーン問題のバックトラック解
法 (2)
def check(B, row, col):
for i in range(len(B)):
if B[row][i] or B[i][col]:
return False
if row+i < n and col+i < n and B[row+i][col+i]:
return False
if row-i >= 0 and col+i < n and B[row-i][col+i]:
return False
if row+i < n and col-i >= 0 and B[row+i][col-i]:
return False
if row-i >= 0 and col-i >= 0 and B[row-i][col-i]:
return False
return True
2011/4/27 アルゴリズムとデータ構造 15 7
置けるかどうかの判定を改良する
 horizontal
 0 ~ n-1
 それぞれの段に既に置
かれているかチェック
 major
 0 ~ (row+col) ~ n+n-2
 対角線方向に置かれて
いるかチェック
 minor
 1-n ~ (row-col) ~ n-1
 major とは逆の対角線
方向に置かれているか
チェック
 練習問題
 上記の配列を利用した
改良版のコードを書け
horizontal
major
minor
[0]
[1]
[2]
[n+n-2]
[n-1]
[0] [1][-1]
[0]
[1]
[n-1]
[n-1][1-n]
3 1A
[0] [1] [2]
2011/4/27 アルゴリズムとデータ構造 15 8
解答例
def n_queen(n):
b = board(n); backtrack(b, n, 0)
def board(n):
b = record([‘rows’, ‘horizontal’,
‘major’, ‘minor’])
b.rows = array(n)
b.horizontal = array(n)
for i in range(n): b.horizontal[i] = True
b.major = array(2 * n – 1)
b.minor = array(2 * n – 1)
for i in range(2 * n – 1):
b.major[i] = b.minor[i] = True
return b
2011/4/27 アルゴリズムとデータ構造 15 9
解答例(続き)
def backtrack(B, n, level):
if level >= n: print(B.rows); return
row = level
for col in range(n):
B.rows[row] = col
if (B.horizontal[col] and B.major[row+col]
and B.minor[row-col]):
B.horizontal[col] = False
B.major[row+col] = False
B.minor[row-col] = False
backtrack(B, n, level + 1)
B.rows[col] = None
B.horizontal[col] = True
B.major[row+col] = True
B.minor[row-col] = True
2011/4/27 アルゴリズムとデータ構造 15 10
分割統治法
 問題をいくつかの部分問題に分割し,それぞ
れを独立に解く.
 その結果を組み合わせて全体の問題の解とす
る
 部分問題は元の問題と同じもので,ただデータの
少ないなどの点で簡単になっているだけが違い
 再帰呼び出しを用いて実装することができる
 例:
 クイックソート,マージソート
2011/4/27 アルゴリズムとデータ構造 15 11
動的計画法( DP )
 より小さい部分問題の解を集めて,大きい問
題の解を構成する
 分割統治法と似ているが,各部分問題はちょうど
一度だけ解くようにする
 表 or 再帰呼び出し+メモ化で実装できる
 例: Floyd 法
2011/4/27 アルゴリズムとデータ構造 15 12
動的計画法の例
 フィボナッチ数列:
 再帰的定義にもとづくプログラム
def fib(n):
if n == 0 or n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
 動的計画法を利用したプログラム
def fib(n):
n1 = n2 = result = 1
for i in range(1, n):
result = n1 + n2
n1 = n2
n2 = result
return result
FIB(4)
FIB(3) FIB(2)
FIB(2) FIB(1)
FIB(1) FIB(0)
FIB(1) FIB(0)
同じ計算を何
度も繰り返す
ため,非効率
的
2011/4/27 アルゴリズムとデータ構造 15 13
Levenshtein Distance (編集距離)
 2つの文字列がどれだけ異なっているか
 2つの文字列を一致させるために必要な文字の挿
入,削除,置換操作の最小回数
 ”例: kitten” ”と sitting”
 kitten ⇒ sitten sitt⇒ in sittin⇒ g
 LD(“kitten”, ”sitting”) = 3
 練習問題:次の文字列の編集距離はいくら
か?
 apple と couple
2011/4/27 アルゴリズムとデータ構造 15 14
DP を用いて編集距離を求める
 アルゴリズムのポイ
ント
 長さ 0 の文字列と長さ
n の文字列の LD は n
 LD(s1,s2) は,以下のう
ちの最小のもの
 置換: LD(s1-1,s2-1) + (if
s1.last = s2.last then 0
else 1)
 挿入: LD(s1-1,s2) + 1
 削除: LD(s1,s2-1) + 1
※ 文字列 s-1 は文字列 s から末尾の文字
を
  削除したものとする
k i t t e n
0 1 2 3 4 5 6
s 1 1 2 3 4 5 6
i 2 2 1 2 3 4 5
t 3 3 2 1 2 3 4
t 4 4 3 2 1 2 3
i 5 5 4 3 2 2 3
n 6 6 5 4 3 3 2
g 7 7 6 5 4 4 3
2011/4/27 アルゴリズムとデータ構造 15 15
LD を求めるコード例
def levenshtein_distance(s1, s2):
m = len(s1)
n = len(s2)
D = array2(m+1, n+1)
for i in range(m+1): D[i][0] = i
for j in range(n+1): D[0][j] = j
for i in range(1, m+1):
for j in range(1, n + 1)::
if s1[i-1] == s2[j-1]: cost = 0
else: cost = 1
D[i][j] = min(D[i-1][j]+1,
D[i][j-1]+1,
D[i-1][j-1]+cost)
return D[m][n]
2011/4/27 アルゴリズムとデータ構造 15 16
(整数)ナップサック問題
 大きさ W のナップサックに N 種類の品物を詰め込
むことを考える
 詰め込んだ品物の合計金額を最大にしたい
 各品物は何個取っても良い
 例:
 ナップサックの大きさ:21
 品物の種類:
 (a) 大きさ3,金額5
 (b) 大きさ5,金額7
 (c) 大きさ11,金額21
 練習問題
 上記例の状況で,ナップサックに詰め込んだ品物の最大の
金額と,それぞれの品物の数はどれくらいになるか?
2011/4/27 アルゴリズムとデータ構造 15 17
動的計画法を用いた解法
 入力:問題 P( ナップサックの大きさ w, 品物リスト items)
 items[i].size は品物 i の大きさ, items[i].value は金額を表す
def knapsack(P):
cost = array(P.w)
best = array(P.w)
for i in range(P.w):
cost[i] = best[i] = 0
for i in range(len(P.items)):
for j in range(P.w):
if j >= P.items[i].size:
if cost[j] < cost[j-P.items[i].size]+P.items[i].value:
cost[j] = cost[j-P.items[i].size]+P.items[i].value
best[j] = i
return cost[P.w-1]
2011/4/27 アルゴリズムとデータ構造 15 18
実行の様子
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
5 5 5 10 10 10 15 15 15 20 20 20 25 25 25 30 30 30 35
a a a a a a a a a a a a a a a a a a a
5 5 7 10 10 12 15 15 17 20 20 22 25 25 27 30 30 32 35
a a b a a b a a b a a b a a b a a b a
5 5 7 10 10 12 15 15 21 21 21 26 26 28 31 31 33 36 36
a a b a a b a a c c c c c c c c c c c
j
i
cost1[]
best1[]
cost2[]
best2[]
cost3[]
best3[]
品物 a b c
大き
さ
3 5 11
金額 5 7 21
2011/4/27 アルゴリズムとデータ構造 15 19
本講義で触れられなかった話題
 圧縮・暗号化アルゴリズム
 乱数生成アルゴリズム
 計算幾何
 凸包,重なり問題,最近点問題
 数値計算アルゴリズム
 多倍長数値演算,数値微分・数値積分,連立一次方程式の解法
 常微分方程式の解法,行列の固有値問題,高速フーリエ変換
( FFT )
 線形計画法
 線形制約のもとで目的関数を最大化する
 メタヒューリスティック
 擬似焼きなまし法,遺伝的アルゴリズム
 並列アルゴリズム
 ・・・
2011/4/27 アルゴリズムとデータ構造 15 20
教科書・参考書の紹介
 どれでもよいので,一冊手元に置いて,じっくり読んで理解
することを勧める
 石畑清,「アルゴリズムとデータ構造」,岩波講座ソフト
ウェア科学3, 1989 .
 探索,整列といった一般的なアルゴリズム全般を丁寧に解説して
いる
 本講座の内容の多くはこの教科書に沿ったもの
 R. セジウィック,「アルゴリズム C++ 」,近代科学
社, 1994 .
 様々なアルゴリズムに関して系統的に解説している
 C++ のコード例も豊富
 3 分冊になっているが C 言語版もある
 T.H.Cormen++, “Introduction to Algorithms”, MIT Press,
 かなり専門的な内容の教科書で,アルゴリズムの証明や計算量の
議論も詳しい
 一応,日本語訳もある

Más contenido relacionado

La actualidad más candente

AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Inc.
 
グラフ理論入門 1
グラフ理論入門 1グラフ理論入門 1
グラフ理論入門 1butsurizuki
 
AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Inc.
 
複数話者WaveNetボコーダに関する調査
複数話者WaveNetボコーダに関する調査複数話者WaveNetボコーダに関する調査
複数話者WaveNetボコーダに関する調査Tomoki Hayashi
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法nitoyon
 
Amortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 StackAmortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 StackKen Ogura
 
非定常データストリームにおける適応的決定木を用いたアンサンブル学習
非定常データストリームにおける適応的決定木を用いたアンサンブル学習非定常データストリームにおける適応的決定木を用いたアンサンブル学習
非定常データストリームにおける適応的決定木を用いたアンサンブル学習Yu Sugawara
 
統計的係り受け解析入門
統計的係り受け解析入門統計的係り受け解析入門
統計的係り受け解析入門Yuya Unno
 
マルコフ過程とその応用
マルコフ過程とその応用マルコフ過程とその応用
マルコフ過程とその応用Ryuichi Matsumoto
 
できる!遺伝的アルゴリズム
できる!遺伝的アルゴリズムできる!遺伝的アルゴリズム
できる!遺伝的アルゴリズムMaehana Tsuyoshi
 
解説:デバッグ
解説:デバッグ解説:デバッグ
解説:デバッグ理玖 川崎
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
機械学習と深層学習入門
機械学習と深層学習入門機械学習と深層学習入門
機械学習と深層学習入門Yuta Takahashi
 
CNNとGAを用いた 組合せ最適化問題
CNNとGAを用いた 組合せ最適化問題CNNとGAを用いた 組合せ最適化問題
CNNとGAを用いた 組合せ最適化問題t dev
 
SGD+α: 確率的勾配降下法の現在と未来
SGD+α: 確率的勾配降下法の現在と未来SGD+α: 確率的勾配降下法の現在と未来
SGD+α: 確率的勾配降下法の現在と未来Hidekazu Oiwa
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介Preferred Networks
 
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端Yoichi Iwata
 

La actualidad más candente (20)

AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説
 
グラフ理論入門 1
グラフ理論入門 1グラフ理論入門 1
グラフ理論入門 1
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説
 
Trianguler
TriangulerTrianguler
Trianguler
 
複数話者WaveNetボコーダに関する調査
複数話者WaveNetボコーダに関する調査複数話者WaveNetボコーダに関する調査
複数話者WaveNetボコーダに関する調査
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法
 
Amortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 StackAmortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 Stack
 
文字列アルゴリズム
文字列アルゴリズム文字列アルゴリズム
文字列アルゴリズム
 
非定常データストリームにおける適応的決定木を用いたアンサンブル学習
非定常データストリームにおける適応的決定木を用いたアンサンブル学習非定常データストリームにおける適応的決定木を用いたアンサンブル学習
非定常データストリームにおける適応的決定木を用いたアンサンブル学習
 
統計的係り受け解析入門
統計的係り受け解析入門統計的係り受け解析入門
統計的係り受け解析入門
 
マルコフ過程とその応用
マルコフ過程とその応用マルコフ過程とその応用
マルコフ過程とその応用
 
できる!遺伝的アルゴリズム
できる!遺伝的アルゴリズムできる!遺伝的アルゴリズム
できる!遺伝的アルゴリズム
 
解説:デバッグ
解説:デバッグ解説:デバッグ
解説:デバッグ
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
機械学習と深層学習入門
機械学習と深層学習入門機械学習と深層学習入門
機械学習と深層学習入門
 
CNNとGAを用いた 組合せ最適化問題
CNNとGAを用いた 組合せ最適化問題CNNとGAを用いた 組合せ最適化問題
CNNとGAを用いた 組合せ最適化問題
 
SGD+α: 確率的勾配降下法の現在と未来
SGD+α: 確率的勾配降下法の現在と未来SGD+α: 確率的勾配降下法の現在と未来
SGD+α: 確率的勾配降下法の現在と未来
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
 
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
 

Similar a アルゴリズムとデータ構造15

Permutation
PermutationPermutation
Permutationoupc
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日nukaemon
 
アルゴリズムとデータ構造10
アルゴリズムとデータ構造10アルゴリズムとデータ構造10
アルゴリズムとデータ構造10Kenta Hattori
 
第9回スキル養成講座講義資料
第9回スキル養成講座講義資料第9回スキル養成講座講義資料
第9回スキル養成講座講義資料keiodig
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Tetsuya Yoshida
 
アルゴリズムとデータ構造12
アルゴリズムとデータ構造12アルゴリズムとデータ構造12
アルゴリズムとデータ構造12Kenta Hattori
 
Casual learning machine learning with_excel_no4
Casual learning machine learning with_excel_no4Casual learning machine learning with_excel_no4
Casual learning machine learning with_excel_no4KazuhiroSato8
 
さくっと線形代数
さくっと線形代数さくっと線形代数
さくっと線形代数Kota Mori
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Kenji Otsuka
 
AtCoder Beginner Contest 009 解説
AtCoder Beginner Contest 009 解説AtCoder Beginner Contest 009 解説
AtCoder Beginner Contest 009 解説AtCoder Inc.
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3noname409
 
2022年度秋学期 応用数学(解析) 第4回 収束とは何か,ε-δ論法 (2022. 10. 13)
2022年度秋学期 応用数学(解析) 第4回 収束とは何か,ε-δ論法 (2022. 10. 13) 2022年度秋学期 応用数学(解析) 第4回 収束とは何か,ε-δ論法 (2022. 10. 13)
2022年度秋学期 応用数学(解析) 第4回 収束とは何か,ε-δ論法 (2022. 10. 13) Akira Asano
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツShuyo Nakatani
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programmingKeisuke OTAKI
 

Similar a アルゴリズムとデータ構造15 (20)

動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
Permutation
PermutationPermutation
Permutation
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日
 
アルゴリズムとデータ構造10
アルゴリズムとデータ構造10アルゴリズムとデータ構造10
アルゴリズムとデータ構造10
 
第9回スキル養成講座講義資料
第9回スキル養成講座講義資料第9回スキル養成講座講義資料
第9回スキル養成講座講義資料
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会
 
アルゴリズムとデータ構造12
アルゴリズムとデータ構造12アルゴリズムとデータ構造12
アルゴリズムとデータ構造12
 
Casual learning machine learning with_excel_no4
Casual learning machine learning with_excel_no4Casual learning machine learning with_excel_no4
Casual learning machine learning with_excel_no4
 
会津合宿2015Day3:D問題
会津合宿2015Day3:D問題会津合宿2015Day3:D問題
会津合宿2015Day3:D問題
 
さくっと線形代数
さくっと線形代数さくっと線形代数
さくっと線形代数
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎
 
Abc009
Abc009Abc009
Abc009
 
AtCoder Beginner Contest 009 解説
AtCoder Beginner Contest 009 解説AtCoder Beginner Contest 009 解説
AtCoder Beginner Contest 009 解説
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3
 
2022年度秋学期 応用数学(解析) 第4回 収束とは何か,ε-δ論法 (2022. 10. 13)
2022年度秋学期 応用数学(解析) 第4回 収束とは何か,ε-δ論法 (2022. 10. 13) 2022年度秋学期 応用数学(解析) 第4回 収束とは何か,ε-δ論法 (2022. 10. 13)
2022年度秋学期 応用数学(解析) 第4回 収束とは何か,ε-δ論法 (2022. 10. 13)
 
Meeting12
Meeting12Meeting12
Meeting12
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programming
 
Pythonintro
PythonintroPythonintro
Pythonintro
 

Más de Kenta Hattori

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2Kenta Hattori
 
オブジェクト指向入門1
オブジェクト指向入門1オブジェクト指向入門1
オブジェクト指向入門1Kenta Hattori
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10Kenta Hattori
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9Kenta Hattori
 
オブジェクト指向入門8
オブジェクト指向入門8オブジェクト指向入門8
オブジェクト指向入門8Kenta Hattori
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7Kenta Hattori
 
オブジェクト指向入門6
オブジェクト指向入門6オブジェクト指向入門6
オブジェクト指向入門6Kenta Hattori
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5Kenta Hattori
 
オブジェクト指向入門4
オブジェクト指向入門4オブジェクト指向入門4
オブジェクト指向入門4Kenta Hattori
 
オブジェクト指向入門3
オブジェクト指向入門3オブジェクト指向入門3
オブジェクト指向入門3Kenta Hattori
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2Kenta Hattori
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1Kenta Hattori
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8Kenta Hattori
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7Kenta Hattori
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6Kenta Hattori
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5Kenta Hattori
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4Kenta Hattori
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3Kenta Hattori
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14Kenta Hattori
 
アルゴリズムとデータ構造13
アルゴリズムとデータ構造13アルゴリズムとデータ構造13
アルゴリズムとデータ構造13Kenta Hattori
 

Más de Kenta Hattori (20)

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2
 
オブジェクト指向入門1
オブジェクト指向入門1オブジェクト指向入門1
オブジェクト指向入門1
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9
 
オブジェクト指向入門8
オブジェクト指向入門8オブジェクト指向入門8
オブジェクト指向入門8
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7
 
オブジェクト指向入門6
オブジェクト指向入門6オブジェクト指向入門6
オブジェクト指向入門6
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5
 
オブジェクト指向入門4
オブジェクト指向入門4オブジェクト指向入門4
オブジェクト指向入門4
 
オブジェクト指向入門3
オブジェクト指向入門3オブジェクト指向入門3
オブジェクト指向入門3
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14
 
アルゴリズムとデータ構造13
アルゴリズムとデータ構造13アルゴリズムとデータ構造13
アルゴリズムとデータ構造13
 

Último

Establishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdfEstablishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdfoganekyokoi
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slidessusere0a682
 
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」inspirehighstaff03
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドKen Fukui
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfyukisuga3
 
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」inspirehighstaff03
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドKen Fukui
 
My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」inspirehighstaff03
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドKen Fukui
 
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfMy Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfinspirehighstaff03
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドKen Fukui
 
My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」inspirehighstaff03
 
What I did before opening my business..pdf
What I did before opening my business..pdfWhat I did before opening my business..pdf
What I did before opening my business..pdfoganekyokoi
 
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」inspirehighstaff03
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドKen Fukui
 
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」inspirehighstaff03
 
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」inspirehighstaff03
 
My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」inspirehighstaff03
 
My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」inspirehighstaff03
 
Divorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdfDivorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdfoganekyokoi
 

Último (20)

Establishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdfEstablishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdf
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
 
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdf
 
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
 
My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
 
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfMy Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
 
My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」
 
What I did before opening my business..pdf
What I did before opening my business..pdfWhat I did before opening my business..pdf
What I did before opening my business..pdf
 
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
 
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
 
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
 
My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」
 
My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」
 
Divorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdfDivorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdf
 

アルゴリズムとデータ構造15

  • 2. 2011/4/27 アルゴリズムとデータ構造 15 2 N クイーン問題  N×N のチェス盤に, N 個のクイーンの駒を置いて,それぞれが 他のクイーンの利き筋(縦,横,斜め)に当たらないようにす る  N =8の例:正しい配置 間違った配置
  • 3. 2011/4/27 アルゴリズムとデータ構造 15 3 N クイーン問題の力まかせ法による 解  サイズ n の N クイーン問題を解く def n_queen(n): A = array(n) for i in range(n): A[i] = 0 while A != None: if valid(A, n): return A A = next(A, n) return None  次候補となる盤面を返す def next(A, n): for i in range(n): if A[i] == n-1: A[i] = 0 else: A[i] = A[i] + 1 return A return None  盤面が有効かどうかチェック def valid(A, n): for i in range(n-1): k = 1 for j in range(i+1, n): if A[i] == A[j]: return False if (A[i] == A[j] + k or A[j] == A[i] + k): return False k = k + 1 return True
  • 4. 2011/4/27 アルゴリズムとデータ構造 15 4 バックトラック法  力まかせをより効率的に行 う  問題の解が n 個の部分から 構成されるとする.  これらの値を一つずつ決め ていく  いくつかの部分の値を決め た時点で,これ以降どう決 めても解が得られないとわ かったら,その決め方に関 する計算はそこで打ち切る  以上の手順を深さ優先探索 の要領で,すべての解の可 能性を調べ終わるまで続け る 1 2 3 n・・・ ・・・ 1 2 3 4 n 21 3 4 n × × × × × × × × × 1 2 3 4 5 n ・・・ 1 列目のク イーンの位置 2 列目のク イーンの位置 3 列目のク イーンの位置 ・・・
  • 5. 2011/4/27 アルゴリズムとデータ構造 15 5 N クイーン問題のバックトラック 解法 def n_queen(n): B = board(n); backtrack(B, n, 0) def board(n): b = array(n); for i in range(n): b[i] = array(n); for j in range(n): b[i][j] = False return b def backtrack(B, n, level): if level >= n: print(B); return row = level for col in range(n): if check(B, row, col): B[row][col] = True backtrack(B, n, level + 1) B[row][col] = False
  • 6. 2011/4/27 アルゴリズムとデータ構造 15 6 N クイーン問題のバックトラック解 法 (2) def check(B, row, col): for i in range(len(B)): if B[row][i] or B[i][col]: return False if row+i < n and col+i < n and B[row+i][col+i]: return False if row-i >= 0 and col+i < n and B[row-i][col+i]: return False if row+i < n and col-i >= 0 and B[row+i][col-i]: return False if row-i >= 0 and col-i >= 0 and B[row-i][col-i]: return False return True
  • 7. 2011/4/27 アルゴリズムとデータ構造 15 7 置けるかどうかの判定を改良する  horizontal  0 ~ n-1  それぞれの段に既に置 かれているかチェック  major  0 ~ (row+col) ~ n+n-2  対角線方向に置かれて いるかチェック  minor  1-n ~ (row-col) ~ n-1  major とは逆の対角線 方向に置かれているか チェック  練習問題  上記の配列を利用した 改良版のコードを書け horizontal major minor [0] [1] [2] [n+n-2] [n-1] [0] [1][-1] [0] [1] [n-1] [n-1][1-n] 3 1A [0] [1] [2]
  • 8. 2011/4/27 アルゴリズムとデータ構造 15 8 解答例 def n_queen(n): b = board(n); backtrack(b, n, 0) def board(n): b = record([‘rows’, ‘horizontal’, ‘major’, ‘minor’]) b.rows = array(n) b.horizontal = array(n) for i in range(n): b.horizontal[i] = True b.major = array(2 * n – 1) b.minor = array(2 * n – 1) for i in range(2 * n – 1): b.major[i] = b.minor[i] = True return b
  • 9. 2011/4/27 アルゴリズムとデータ構造 15 9 解答例(続き) def backtrack(B, n, level): if level >= n: print(B.rows); return row = level for col in range(n): B.rows[row] = col if (B.horizontal[col] and B.major[row+col] and B.minor[row-col]): B.horizontal[col] = False B.major[row+col] = False B.minor[row-col] = False backtrack(B, n, level + 1) B.rows[col] = None B.horizontal[col] = True B.major[row+col] = True B.minor[row-col] = True
  • 10. 2011/4/27 アルゴリズムとデータ構造 15 10 分割統治法  問題をいくつかの部分問題に分割し,それぞ れを独立に解く.  その結果を組み合わせて全体の問題の解とす る  部分問題は元の問題と同じもので,ただデータの 少ないなどの点で簡単になっているだけが違い  再帰呼び出しを用いて実装することができる  例:  クイックソート,マージソート
  • 11. 2011/4/27 アルゴリズムとデータ構造 15 11 動的計画法( DP )  より小さい部分問題の解を集めて,大きい問 題の解を構成する  分割統治法と似ているが,各部分問題はちょうど 一度だけ解くようにする  表 or 再帰呼び出し+メモ化で実装できる  例: Floyd 法
  • 12. 2011/4/27 アルゴリズムとデータ構造 15 12 動的計画法の例  フィボナッチ数列:  再帰的定義にもとづくプログラム def fib(n): if n == 0 or n == 1: return 1 else: return fib(n-1) + fib(n-2)  動的計画法を利用したプログラム def fib(n): n1 = n2 = result = 1 for i in range(1, n): result = n1 + n2 n1 = n2 n2 = result return result FIB(4) FIB(3) FIB(2) FIB(2) FIB(1) FIB(1) FIB(0) FIB(1) FIB(0) 同じ計算を何 度も繰り返す ため,非効率 的
  • 13. 2011/4/27 アルゴリズムとデータ構造 15 13 Levenshtein Distance (編集距離)  2つの文字列がどれだけ異なっているか  2つの文字列を一致させるために必要な文字の挿 入,削除,置換操作の最小回数  ”例: kitten” ”と sitting”  kitten ⇒ sitten sitt⇒ in sittin⇒ g  LD(“kitten”, ”sitting”) = 3  練習問題:次の文字列の編集距離はいくら か?  apple と couple
  • 14. 2011/4/27 アルゴリズムとデータ構造 15 14 DP を用いて編集距離を求める  アルゴリズムのポイ ント  長さ 0 の文字列と長さ n の文字列の LD は n  LD(s1,s2) は,以下のう ちの最小のもの  置換: LD(s1-1,s2-1) + (if s1.last = s2.last then 0 else 1)  挿入: LD(s1-1,s2) + 1  削除: LD(s1,s2-1) + 1 ※ 文字列 s-1 は文字列 s から末尾の文字 を   削除したものとする k i t t e n 0 1 2 3 4 5 6 s 1 1 2 3 4 5 6 i 2 2 1 2 3 4 5 t 3 3 2 1 2 3 4 t 4 4 3 2 1 2 3 i 5 5 4 3 2 2 3 n 6 6 5 4 3 3 2 g 7 7 6 5 4 4 3
  • 15. 2011/4/27 アルゴリズムとデータ構造 15 15 LD を求めるコード例 def levenshtein_distance(s1, s2): m = len(s1) n = len(s2) D = array2(m+1, n+1) for i in range(m+1): D[i][0] = i for j in range(n+1): D[0][j] = j for i in range(1, m+1): for j in range(1, n + 1):: if s1[i-1] == s2[j-1]: cost = 0 else: cost = 1 D[i][j] = min(D[i-1][j]+1, D[i][j-1]+1, D[i-1][j-1]+cost) return D[m][n]
  • 16. 2011/4/27 アルゴリズムとデータ構造 15 16 (整数)ナップサック問題  大きさ W のナップサックに N 種類の品物を詰め込 むことを考える  詰め込んだ品物の合計金額を最大にしたい  各品物は何個取っても良い  例:  ナップサックの大きさ:21  品物の種類:  (a) 大きさ3,金額5  (b) 大きさ5,金額7  (c) 大きさ11,金額21  練習問題  上記例の状況で,ナップサックに詰め込んだ品物の最大の 金額と,それぞれの品物の数はどれくらいになるか?
  • 17. 2011/4/27 アルゴリズムとデータ構造 15 17 動的計画法を用いた解法  入力:問題 P( ナップサックの大きさ w, 品物リスト items)  items[i].size は品物 i の大きさ, items[i].value は金額を表す def knapsack(P): cost = array(P.w) best = array(P.w) for i in range(P.w): cost[i] = best[i] = 0 for i in range(len(P.items)): for j in range(P.w): if j >= P.items[i].size: if cost[j] < cost[j-P.items[i].size]+P.items[i].value: cost[j] = cost[j-P.items[i].size]+P.items[i].value best[j] = i return cost[P.w-1]
  • 18. 2011/4/27 アルゴリズムとデータ構造 15 18 実行の様子 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 5 5 5 10 10 10 15 15 15 20 20 20 25 25 25 30 30 30 35 a a a a a a a a a a a a a a a a a a a 5 5 7 10 10 12 15 15 17 20 20 22 25 25 27 30 30 32 35 a a b a a b a a b a a b a a b a a b a 5 5 7 10 10 12 15 15 21 21 21 26 26 28 31 31 33 36 36 a a b a a b a a c c c c c c c c c c c j i cost1[] best1[] cost2[] best2[] cost3[] best3[] 品物 a b c 大き さ 3 5 11 金額 5 7 21
  • 19. 2011/4/27 アルゴリズムとデータ構造 15 19 本講義で触れられなかった話題  圧縮・暗号化アルゴリズム  乱数生成アルゴリズム  計算幾何  凸包,重なり問題,最近点問題  数値計算アルゴリズム  多倍長数値演算,数値微分・数値積分,連立一次方程式の解法  常微分方程式の解法,行列の固有値問題,高速フーリエ変換 ( FFT )  線形計画法  線形制約のもとで目的関数を最大化する  メタヒューリスティック  擬似焼きなまし法,遺伝的アルゴリズム  並列アルゴリズム  ・・・
  • 20. 2011/4/27 アルゴリズムとデータ構造 15 20 教科書・参考書の紹介  どれでもよいので,一冊手元に置いて,じっくり読んで理解 することを勧める  石畑清,「アルゴリズムとデータ構造」,岩波講座ソフト ウェア科学3, 1989 .  探索,整列といった一般的なアルゴリズム全般を丁寧に解説して いる  本講座の内容の多くはこの教科書に沿ったもの  R. セジウィック,「アルゴリズム C++ 」,近代科学 社, 1994 .  様々なアルゴリズムに関して系統的に解説している  C++ のコード例も豊富  3 分冊になっているが C 言語版もある  T.H.Cormen++, “Introduction to Algorithms”, MIT Press,  かなり専門的な内容の教科書で,アルゴリズムの証明や計算量の 議論も詳しい  一応,日本語訳もある