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

第三回 (2014年10月3日)

漸近的計算量と O 記法

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

Martin J. Dürst

AGU

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

目次

前回の残り

前回のまとめ

前回の宿題 1: ステップの漸近的増加の例

(漸近的な増加 = asymptotic growth)

[都合により削除]

 

漸近的増加の考え方

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

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

 

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

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

[都合により削除]

増加の比較: 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 の定義: 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 等 (複数の組み合わせ可能)

一般化: a > b > 0 ⇒ O(na + nb) = O(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!) のアルゴリズムを探す