Document

2014 年度
アルゴリズムとデータ構造1
特別試験
出題:土屋孝文
2015 年 2 月 20 日 金曜日 3 限実施
一切の持込不可
問1 線形探索:整数型配列中に 43 があれば「43 があったよ」と出力し、43 が 1 つもなかったときは「43 がなかったよ」と出力する
プログラムを示す。1、2、3、4を解答しなさい。(選択問題)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int N = 20;
int a[] = {27, 31, 39,39,43,46,51,53,61,64,71,71,79,85,91,102,106,109,123};
int main (void) {
int i;
int flag = 1;
set_array();
for (2)
if (3) {
printf("a[%d]に 43 があったよ¥n", i);
4;
}
if (flag == 0)
printf ("43 がなかったよ¥n");
return 0;
}
問2
線形探索の実行時間のオーダーは O (n)である。
(1)
O(n)とは、どういう意味か。説明しなさい。
(2)
線形探索の実行時間のオーダーが O(n)であるとする分析を説明しなさい。
問 3 二分探索:昇順に整列化されているデータなら、線形探索よりも二分探索を用いるほうがよい。二分探索は、どんな手続き(ア
ルゴリズム)なのか、以下の 20 個のデータの中に 43 があるかどうかをみつける例をもちいて、説明しなさい。(変数 low, high, mid
を使ってください)
コメント:この方法の場合、データが 4 倍になると、実行時間は 2 回増える(2 回しか増えない)
。データが 8 倍になると、実行時間は 3 回増える。デ
ータが N 倍になると、実行時間は log2N 回 (たとえば、log28=3) になる。つまり、データ量 N の増加に対して、実行時間は log N に比例して増加す
る。
1000 個の相異なる要素が、キーの昇順に整列された表がある。外部から入力したキーによってこの表を 2 分探索して、該当す
問4
るキーの要素を取り出す。このときのキーの比較回数は最大 10 回である。ただし、該当するキーは必ず表中にあるものとする。なぜ
10 回かを説明しなさい。
問 5 右は、二分探索のアルゴリズム(疑似コード)である。(A)と(B)のコードを書きなさい。
問6
自然数 n に対して、次のように再帰的に定義される関数 f1(n)を考える。
f1(n) :
if
n <= 1
(A)
f 1(4)を求めよ
(B)
再帰条件を日本語で表現せよ
then
return 1
else
return
n + f1(n-1)
問 7 整数型配列 {9,3, 1,8, 2} を昇順に整列する。以下の問に答えなさい
選択ソートを行うと、次の操作結果は、1である。その次は 2 である。
バブルソートを行うと、次の操作結果は、3である。その次は4 である。
挿入ソートを行うと、次の操作結果は、5である。その次は6 である。
問 8 バブルソートの時間計算量は、O (n2)である。教科書を参考にしながら分析しよう。
アルゴリズムを具体的に記述すると、以下のようになる (p 46 改変)。
(A[0] ~ A[n-1]まで n 個の配列の要素を昇順に並び替える)
bubble-sort() {
for (i = 0 ; i < n ; i++) {
/* i は0番目から、n-1 番目まで */
for (j = n -1 ; j > i ; j--) {
/* j は n-1 から、i+1 *まで */
if (A[j-1] > a[j]) {
/* 前の方が大きい隣同士があれば */
swap(A[j]), A[j-1]);
/* 値を交換する */
}
}
}
}
バブルソートのアルゴリズムで一番計算の手間がかかるのは、二重ループで行われる隣接要素の比較である。順に考えていこう。
(A) n = 5(たとえば{9,3, 1,8, 2})のとき、最小値が先頭(添え字 0)に移動するまでの比較回数は 4 回となる。その説明をしなさい。
(B)
2 番目に小さい値が 2 番目(添え字 1) に移動するまでの比較回数が 3 回になる説明をしなさい。
(C)
N= 5 のとき、全体の回数はいくつになるか。
(D)
一般に要素数 n の場合の比較回数を式で示せ。
(E)
最悪の場合などを考えよう。{9,3,1,8,2}と{1,2,3,8,9} の比較回数は、それぞれ、いくつか。
分析が終わったので、O 記法で表現しよう。n が大きくなると、計算時間はどのように増加していくのかを表現する。
D, E から、バブルソートの時間計算量は O (n2) と表現される。
(F)O (n2) は、O(n)と比較すると、どのような性質だろうか。
注:このほかの話題:番兵、ハッシュ法、文字列照合(kmp, bm)、ユークリッドの互除法、エラトステネスのふるい