論理と計算(2)

Similar documents
論理と計算(2)

Microsoft PowerPoint - ca ppt [互換モード]

メソッドのまとめ

プログラミング入門1

PowerPoint Presentation

簡単な検索と整列(ソート)

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Taro-再帰関数Ⅲ(公開版).jtd

デジタル表現論・第4回

プログラム言語及び演習Ⅲ

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Microsoft PowerPoint - IntroAlgDs pptx

プログラミング入門1

PG13-6S

PowerPoint プレゼンテーション

program7app.ppt

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft PowerPoint - algo ppt [互換モード]

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

memo

Microsoft PowerPoint - 13approx.pptx

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

デジタル表現論・第6回

Microsoft PowerPoint - prog04.ppt

JavaプログラミングⅠ

ガイダンス

データ構造

Sort-of-List-Map(A)

JavaプログラミングⅠ

JavaプログラミングⅠ

Microsoft PowerPoint - prog03.ppt

プログラミング入門1

Microsoft PowerPoint - ad11-09.pptx

プログラミング基礎I(再)

Microsoft PowerPoint - 09.pptx

JavaプログラミングⅠ

Microsoft PowerPoint ppt

Microsoft Word - no11.docx

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

微分方程式 モデリングとシミュレーション

Microsoft PowerPoint ppt

Prog1_3rd

Javaによるアルゴリズムとデータ構造

PowerPoint プレゼンテーション

