1. アルゴリズムと計算量

1. アルゴリズムと計算量
授業の説明
「データ構造」の講義で学ぶ内容
データ構造の話
コンピュータ内で
データをどのように
保持するのか
データ
密接な関係
アルゴリズムの話
データを使って
どのように
処理させるのか
処理結果
データ構造の重要性
処理効率の向上=洗練されたアルゴリズム+データ構造の正しい選択
データ構造の選択
• アルゴリズムを考慮
• コンピュータ資源を考
慮
データ
アルゴリズムの設計
• データ構造を考慮
• コンピュータ資源を考慮
処理結果
他の科目との関連
プログラミング
アルゴリズム
データ構造
アルゴリズムの話
手続きとは?
問題を解く手順が書かれている
Jfkdsoaiejfl;ldsfdsajklaf
kljklfjdajfkldldsfdsajklaf
fkdjkfdsafjkdssfdsajklaf
Jfkdstioewpkmvm,ajklaf
基本的な演算・操作
Jfkdsamekocigjkf;ajkdsf
Jewojfdkvm,ladkfgiuako
ldsfiewjfnmdaljcidoagjkf
記述は有限の長さ
アルゴリズムとは?
どんな入力でも
必ず停止する
定義域
手続
き
値域
アルゴリズムの例(ユークリッドの互助法)
m、nは自然数
(1) r ← (n を m で割った余り), (2)に移る。
(2) r = 0 ならば
m が最大公約数と答え,計算を停止する。
r ≠ 0 ならば
n ← m, m ← r, (1)に移る。
34
14
n
m
6
2
0
r
ユークリッドの互助法(イメージの構築)
n=[長い方]
m で割った余り
=[短い方]
nをm
何故、「n
何故、「 nを←mm,で割った余り」を考えるのか?
m ← r 」の代入を行うのか?
今まで短かった方が今度は長い方に
今まで余りだった方が今度は短い方に
ユークリッドの互助法(具体例)
6
34
2
14
34
14
n
m
0
6
2
r
停止しない手続きの例(問題設定)
• 最大公約数問題を市松模様問題として解釈
• 市松模様問題
→ 入力:長方形(縦と横の長さ)
→ 出力:出来るだけ大きい正方形で市松模様を
つけたときの、その正方形のサイズ
• [長い方]を「短い方]で割った[余り]
=[長]- {[短]×切捨て([長]/[短])}
停止しない手続きの例(手続き)
• 市松模様問題を解く手続き
(1) r ← ([長い方]を[短い方]で割った[余り]), (2)に移る。
(2) r = 0 ならば
[短い方] が正方形のサイズと答え,計算を停止する。
r <> 0 ならば
[長い方] ← [短い方], [短い方] ← [余り], (1)に移る。
• 計算誤差は無いものとする(現実的な仮定ではない)
停止しない手続きの例(定義域)
横
縦:横
市松模様を
解く手続き
縦
縦横比が
実数
縦横比が
有理数
値域
自分で考えてみよう
• 縦横比が有理数だと必ず停止することを証明
してみよう
• 停止しないような縦横比を見つけてみよう
ロシア乗算法(ハードに適した方法)
÷2
×2
45
×
19
22
×
38
11
×
端数を保存
+
2で割る
45 → 101101
22 → 101101
19
76
5
× 152
+
76
2
×
304
+
152
1
×
608
=
608
合計 855
2を掛ける
19 → 10011
38 → 100110
10進数で10倍
→右に0を追加
2進数で2倍
→右に0を追加
効率の良し悪しの尺度
•
運転技術の評価
– 最速F1ドライバーとは?
1. 最新型マシーンと旧型マ
シーン
2. 短距離と長距離
3. 優勝回数と平均順位
• プログラムの評価
– 高速プログラムとは?
1. 最新型コンピュータと旧型コ
ンピュータ
2. 大規模データと小規模データ
3. 最悪計算量と平均計算量
計算量(物差と量り方)
• テストコースで車を50回 • 何を量るか(物差)
走らせた
– 計算時間を量る
• 何を量るか(物差)
– 速度を量る
– 燃費を量る
• どう評価するか(量り方)
– 最悪のタイムで評価
– 平均で評価
→ 時間計算量
– 使用メモリを量る
→ 空間計算量
• どう評価するか(量り方)
– 最悪の場合で評価
→ 最悪計算量
– 平均で評価
→ 平均計算量
漸近的計算量
良いアルゴリズムはどっち?
時間計算量の例
 a11
 
a
 n1
 a1n  b11

A   
 ann  bn1
 b1n  c11  c1n 

B      
 bnn  cn1  c nn 
10
100
1000
10 A “何倍か?“はアルゴリズムに依存する
B
A
B
100
10倍
A
B
1000
10倍
10×10の
計算時間
何倍?
100×100
の計算時間
何倍?
1000×1000
の計算時間
時間計算量の例
 a11  a1n  b11  b1n  c11  c1n 
              
a  a  b  b  c  c 
nn   n1
nn 
nn 
 n1
 n1
n
cij   aik bkj
k 1
• c :Pの1回の(最悪)処理時間
• Pはn3回行われる
⇒
for i : 1 to n do
for j : 1 to n do
{ cij : 0; ←無視
for
k
:

1
to
n
do
計算時間は(最悪) c n3
3
cij : cijP aik bkj ; }
3
(計算時間はn に比例) O ( n )
何を気にしているのか?
例:(行列の積の計算時間)と(正方形の体積)
• (体積の増え方)と(辺の長さの増え方)の関係は?
⇒ 体積は辺の長さの3乗に比例
(辺が2倍になれば体積は23=8倍になる)
• (データサイズ)と(計算時間)の関係は?
⇒ 計算時間はデータサイズの3乗に比例
O(n3)と表記する
計算量のオーダ






* c  R n0  N n  n0 
O( f (n))  t : N  R

t (n)  cf (n)




c f ( n)
t(n)はO(f(n))
t (n)
cy
y
n0
f (n)
計算量のオーダ






* c  R n0  N n  n0 
( f (n))  t : N  R

t (n)  cf (n)




f (n)
t(n)はΩ(f(n))
t (n)
y
cy
n0
c f ( n)
計算量のオーダ








* c  R n0  N n  n0 
O( f (n))  t : N  R

t (n)  cf (n)






n0  N n  n0 

c

R

*
( f (n))  t : N  R

t (n)  cf (n)




( f (n))  O( f (n))  ( f (n))