http://www.sw.it.aoyama.ac.jp/2012/DA/lecture3.html
© 2008-12 Martin J. Dürst 青山学院大学
同等な考え方はメモリの量などにも応用可能
(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
f (n) = O(g (n)) と書くが、
f (n) ∈ O(g (n)) の方が意味に近い
O(log2 n) と O(log10 n) はどう違うか
(参考: logb a = logc a / logc b)
O(na + nb) ∧a > b ⇒O(na)
O(a) ⇒
O(n) (linear order, linear time): データの大きさに比例、全てのデータをチェック
O(log n) (logarithmic order/time), O(n log n): 二分探索など、データを小分けして処理する場合
O(n2) (quadratic order/time), O(n3) (cubic order/time): データの二つ、三つの組み合わせを考える場合
O(2n): データの全ての部分集合を検討する場合など
(abstract data type, ADT)
(stack)
つぎの四つの公理でスタックの定義が可能
(s が任意のスタック、e が任意のデータ項目)
公理は実装と使用の間の約束事
(queue)
実装: 3ADTs.rb
ADT | スタック | キュー | ||
実装 | Array |
LinearList |
Array |
LinearList |
新規作成 | O(n) | O(1) | O(n) | O(1) |
項目追加 | O(1) | O(1) | O(1) 又は O(n) | O(1) |
項目削除 | 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),
順位キューは各要素ごとに優先度 (整数など) が付く。一番簡単な場合にデータ項目は優先度だけ。優先度の高いものが先にキューから出る。実装は配列でも連結リストでもよい。