Taro-最大値探索法の開発(公開版

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

PowerPoint プレゼンテーション

スライド 1

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

cp-7. 配列

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

PowerPoint プレゼンテーション

プログラミングA

Microsoft PowerPoint - qcomp.ppt [互換モード]

memo

プログラミング入門1

人工知能入門

Javaプログラムの実行手順

PowerPoint Presentation

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

PowerPoint プレゼンテーション

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

構造化プログラミングと データ抽象

gengo1-11

xy n n n- n n n n n xn n n nn n O n n n n n n n n

ex04_2012.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

情報実習Ⅱ

文字列操作と正規表現

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

模擬試験問題(第1章~第3章)

情報処理Ⅰ

Microsoft PowerPoint - 05.pptx

Prog1_6th

DA13

構造化プログラミングと データ抽象

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

基本情報STEP UP演習Java対策

2

問題1 以下に示すプログラムは、次の処理をするプログラムである

Java講座

Microsoft PowerPoint - ProD0107.ppt

Program Design (プログラム設計)

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

1

C#の基本2 ~プログラムの制御構造~

JavaプログラミングⅠ

<4D F736F F F696E74202D208FEE95F18F88979D5F8CE394BC30352E B8CDD8AB B83685D>

Prog2_10th

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

DVIOUT

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

Microsoft PowerPoint - C_Programming(3).pptx

2

2

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

データ構造

Transcription:

情報科学概論 Ⅰ アルゴリズムと計算量 亀山幸義 http://logic.cs.tsukuba.ac.jp/~kam 亀山担当分の話題 アルゴリズムと計算量 Fibonacci 数列の計算を例にとり アルゴリズムと計算量とは何か 具体的に学ぶ 良いアルゴリズムの設計例として 整列 ( ソーティング ) のアルゴリズムを学ぶ 2 Fibonacci 数 () Fibonacci 数 (2) = if n =, 2 Fib(n-2) + Fib(n-) if n > 2 = if n =, 2 Fib(n-2) + Fib(n-) if n > 2 Fib() = Fib(2) = Fib(5) = 5, Fib(6) = 8, Fib(7) = 3, Fib(3) = Fib() + Fib(2) = + = 2 Fib(0) = 55, Fib(20) = 6765, Fib(4) = Fib(2) + Fib(3) = + 2 = 3 Fib(30) = 832040 3 4 Fibonacci 数を求める () Fibonacci 数を求める (2) n =, 2 = Fib(n-2) + Fib(n-) n > 2 class Fib { public static int fib (int n) { if (n < 3) return ; else return (fib(n-2) + fib(n-)); Javaプログラム public static void main (String args[]) { int n = Integer.valueOf(args[0].intValue()); int r = fib(n); System.out.println( fib of + args[0] + is + r); 5 n =, 2 = Fib(n-2) + Fib(n-) n > 2 n class Fib { public static int fib (int n) { if (n < 3) return ; else return (fib(n-2) + fib(n-)); public static void main (String args[]) { int n = Integer.valueOf(args[0].intValue()); int r = fib(n); System.out.println( fib of + args[0] + is + r); Fib(n) 0 55 20 6765 30 832040 40 止まらない 6

Fibonacci 数を求める ( 素朴法 ) Fibonacci 数を求める ( メモ化 ) n =, 2 = Fib(n-2) + Fib(n-) n > 2 n =, 2 = Fib(n-2) + Fib(n-) n > 2 関数 Fib ( 入力 n : int) n =, 2 ならば を返す n>2 ならば r = Fib(n-2) r2 = Fib(n-) r+r2 を返す 疑似コード ( 疑似プログラム ) による記述 7 関数 Fib ( 入力 n : int) n =, 2 ならば Fib(n)= をメモして を返す n>2 ならば Fib(n-2) の値からメモから取り出し r とする Fib(n-) の値からメモから取り出し r とする Fib(n)=r+r2 をメモして r+r2 を返す 8 Fibonacci 数を求める ( メモ化 2) Fibonacci 数を求める ( メモ化 3) n =, 2 = Fib(n-2) + Fib(n-) n > 2 関数 Fib ( 入力 n : int) n =, 2 ならば Fib(n)= をメモして を返す n>2 ならば Fib(n-2) の値からメモから取り出し r とする Fib(n-) の値からメモから取り出し r とする Fib(n)=r+r2 をメモして r+r2 を返す Fib() = Fib(2) = Fib(3) = + = 2 Fib(4) = + 2 = 3 Fib(5) = 2 + 3 = 5 n Fib(n) 0 55 20 6765 30 832040 40 0233455 50-298632863 Java の int 型として実装した場合 9 n =, 2 = Fib(n-2) + Fib(n-) n > 2 Int 型がオーバーフロー 下 3 けたのみを計算実際には 最近 2 つの値 のみメモ化すればよい n Fib(n) 0 055 20 765 30 040 40 55 50 025 8000 25 0 メモ化法による改善 計算速度は向上 素朴法では Fib(30) まで メモ化法では Fib(8000) でも計算可能 ただし int のオーバーフローを無視 メモリは多く使う メモ化のための記憶領域が必要 感覚的な比較ではなく きちんと比較をしたい 速度が 0msec である などはあまり意味がない ( その時に使用した計算機の速度に依存してしまい 客観的 普遍的な比較にならない ) アルゴリズム アルゴリズム 問題 に対する 解き方 与えられた基本命令をどう組み合わせて 解を求めるかを記述したもの アルゴリズムとプログラムの違い プログラムは 特定のプログラム言語で記述 その言語の処理系を用いて実行可能 アルゴリズムは より抽象的 一般的な疑似プログラムとして記述する ( 特定のプログラム言語や 特定の実装方式に関する記述を取り除いた記述とする ) そのままでは実行可能でないことが多い 2 2

アルゴリズムの計算量 計算量 アルゴリズム をはかる尺度 計算の複雑さ とも言う computational complexity 2 つの計算量 時間計算量 time complexity 計算のスピード 実行速度 空間計算量 space complexity メモリ ( アルゴリズムを実行する過程で 瞬間的に使用する最大メモリ量 ) どちらも小さい ( 少ない ) 方が良い 3 具体的な時間計算量 Fib(n) に対する素朴法 足し算の回数 Fib(n) 関数呼び出しの回数 >Fib(n) その他の計算 Fib(n) に対するメモ化法 足し算の回数 n-2 関数呼び出しの回数 n- その他の計算 たしかに 後者の方が速い 4 Fib(n) に対する より高速な方法 () 準備 : x から x^n を ( 掛け算だけで ) 計算する 例 :x^3 を計算したいとき x -> x^2 -> (x^2)^2 = x^4 -> (x^4)^2 = x^8 x * x^4 * x^8 = x^3 掛け算 5 回で x^3 が求まった n の 2 進数表現の桁数を r とするとき 2r- 回以下の掛け算で x^n が求まる 2 r - < 2 log_2 n - 5 Fib(n) に対する より高速な方法 (2) メモ化法 : x = Fib(n-) x = y = Fib(n) y = Fib(n) y = x+y = Fib(n-)+Fib(n) = Fib(n+) 0 0 x y n- = x y = Fib(n) Fib(n+) 6 Fib(n) に対する より高速な方法 (3) Fib(n) に対する より高速な方法 (4) A = 0 A -> A^2 -> A^4 ->. -> A^024 0 n- = Fib(n) Fib(n+) 7 2*2 行列 A の n- 乗を計算すれば 回の足し算で Fib(n) が求まる 2 つの 2*2 行列の積 8 回の掛け算 4 回の足し算 n 乗の計算は 2log_2 n- 回以下の乗算 よって Fib(n) は 6log_2(n-) -8 回以下の掛け算 8log_2(n-)-3 回以下の足し算 8 3

問題 より高速な方法 は本当に高速か? 正数の乗算 整数の加算 合計 素朴法 0 Fib(n) Fib(n) メモ化法 0 n-2 n-2 より高速な方法 < 6 log n < 8 log n <24 log n オーダ記法 定数倍 などを無視し n が非常に大きくなったときの関数の振る舞いだけを表す表記方法 正確な定義は データ構造とアルゴリズム の授業を参照すること 素朴法 O(α^n) α=( 5 + )/2 メモ化法 O(n) より高速 O(log n) 9 2 オーダの違いは とんでもない差を生じる 00n と 2^n の差 n =0 000 024 n = 20 2000 ほぼ 0^6 n = 30 3000 ほぼ 0^9 計算機が 2 倍のスピードになっても 指数関数的アルゴリズムでは 計算できる n が 増えるだけ アルゴリズムの良し悪しの差は ハードウェアの改良だけでは とても埋められない 良いアルゴリズムを考えるのは 今も将来も極めて重要 22 前半のまとめ アルゴリズムとは何か 計算量とは何か アルゴリズムの良し悪しは 入力データが非常に大きくなったときの計算時間に非常に大きく響く 参考 : O(n^k) となるアルゴリズムが存在する問題たちの集合を クラス P と呼ぶ P は多項式を意味する a x^n + b x^(n-) + 23 後半 : 整列アルゴリズム 整列 ( ソート ) 0 2 8 9 2 4 7 6 3 昇順に整列 2 2 3 4 6 7 8 9 0 24 25 4

素朴な整列アルゴリズム () 0 2 8 9 2 4 7 6 3 最小値を探す 0 2 8 9 2 4 7 6 3 先頭と最小値をいれかえる 0 2 8 9 2 4 7 6 3 素朴な整列アルゴリズム (2) 0 2 8 9 2 4 7 6 3 最小値 ( のつ ) を探す 0 2 8 9 2 4 7 6 3 先頭と最小値をいれかえる 2 0 8 9 2 4 7 6 3 26 27 素朴な整列アルゴリズム (3) 2 0 8 9 2 4 7 6 3 2 2 0 8 9 4 7 6 3 2 2 3 0 8 9 4 7 6 2 2 3 4 6 7 8 9 0 28 素朴な整列アルゴリズム (4) 時間計算量 ( データの個数を n とする ) 2 つのデータの比較 (n-) + (n-2) + + = n(n-)/2 データ列における 2 つのデータの交換 n+(n-) + + = n(n+)/2 その他 ( ループの制御等 ) は無視 時間計算量は O(n^2) 用途によってはこれでも十分利用価値があるが n が非常に大きなときは 遅すぎる 例 : 筑波大学のすべての科目を科目番号順に整列 29 マージソート ( 併合ソート ) のアルゴリズム () 基本アイディア : Divide and Conquer ( 分割統治法 ) 多数のデータ数に対して何らかの解と求める場合 データを 2 つ ( 以上 ) に分割して それぞれの解を求め その結果を用いて全体に対する解を求める方法 マージソート ( 併合ソート ) のアルゴリズム (2) 0 2 8 9 2 4 7 6 3 2 分割する 0 2 8 9 2 それぞれを別々にソートする 4 7 6 3 2 2 8 9 0 3 4 6 7 30 3 5

マージソート ( 併合ソート ) のアルゴリズム (3) マージ操作 () 2 2 8 9 0 3 4 6 7 2 つのソート済みの列をマージ ( 併合 ) する 2 2 3 4 6 7 8 9 0 2 2 8 9 0 3 4 6 7 2 > なので を書き込む 32 33 マージ操作 (2) マージ操作 (3) 2 2 8 9 0 3 4 6 7 2 2 8 9 0 3 4 6 7 2 2 < 3 なので 2 を書き込む 同様にして 小さいものから順に書き込んでいく 2 2 3 4 6 7 34 35 マージ操作 (4) 2 2 8 9 0 3 4 6 7 最後に 残ったデータをコピーする 2 2 3 4 6 7 8 9 0 再帰 (recursion) マージソート ( を含む分割統治法 ) は 再帰を使う 再帰的な関数定義 Fib(n) = if n < 3 then else Fib(n-2)+Fib(n-) 関数の定義の中で 定義されつつある関数自身を 回以上呼ぶ関数 再帰を上手に使うことにより アルゴリズムやプログラムを簡潔明瞭に表現することができる cf. 計算論 ( 計算可能性関数の理論 ) 36 37 6

マージソートの計算量 () 時間計算量 ( データの個数を n とし n=2^m と仮定 ) 2 つのデータの比較のみをカウントする N 個のデータのマージソートにおける 2 つのデータの比較 回数を T(n) とすると 次の式が成立する T(n) <= T(n/2) + T(n/2) + マージ操作における計算量 2n- n- よって授業時点のスラ T(n) <= 2 T(n/2) + 2n イドの誤り修正 38 マージソートの計算量 (2) 時間計算量 ( データの個数を n とし n=2^m と仮定 ) T(n) <= 2 T(n/2) + 2n T() = 0 これらより (n=2^m とおくと ) T(2^m) <= 2 m 2^m + T(n) <= 2 n log n + よって T(n) は O(n log n) である マージソートの時間計算量は O(n log n) 39 関数の増大度の差 N N log N N^2 2^N 0 33 0^2 0^3 00 664 0^4 0^30 000 9966 0^6 0^30 0000 32877 0^8 0^300 整列アルゴリズムのあれこれ 古来 多くの整列アルゴリズムが考案されてきた 素朴な方法 ( インサーションソートなど ) O(n^2) マージソート O(n log n) その他 クイックソート ヒープソートなど データに対して 比較 演算のみが許される場合は O(n log n ) が最善であることが証明されている データが 0 から 00 までの整数値 のように有限個の範囲であれば O(n) のソートが可能 バケツソート 40 4 後半のまとめ 全体のまとめ 整列問題を取り上げ 素朴なアルゴリズム 分割統治法に基づく効率の良いアルゴリズム について考えた ポイント アルゴリズムを設計するとはどういうことか そのアルゴリズムの性能 ( 計算量 ) を見積もるのは どうすればよいか O(n^2) と O(n log n) は大差がある 42 問題 をモデル化し それに対する良いアルゴリズムを考えるのは コンピュータサイエンスにおける最重要問題の つ 良い アルゴリズム 重要な尺度は 時間計算量や空間計算量 : データのサイズを表す n が非常に大きいときの計算量を ( おおざっぱに ) 示す 現実問題の解決にあたって ( 理想的なアルゴリズムがいつでもそのまま使えるわけではないが ) 大きなヒントとなる 43 7

レポート ( 締切 7 月 25 日 ) 以下の内容 ( つ以上 ) の解答を レポートボックス ( 支援室で設置 ) に提出せよ ( 名前 学籍番号明記 ).Fib(n) を O(log n) で計算するアルゴリズムで Fib(024) の下 3 ケタを求めなさい 2. マージソートの時間計算量について T(n) <= 2 T(n/2) + n から T(n) が O(n log n) であることを 導きなさい 3. 以下のデータに対するマージソートの過程を図示しなさい 0, 2, 8, 9, 2,, 4, 7, 6, 3 4. 本日の授業内容を A4 サイズで ページ程度のサイズで まとめなさい 44 レポート問題. 解答.Fib(n) を O(log n) で計算するアルゴリズムで Fib(024) の下 3 ケタを求めなさい 解 スライド 7 ページの行列 A の 024 乗を計算 A A^2 A^4 A^024=[282 243 / 243 525] ただし 行列の要素は下 3 ケタのみ計算 0 024 = Fib(025) Fib(026) これより Fib(024) の下 3 けた =243 45 レポート問題 2. 解答 2. T(n) <= 2 T(n/2) + n から T(n) がO(n log n) であることを 導きなさい (n=2^m と仮定してよい ) 解 T(2^m) <= 2 T(2^(m-)) + 2^m - <= 4 T(2^(m-2)) + 2 2^m (+2) <= 8 T(2^(m-3)) + 3 2^m (+2+4) <= 2^m T() + m 2^m (2^m-) = 2^m (m+t()-) + よって十分大きなmに対して T(2^m) <= 2^m 2m であるので T(n)<= 2 n log_2 n 46 よって T(n) は O(n log n) である レポート問題 3 の解答 3. 以下のデータに対するマージソートの過程を図示しなさい 0, 2, 8, 9, 2,, 4, 7, 6, 3 解 ( 奇数個の列を半分するとき 前半が後半より 長くすると仮定 逆パターンで解答しても構わない ) 以下では 整列済みの列を( ) で表す [0, 2, 8, 9, 2,, 4, 7, 6, 3] [[0, 2,8, 9, 2], [, 4, 7, 6, 3]] [[[0, 2, 8], [9, 2]], [[,4,7], [6,3]]] [[[[0,2],[8]], [[9], [2]]], [[[,4],[7]], [[6],[3]]]] [[[[[0],[2]],(8)], [(9), (2)]], [[[[],[4]],(7)], [(6),(3)]]] 47 レポート問題 3 の解答 ( 続き ) [[[[(0),(2)],(8)], (2,9)], [[[(),(4)],(7)], (3,6)]] [[[(2,0),(8)], (2,9)], [[(,4),(7)], (3,6)]] [[(2,8,0),(2,9)], [(,4,7),(3,6)]] [(2,2,8,9,0), (,3,4,6,7)] (,2,2,3,4,6,7,8,9,0) 解答は 上記の趣旨がかかれていればよく この通りでなくてよい 48 8