データ構造と アルゴリズム 第二回 知能情報学部 新田直也 前回の復習 アルゴリズムとは: 「チューリングマシンで表現される計算手続き」 (チャーチの提唱) 本講義では,適当なプログラミング言語によって表現する. アルゴリズムの性能: 一般に,1つの問題を解くアルゴリズムは複数存在. アルゴリズムの中に早いものと遅いものがある. 最大公約数を求めるアルゴリズム 問題: 与えられた2自然数 a, b の最大公約数を求めよ. 解法1: 総当り計算 1) 2) 3) c := min{a, b} とおく. c が a, b を共に割り切る場合, c を出力して停止. c := c – 1 とおき,2) へ. 解法2: ユークリッドの互除法 1) 2) 3) 4) c := max{a, b}, d := min{a, b} とおく. c を d で割った余りを r とおく. r が 0 ならば,d を出力して停止. c := d, d := r とおき,2) へ. 計算の例 12と9の最大公約数を求めよ. [総当り計算] 1) 2) 3) 2) 3) 2) 3) 2) 3) 2) 3) 2) 3) 2) c := 9 割り切らない c := 8 割り切らない c:=7 割り切らない c:=6 割り切らない c:=5 割り切らない c:=4 割り切らない c:=3 割り切るので 3 を出力 [ユークリッドの互除法] 1) 2) 3) 4) 2) 3) c := 12, d:= 9 r := 3 r は 0 でない c := 9, d := 3 r := 0 r が 0 なので 3 を出力 →速い!! 計算の例(2) 12と6の最大公約数を求めよ. [総当り計算] 1) c := 6 2) 割り切るので 6 を出力 →速い!! [ユークリッドの互除法] 1) c := 12, d:= 6 2) r := 0 3) r が 0 なので 6 を出力 この例のように,総当り計算の方が速い場合もある. →どのようにしてアルゴリズムの速さを比較するか? 入力データのサイズ 最大公約数を求める計算では,入力データは2つの自然数 a, b . データサイズをビット長で表す. すなわち,log2 a + log2 b 一般に,入力のデータサイズが大きくなると計算に費やす時 間も長くなる. ただし,入力のデータサイズを固定しても計算時間は一意に定まら ない. サイズ = 8 総当り ユークリッド互除法 a = 12, b = 9 14 6 a = 6, b = 18 2 3 入力サイズと計算時間の関係 計算時間(steps) 時間計算量 16 14 12 10 8 6 4 2 0 最良の場合 0 2 4 6 入力サイズ(bit) 総当り ユークリッド 8 入力サイズと計算時間の関係 計算時間(steps) 時間計算量 16 14 12 10 8 6 4 2 0 最悪の場合 0 2 4 6 入力サイズ(bit) 総当り ユークリッド 8 時間計算量の種類 最良の計算時間を比較しても無意味. 入力サイズによって変化しない. 全体から見ると例外的な状況. たまたま a と b が一致する場合. たまたま a, b のいずれかが他方の倍数になっている場合. アルゴリズムの性能を表しているとは言いがたい. 一般に最悪または平均の計算時間を比較する. 最悪(最大)時間計算量: 解析的に求めやすい. 平均時間計算量: より実態を表しているが,解析が困難. 時間計算量の評価 最悪の時間計算量を比較したとしても,全入力サイズで 一方が他方より速いとは限らない.(どこで比較するか?) 大きい入力サイズで比較したほうがよい. 全体の中では小さいサイズの方が例外的だと考えられる. オーダー表記 どのような関数に従って時間計算量が増大していく か? オーダー O: 入力 n に対して,ある関数 f(n) が O(g(n))であるとは? 適当な定数 c, n0 が存在し,任意の n >= n0 について, f(n) <= c・g(n) が成り立つことを言う. 関数 f(n) が O(g(n))であるとき, f(n) ∈ O(g(n)) または, f(n) = O(g(n)) と書く. 計算量のオーダー (最悪/平均)計算量は,通常オーダーで比較する. オーダーの例: n2 + 10 = O(n2) 2n2 + 4n + 10000 = O(n2) 2n + n2 = O(2n) n + log n = O(n) オーダーの効果 オーダーでは係数部分やオーバーヘッドが無視さ れる. コンピュータが速くなっても影響されない. プログラミング言語が変わっても影響されない。 →アルゴリズムの実質的な評価. 実行時間の実測値: コンピュータによって影響される. 同一コンピュータ上でもメモリ状況によって影響される. もちろんプログラミング言語にも影響される. コーディングテクニックにも影響される. 時間計算量と領域計算量(1) メモリをふんだんに使えば超高速に計算できる. たとえば答えを予め求めておいて,表として保持しておく. a b GCD(a.b) 1 1 1 2 1 1 1 2 1 2 2 2 3 1 1 1 3 1 1 4 1 2 3 1 → 最悪時間計算量はO(1) 時間計算量と領域計算量(2) 前スライドの例 使用するメモリの量は? →O(2n) --- 領域計算量 時間計算量と領域計算量は一般にトレードオフの関 係にある. 目的に応じてアルゴリズムを選ぶ必要がある. 計算量のまとめ アルゴリズムの性能は計算量のオーダーで比較. 計算量の種類: 時間計算量 最悪時間計算量 → 単に計算量と言う場合がある. 平均時間計算量 領域計算量 最悪領域計算量 平均領域計算量 問題の難しさ(1) ある問題を解くアルゴリズムは一般に複数存在する. 各問題で一番速い(最悪時間計算量のオーダーが 最小である)アルゴリズムは? 最速のアルゴリズムを見つける方法は今のところない. (天才のひらめき) これ以上速く解けないということを証明できる場合がある. 問題の難しさを知られている最速のアルゴリズムの オーダーで評価できる. 問題の難しさ(2) 多項式時間アルゴリズムが存在する問題クラス P 指数時間アルゴリズムが存在する問題クラス EXP 最悪時間計算量のオーダーが,n の指数関数であるよう なアルゴリズムが知られている問題の集合. 非決定性多項式時間アルゴリズムのクラス NP 最悪時間計算量のオーダーが,n の多項式であるような アルゴリズムが知られている問題の集合. 最悪時間計算量のオーダー,n の多項式であるような非 決定性アルゴリズムが知られている問題の集合. P = NP? 問題 数学上の未解決問題の1つ.
© Copyright 2024 ExpyDoc