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

Similar documents
PowerPoint Presentation

第2回

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

Microsoft PowerPoint - 06.pptx

PowerPoint Presentation

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

PG13-6S

Microsoft PowerPoint - prog13.ppt

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

論理と計算(2)

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

論理と計算(2)

gengo1-11

Microsoft PowerPoint - 6.pptx

Microsoft Word - no12.doc

memo

memo

JavaプログラミングⅠ

Prog1_6th

kiso2-09.key

CプログラミングI

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

2

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

Microsoft PowerPoint - 11.pptx

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

Microsoft PowerPoint - prog07.ppt

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

memo

program7app.ppt

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

Microsoft PowerPoint - DA1_2018.pptx

INTRODUCTION TO ALGORITHMS

memo

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

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

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

Microsoft PowerPoint - 05.pptx

alg2015-4r2.ppt

2

第2回

プログラミング入門1

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

Microsoft PowerPoint - lec06 [互換モード]

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

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

問題 01 以下は コンソールより年齢を入力させ その年齢にあった料金を表示するプログラムである 年齢ごとの金額は以下の通りである 年齢の範囲金額 0 歳以上 6 歳以下 120 円 7 歳以上 65 歳未満 200 円 65 歳以上無料 package j1.exam02; import java

Microsoft Word - 中間試験 その1_解答例.doc

Prog1_10th

Microsoft PowerPoint ppt

memo

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

Javaプログラムの実行手順

cp-7. 配列

PowerPoint プレゼンテーション

Microsoft Word - no11.docx

DA13

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

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

Microsoft Word - Training10_プリプロセッサ.docx

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

Microsoft PowerPoint - kougi11.ppt

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

Microsoft PowerPoint - prog06.ppt

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

メソッドのまとめ

Microsoft PowerPoint - DA2_2017.pptx

memo

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

Microsoft Word - Cプログラミング演習(12)

JavaプログラミングⅠ

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

人工知能入門

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

DVIOUT

情報処理Ⅰ

プログラミング基礎

Microsoft PowerPoint ppt

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

Microsoft PowerPoint - prog11.ppt

COMPUTING THE LARGEST EMPTY RECTANGLE

DVIOUT

プログラミング入門1

演算増幅器

前期募集 令和 2 年度山梨大学大学院医工農学総合教育部修士課程工学専攻 入学試験問題 No.1/2 コース等 メカトロニクス工学コース 試験科目 数学 問 1 図 1 は, 原点 O の直交座標系 x,y,z に関して, 線分 OA,OB,OC を 3 辺にもつ平行六面体を示す. ここで, 点 A

Microsoft PowerPoint - prog03.ppt

プログラミング入門1

memo

第2回講義:まとめ

PowerPoint Presentation

( ) ( ) 30 ( ) 27 [1] p LIFO(last in first out, ) (push) (pup) 1

メソッドのまとめ

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

プログラミング実習I

Microsoft PowerPoint - lec10.ppt

PowerPoint プレゼンテーション

Microsoft Word - 13

Microsoft PowerPoint - ppt-7.pptx

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

基礎プログラミング2015

Transcription:

平成 28 年度後期データ構造とアルゴリズム期末テスト 各問題中のアルゴリズムを表すプログラムは, 変数の宣言が省略されているなど, 完全なものではありませんが, 適宜, 常識的な解釈をしてください. 疑問があれば, 挙手をして質問してください. 時間計算量をオーダ記法で表せという問題では, 入力サイズ n を無限大に近づけた場合の漸近的な時間計算量を表せということだと考えてください. 問題 1 入力サイズが n の問題を解くアルゴリズムの正確な時間計算量が次のような場合, それぞれの漸 近的な時間計算量をオーダ記法で表せ. (1)3 2n 4n 2 + 3n (4)5n 3 n 2 (5)2 n + 3n 1 (6)3 log 10 n + 2n + 1 (7)3 n + 4 log 10 n 2 (8)2n log 10 n + 5n + 1 (9)3n log 10 n + 2n 2 4 (10)n 100 + 2 n (11)2 n + n! (12)n! + n 100 問題 2 次のプログラムで表される, 入力サイズが n の問題を解くアルゴリズムの時間計算量をオーダ記法で表せ. の n は 2 のべき乗の数 ( 整数 m を用いて 2 m と表すことができる数 ) とする. (1) x = 0; for( i = 1; i <= n; i++ ) x[i] = 0; for( i = 1; i <= n; i++ ) for( i = 1; i <= n; i++ ) x = x + i; x[i] = i; for( j = i+1; j <= n; j++ ) x の値を出力する ; x[i] = x[i] + j; x = n; for( i = 1; i <= n; i++ ) while( x > 1 ) x = x / 2; x[i] の値を出力する ; x の値を出力する ; 1

