http://www.sw.it.aoyama.ac.jp/2010/DA/lecture3.html
© 2008-10 Martin J. Dürst 青山学院大学
(asymptotic growth)
n (データの個数) | 1 | 10 | 100 | 1,000 | 10,000 | 100,000 | 1,000,000 |
---|---|---|---|---|---|---|---|
線形探索 | 7 | 52 | 502 | 5,002 | 50,002 | 500,002 | |
2分探索 | 11 | 35 | 59 | 83 | 115 | 139 | 163 |
ステップの数を式で表すとどうなる
線形探索: 5n+2; 2分探索: 8 ⌈log2(n+1)⌉ + 3
データの個数が多くなると式のどの項が重くなる
線形探索: 5n; 2分探索: 8 log2n
f (n) = O(g (n)) と書くが、
f (n) ∈ O(g (n)) の方が意味に近い
O(log2 n) と O(log10 n) はどう違うか
O(na + nb) ⇒O(na) [a > b の前提で]
O(a) ⇒
O(n): データの大きさに比例、全てのデータをチェック
O(log n), O(n log n): 二分探索など、データを小分けして処理する場合
O(n2), O(n3): データの二つ、三つの組み合わせを考える場合
O(2n): データの全ての部分集合を検討する場合など
(abstract data type, ADT)
(stack)
つぎの六つの公理からスタックの全ての性質を導くことが可能
(s が任意のスタック、e が任意のデータ項目)
(queue)
実装: 3ADTs.rb
ADT | スタック | キュー | ||
実装 | Array |
LinkedList |
Array |
LinkedList |
新規作成 | O(n) | O(1) | O(n) | O(1) |
項目追加 | O(1) | O(1) | O(1) 又は O(n) | |
項目削除 | O(1) | O(1) | O(n) 又は O(1) | O(1) |
empty? |
O(1) | O(1) | O(1) | O(1) |
長さ | O(1) | O(n) | O(1) | O(n) |
演習: 3ADTs.rb にあるクラスを使うプログラムを作成しなさい。
(linear list)
(dictionary)
O(n2), O(n!), O(n log log n), O(n log n), O(20n),
順位キューは各要素ごとに優先度 (整数など) が付く。一番簡単な場合にデータ項目は優先度だけ。優先度の高いものが先にキューから出る。実装は配列でも連結リストでもよい。