後期試験 ・ 2011 年 1 月 21 日 1 時限実施 ・ ページ
授業 科目 |
データ構造とアルゴリズム | 学生番号 | 学科 | 学年 | 組 | 番 | フリ ガナ |
評点 | ||||||||
氏名 | ||||||||||||||||
担当者 | DÜRST, Martin J. |
問題は難しさによって、手に負える問題と手に負えない問題に分けられる。分ける基準と基準の理由三つを説明しなさい。
手に負える問題の基準 (2 点)
問題を解くには多項式時間しかかからない (例: O(n), O(n3) など)
手に負えない問題の基準 (2 点)
問題には指数的時間がかかる (例: O(2n), O(n!) など)
手に負える問題の基準の理由三つ (6 点)
次の英語の用語に相当する日本語の用語を書いて、簡単に説明しなさい。日本語の用語ではカタカナをできるだけ避けなさい。
アルゴリズムの表現に Ruby を使う利点と問題点をそれぞれ複数説明しなさい。
利点: プログラム言語をアルゴリズムの表現が正確かつ実現可能。Ruby
特有の利点として、単純な記法 (例: 変数の宣言や括弧が不要) などがあるので、Ruby
が「動く疑似コードともいわれる。
問題点: 場合によって必要以上に細かい、Ruby を知らない人には最初読みにくい、プログラミングができない人には分からない
後期試験 ・ 2011 年 1 月 21 日 1 時限実施 ・ ページ
ヒープソートのアルゴリズムを疑似コードで書きなさい。(heapify_up と heapify_down は前提としてよい)
algorithm heapsort input: array a[] of length len (a[1]...a[len]) output: array a[], sorted with lowest-priority element first for i from len/2 downto 1 do heapify_down(i) end for for i from len downto 2 do temp ← a[1] a[1] ← a[len] a[len] ← temp len ← len-1 heapify_down(i) end for return a end
二分木と探索木を含め、赤黒木の普遍条件を列挙しなさい。
四つの行列の連鎖乗算 0M1 · 1M2 · 2M3 · 3M4 の順番を決め、その場合のスケーラ乗算の数を求めなさい。
乗算の順番 (括弧で指定、4 点): (0M1 · (1M2 · 2M3)) · 3M4
最少のスケーラ乗算の数 (6 点): 4300
(0M1 · 1M2 は乗算 1800;
1M2 · 2M3 は乗算 180;
2M3 · 3M4 は乗算 6000;
0M1 · 1M2 · 2M3
は最善で 0M1 · (1M2 ·
2M3) で 300;
1M2 · 2M3 · 3M4
は最善で (1M2 · 2M3) ·
3M4 で 780)
後期試験 ・ 2011 年 1 月 21 日 1 時限実施 ・ ページ
授業 科目 |
データ構造とアルゴリズム | 学生番号 | 学科 | 学年 | 組 | 番 | フリ ガナ |
評点 | ||||||||
氏名 | ||||||||||||||||
担当者 | DÜRST, Martin J. |
下記の三つの事情に合わせて、文字列照合のアルゴリズムを実装するように頼まれた。 アルゴリズムを選んで、そのアルゴリズムの名前、仕組み、選んだ理由と実装の場合特に注意すべき点を記述しなさい。
次の表を埋めなさい。O(g(n)) が記入されてない場合、一番小さく簡単なものを記入しなさい。
番号 | f(n) | O(g(n)) | n0 | c |
---|---|---|---|---|
例 | 2.2n2 | O(n2) | 0 | 2.2 |
log4n+log16n | O(log2n) | 1 | 3/4 | |
5n | O(n !) | 5 | 625/24 | |
1010 | O(1) | 0 | 1010 | |
7n1.5 · 20n2.5 | O(n4) | 0 | 140 | |
2 log2 log2 n | O(log2 n) | 16 | 1 |
後期試験 ・ 2011 年 1 月 21 日 1 時限実施 ・ ページ
出力が一意に決まっているのにアルゴリズムの一部として乱数を使うランダム化アルゴリズムが存在する。 ランダム化アルゴリズムの一例を選んで、アルゴリズムそのものと乱数の役割を説明しなさい。
選んだアルゴリズムはクイックソート。クイックソートではソートする項目の中から一つ選んで (これをピボットという)、 それより小さいものを左側、大きいものを右側に入れ替える。左側と右側を再帰的にソートすると全体がソートされる。 クイックソートは平均で O(n log n) ですが、ピボットの選び方に非常に弱い。ソート済みのデータで最初の項目をピボットに選ぶなどで O(n2 になる。そこで乱数を使うとどのデータの場合でも時間を O(n log n) におさえることが可能。
授業で扱った三つの O(n2) の整列法の実行の速さを比較し、原因を説明しなさい。
バブルソート、挿入ソート、選択ソートがある。一般には選択ソートが一番早いくて、バブルソートが 一番遅い。なぜなら、バブルソートは隣り合っている項目は何回も (O(n2) 程度) 入れ替える。 挿入ソートは挿入の空きを作るため、項目を何回も (O(n2) 程度) すらすが、入れ替えよりすらすだけのほうが早い。 選択ソートは入れ替えを O(n) 回しかしないので一般には一番早い。しかし、挿入ソートは項目がほとんどソートされているときに 他の整列法 (O(n log n) のものも含む) より早いことがある。
高さ n の 2-3-4 木の最少と最多の節の数を計算し、説明しなさい。
次の表を埋めなさい。(5 点)
n | 最多の節の数 | 最少の節の数 |
---|---|---|
1 | 1 | 1 |
2 | 5 | 3 |
3 | 21 | 7 |
4 | 85 | 15 |
5 | 341 | 31 |
6 | 1365 | 63 |
最少の節の数の式 (3 点)
最少の場合、各内部説に二つの子がある。層ごとの個の数が二倍。高さ 1 (根だけ) の場合、節の数が 1. n の場合は Σni=12i-1=2n-1。
最多の節の数の式 (6 点)
最多の場合、各内部説に四つの子がある。層ごとの個の数が四倍。高さ 1 (根だけ) の場合、節の数が 1. n の場合は A=Σni=14i-1。4A = Σni=14i。 3A = Σni=14i - Σni=14i-1 = 4n - 1。 よって、A = (4n-1) / 3。
後期試験 ・ 2011 年 1 月 21 日 1 時限実施 ・ ページ
授業 科目 |
データ構造とアルゴリズム | 学生番号 | 学科 | 学年 | 組 | 番 | フリ ガナ |
評点 | ||||||||
氏名 | ||||||||||||||||
担当者 | DÜRST, Martin J. |
下記の問題のため、下記のアルゴリズムの設計方針や原理を使って、それぞれアルゴリズムの概略を提案し、予想される計算量、設計方針を使った場合の問題点について述べなさい。
注: この問題の目的は正しいアルゴリズムの発見ではなく、設計方針の知識の応用である。正しいアルゴリズムがない場合もある。
問題: n 個の用事 y1,..., yn のできるだけ数多くを m 個の部屋 (m≦n) で行うように計画を頼まれている。用事 yi には開始時間 si と終了時間 ei がある。ある部屋では同時に一つの用事しか行えないが、ある用事の開始時間は直前の用事の終了時間と同じでよい。
分割統治法 (6 点)
部屋の数と用事の数をできるだけ半々に分け、分けた分に再帰的にアルゴリズムを適用する。部屋の数が 1 の場合、用事をある時点で半々に分け、それを用事が 1 になるまでに繰り返す。用事が時間帯に入れば行い、そうでなかったら取りやめる。半々に分けるのは log n 回程度なので、計算量は O(n log n) と考えられる。問題点は、例えば時間的な分割点をまたぐ用事が可能でも取りやめられる。
遺伝的アルゴリズム (6 点)
簡単な方法を使って、複数の解を作る。解を「世代」ごとに組み合わせて (例えば解 1 から部屋 A の予定、解 2 から部屋 B の予定) 交叉し、「突然変異」で予定されてない用事と予定されている用事を入れ替えるなどする。 今まで最適でした解は必ず取っておくが、その他の解は悪いほど消す確率を高く設定する。 統計的なやり方なので、どこまで計算させるのは人間が決めるべきだが、他の方法より遅くなるのは確実。 問題点は、最適解を見つける保証はない。
貪欲アルゴリズム (6 点)
用事を何かの基準でソートして、その順に部屋に割り当てる。割り当てが不可能な用事は行わないことにする。 ソートの基準としては短い方から、開始点が早い方から、他に重なる用事が少ない方から、終了点が早い方からのがあるが、最後のほうがよさそう。 計算量は順番でやるだけなので、O(n)。 問題点は、いったん決まったところは再検討ができないため、最適解が見つからない可能性がある。
総当たり法 (6 点)
各用事を各部屋に行うか、行わないかの組み合わせを全部試す。矛盾のある組み合わせを捨てて、残るものから最適解を選ぶ。 用事毎に m+1 の選択肢があるので、計算量は O(nm+1)。問題点は、時間がかかりすぎる可能性がある。