問題 3 サイズ n の配列 S[0],, S[n-1] を用いて, 次の 2 つの関数でスタックを実現する. 下の問い に答えよ. /* スタック S に対して, データ x を格納する */ push( S, x ) top = top (a) + 1 ; if( top (b) == n ) オーバーフロー と出力 ; S[top] = x; /* スタック S からデータを取り出し, そのデータを出力する */ pop( S ) if( top (c) == -1 ) アンダーフロー と出力 ; S[top] の値を出力 ; top = top (d) 1 ; (1) 関数中の空欄を埋めよ. スタックを表す配列 S を空に初期化する場合, 変数 top をどのような値にすればよいか答えよ. 空のスタック S に対して以下の操作を順番に実行した. push(s, 4) push(s, 3) push(s, 8) pop(s) pop(s) push(s, 7) push(s, 1) pop(s) (3-1)1,2,3 回目の pop で出力される値をそれぞれ答えよ. (3-2) 配列のサイズが n = 4 の場合, 全ての操作の終了後に配列の各要素に入っている値を答えよ. ただし,pop で出力した値は配列に残らないものとし, 値が入っていない場合には と答えよ. 2

問題 4 サイズ n の配列 Q[0],, Q[n-1] を用いて, 次の 2 つの関数でキューを実現する. 下の問いに 答えよ. /* キュー Q に対して, データ x を格納する */ enqueue( Q, x ) Q[right] = x; right = right (a) + 1 ; if( right == n ) right (b) = 0; if( left == right ) オーバーフロー と出力 ; /* キュー Q からデータを取り出し, そのデータを出力する */ dequeue( Q ) if( left == right ) アンダーフロー と出力 ; Q[left] の値を出力 ; left = left (c) + 1 ; if( left == n ) left (d) = 0; (1) 関数中の空欄を埋めよ. キューを表す配列 Q を空に初期化する場合, 変数 left と right をどのような値にすればよいか答えよ. 空のキュー Q に対して以下の操作を順番に実行した. enqueue(q, 4) enqueue(q, 3) enqueue(q, 8) dequeue(q) dequeue(q) enqueue(q, 7) enqueue(q, 1) dequeue(q) (3-1)1,2,3 回目の dequeue で出力される値をそれぞれ答えよ. (3-2) 配列のサイズが n = 4 の場合, 全ての操作の終了後に配列の各要素に入っている値を答えよ. ただし,dequeue で出力した値は配列に残らないものとし, 値が入っていない場合には と答えよ. 3

問題 5 完全 2 分木について, 次の問いに答えよ. なお, 完全 2 分木では, 木の高さが h のとき, 根のレベルは 0 であり, 葉のレベルは h 1 である. 下の問いに答えよ. (1) 木の高さ h を用いて, 葉の個数を表せ. オーダ記法ではなく, 正確な値を書くこと. 木の高さ h を用いて, 全節点 ( 根と葉も含む ) の個数を表せ. オーダ記法ではなく, 正確な値を書くこと. 問題 6 整数 n は 2 のべき乗の数とする. このとき, 定数 a に対して a n を求める次の 3 つのアルゴリ ズムを考える. 下の問いに答えよ. /* アルゴリズム A */ powa( n ) x = 1; for( i = 0; i < n; i++ ) x = x * a; return( x ); /* アルゴリズム B */ powb( n ) if( n == 1 ) return( a ); return( powb( n/2 ) * powb( n/2 ) ); /* アルゴリズム C */ powc( n ) if( n == 1 ) return( a ); p = powc( n/2 ); return( p * p ); (1) アルゴリズム B と C のように関数が内部で自分自身を呼び出すようなアルゴリズムは何と呼ばれる か, 名称をかけ. それぞれのアルゴリズムの時間計算量をオーダ記法で書け. 4

問題 7 次のプログラムは, 配列 D[0],..., D[n-1] 中の n 個のデータを 選択ソート によって昇順に並べ変える. 関数 swap は2つの引数のデータを交換するものである. 下の問いに答えよ. void selectionsort( int n, double D[] ) for( i = n-1; i > 0; i-- ) max = D[0]; max_index = 0; for( j = 1; j <= i; j++ ) if( D[j] >= max ) max = D[j]; max_index (a) = j; swap( &(D[max_index]), &( D[i] (b) ) ); (1) 空欄を埋めよ. データの個数が n = 5 で, ソート前の初期状態として配列 D[0],, D[4] に 9, 1, 5, 3, 7 がこの順序で入っていたとする. 変数 i による外側の for ループの繰り返しが, 変数 i が 4, 3, 2, 1 の値で順に実行されるとき, 各値での実行が終了した直後の配列 D 中のデータを書け. このアルゴリズムの時間計算量をオーダ記法で表せ. 問題 8 次のプログラムは, 配列 D[0],..., D[n-1] 中の n 個のデータを 挿入ソート によって昇順に並べ変える. 下の問いに答えよ. void insertionsort( int n, double D[] ) for( i = 1; i < n; i++ ) x = D[i]; j = i; while( ( D[j-1] > x ) && ( j (a) > 0 ) ) D[j] = (b) D[j-1]; j = j - 1; D[j] = x; (1) 空欄を埋めよ. データの個数が n = 5 で, ソート前の初期状態として配列 D[0],, D[4] に 9, 1, 5, 3, 7 がこの順序で入っていたとする. 変数 i による外側の for ループの繰り返しが, 変数 i が 1, 2, 3, 4 の値で順に実行されるとき, 各値での実行が終了した直後の配列 D 中のデータを書け. このアルゴリズムの時間計算量をオーダ記法で表せ. 5

