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

第三回 (2013年10月11日)

漸近的計算量と O 記法

http://www.sw.it.aoyama.ac.jp/2013/DA/lecture3.html

Martin J. Dürst

AGU

© 2009-13 Martin J. Dürst 青山学院大学

目次

前回のまとめ

アルゴリズムの評価の概要

主な評価基準:

評価のときに必要な情報:

実行時間の比較: 具体から抽象へ

先週の宿題 1: ステップの漸近的増加の例

(漸近的な増加 = asymptotic growth)

ステップの数
n (データの個数) 1 10 100 1,000 10,000 100,000 1,000,000
線形探索 (+, []) 2 20 200 2000 20,000 ~199,930 -
2分探索 (-, +, /, []) 5 13~17 25~31 41 53~57 65~69 77~81

ステップの数を式で表す (近似する) とどうなる

線形探索: 2n; 2分探索: 4 ⌈log2(n+1)⌉ + 2

データの個数が多くなると式のどの項が重くなるか

 線形探索: 2n; 2分探索: 4 log2n

 

漸近的増加の考え方

⇒ ハードウェア、実装の詳細、ステップの数え方に依存しない

⇒ アルゴリズムの本質的な差が簡潔に表せる

 

先週の宿題 2: 関数の増加の比較

それぞれ二つの関数で、n が増加すると大きい方はどちらか

結果
100n n2 右 (n ≥ 100)
1.1n n20 左 (n ≥ 1541)
5 log2 n 10 log4 n

同じ (log2 x = 2 log4 x)

20n n! 右 (n ≥ 52)
100·2n 2.1n 右 (n ≥ 95)

 

増加の比較: Ruby の使用

注: 理論的にどちらが多くなるか分からない場合、使う意味がない

漸近的増加による関数の分類

漸近的増加の関数の集合

O の定義

c>0: ∃n0≥0: ∀nn0: f(n)≤c·g(n) ⇒ f(n)∈O(g(n))

ΩΘ の定義

c>0: ∃n0≥0: ∀nn0: c·g(n)≤f(n) ⇒ f(n)∈Ω(g(n))

c1>0: ∃c2>0: ∃n0≥0: ∀nn0: c1·g(n)≤f(n)≤c2·g(n) ⇒ f(n)∈Θ(g(n))

f(n)∈Θ(g(n)) ⇔ f(n)∈O(g(n)) ∧ f(n)∈Ω(g(n))

Θ(g(n)) = O(g(n)) ∩ Ω(g(n))

O 記法の具体例

漸近記号の用途

この授業も含め、アルゴリズムとデータ構造では O 記法は非常に多い

O 記法の確認

 

O 記法の単純化

指数の低い項の無視

具体例: f(n) = an + b = O(n)

O の定義: 0 ≤ f (n) ≤ cg (n) [n > n0; n0, c > 0]

an + bcn [n > n0; n0, c > 0]

可能な値: c = a + b/n0

確認: an + b ≤ (a + b/n0)n [n > n0; n0, c > 0]

an + ban + (b/n0)n [n > n0; n0 > 0]

b ≤ (b/n0)n [n > n0; n0 > 0]

1 ≤ n/n0 [n > n0; n0 > 0]

具体的な値: n0 = 1, c = a + b; n0 = 2, c = a + b/2 等

一般化: O(na + nb) ∧a > bO(na)

 

対数の底

O(log2 n) と O(log10 n) はどう違うか

(参考: logb a = logc a / logc b)

 

漸近記号の具体例: 探索アルゴリズムの比較

まとめ

宿題

(提出不要)

ウェブなどで O(1), O(log n), O(n), O(n log n), O(n2), O(n3), O(2n), O(n!) のアルゴリズムを探す