問題 9 次のプログラムは, 配列 D[0],..., D[n-1] 中の n 個のデータを ヒープソート によって昇 順に並べ変える. 関数 swap は 2 つの引数のデータを交換するものである. 下の問いに答えよ. // ヒープソート void heapsort( int n, /* データの個数 */ double D[] /* データ D[0],..., D[n-1] */ ) size = 0; // ヒープを表す 2 分木の配列のサイズを初期化 for( i = 0; i < n; i++ ) push_heap( T, D[i] ); for( i = n-1; i >= 0; i-- ) D[i] = delete_maximum( T ); // ヒープにデータを追加する void push_heap( double T[], /* ヒープを表す 2 分木の配列 T[1],..., T[N] */ double x /* 追加するデータ */ ) size++; T[size] = x; // データを最後に追加 k = size; while( ( k > 1 ) && ( T[k] > T[k/2] ) ) // (1) swap( &(T[k]), &(T[k/2]) ); k = k/2; // (1) // ヒープから最大値を取り出す double delete_maximum( double T[] /* ヒープを表す 2 分木の配列 T[1],..., T[N] */ ) T[1] を出力 ; T[1] = T[size]; T[size] を空にする ; // 最後のデータを根に移動 size--; k = 1; while( 2*k <= size ) // 子を持つかどうかを判定 if( 2*k == size ) // (2-1) if( T[k] < T[2*k] ) swap( &(T[k]), &(T[2*k]) ); k = 2*k; アルゴリズムを終了 ; // (2-2) if( T[2*k] > T[2*k+1] ) big = 2*k; // big = 2*k+1; // if( T[k] < T[big] ) // (4) swap( &(T[k]), &(T[big]) ); k = big; // (4) アルゴリズムを終了 ; (1) プログラム中の (1) について,T[k] と T[k/2] の関係, および, この処理の目的を説明せよ. プログラム中の (2-1) と (2-2) はどんな条件による分岐なのか説明せよ. プログラム中の について,T[2*k] と T[2*k+1] の関係, および, この処理の目的を説明せよ. (4) プログラム中の (4) について,T[k] と T[big] の関係, および, この処理の目的を説明せよ. (5) このアルゴリズムの時間計算量をオーダ記法で表せ. 6

問題 10 次のプログラムは,quicksort(D, 0, n-1) を実行することで, 配列 D[0],..., D[n-1] 中の n 個のデータを クイックソート によって昇順に並べ変える. なお, プログラム中の変数の宣言は省略している. 下の問いに答えよ. void quicksort( ) double D[], // データ D[left],..., D[right] int left, // ソートの対象とする配列 D の左端の位置 int right // ソートの対象とする配列 D の右端の位置 if( left < right ) pivot_index = partition( D, left, right ); quicksort( D, left, pivot_index-1 ); quicksort( D, pivot_index+1, right ); // (a) // (b) // (c) (1) データの個数が n = 10 で, 配列 D[0],, D[9] に 35, 21, 4, 49, 55, 19, 12, 32, 24, 42 がこの順序で入っている状態で, 関数 quicksort が left = 0, right = 9 として呼び出されたとする. 基準値を D[0] = 35 とした場合,(a) で実行された関数 partition が戻り値 ( 返り値 ) として変数 pivot_index に渡す値を答えよ. (1) の後,(b) のために関数 quicksort に渡される D[left],, D[pivot_index-1] に入っているデータをすべて答えよ. 順序は問わない. の後,(c) のために関数 quicksort に渡される D[pivot_index+1],, D[right] に入っているデータをすべて答えよ. 順序は問わない. 問題 11 次の表に示す 4 種類の牛肉があり, これらは分割してもよい. これらを重さの限界が 40kg の袋 に入れるとき, 価格の総和を最大にするためには, それぞれの牛肉を何 kg ずつ入れればよいか, グリーデ ィ法により計算せよ. 牛肉 重さ (kg) 価格 ( 万円 ) A 30 20 B 10 10 C 30 40 D 20 50 7

平成 28 年度後期データ構造とアルゴリズム期末テスト解答用紙 平成年度入学学籍番号氏名 問題 1 問題 5(1) (1) (4) (5) (6) (7) (8) (9) 問題 6(1) (10) (11) (12) 問題 2 (1) A B 問題 3(1) C (a) (c) 問題 7(1) (a) (b) (b) (d) i D[0] D[1] D[2] D[3] D[4] 初期状態 9 1 5 3 7 4 3 (3-1)1: 2: 3: (3-2) S[0] S[1] S[2] S[3] 問題 4(1) 2 1 問題 8(1) (a) (b) (c) (d) (a) (b) i D[0] D[1] D[2] D[3] D[4] 初期状態 9 1 5 3 7 1 2 3 (3-1)1: 2: 3: (3-2) Q[0] Q[1] Q[2] Q[3] 4 8

問題 9(1) 問題 10(1) 問題 11 (4) (5) 9