後期試験 ・ 2011 年 1 月 27 日 1 時限実施 ・ ページ
授業 科目 |
データ構造とアルゴリズム | 学生番号 | 学科 | 学年 | 組 | 番 | フリ ガナ |
評点 | ||||||||
氏名 | ||||||||||||||||
担当者 | DÜRST, Martin J. |
クイックソートも二分探索木も平均を分析すると結構有力なものです。 しかしクイックソートが幅広く使われるのに、(単純な) 二分探索木はほとんど使われない。 次の項目に答えてその理由を考えなさい。
クイックソートの平均計算量: O(n log n)
クイックソートの平均計算量の前提: 全ての順番が同じ割合で出現
クイックソートの最悪の計算量: O(n2)
クイックソートの最悪の計算量の条件: 項目の順番が既に降順または昇順
二分探索木の探索の平均計算量: O(log n)
二分探索木の探索の平均計算量の前提: 全ての挿入順番が同じ割合で出現
二分探索木の探索の最悪の計算量: O(n)
二分探索木の探索の最悪の計算量の条件: 項目の挿入順番が降順または昇順
クイックソートで最悪の計算量を避けるためにとられる対策 (二種類):
1) 三つの項目の中央値をピボットとして選択
2) 乱数でピボットを選択
クイックソートで最悪の計算量を避けるためにとられる対策が二分探索木でなぜとれないのかの理由:
クイックソートではすべての項目を配列で同時に扱うに対し、二分探索木で順番の挿入は変えない
(単純な) 二分探索木をもとに、挿入と削除の時に工夫して効率が保証できる木の種類 (二種類):
1) ALV 木
2) 赤黒木
アルゴリズムの表現に流れ図がよく使われる。流れ図の具体例を書いたうえで、流れ図の利点と問題点について述べなさい。
[具体例省略]
利点: 図として非常に直観的な表現で、素人にも説明可能。
問題点: コンピュータ上での作成には手間がかかって、データの交換も困難。 流れ図の矢印は goto に相当するが、これは構造化プログラミングの繰り返しや分岐と隔たりがある。
後期試験 ・ 2011 年 1 月 27 日 1 時限実施 ・ ページ
Rabin-Karp のアルゴリズムを疑似コードで書きなさい。なお、ハッシュ値の計算に使われるアルファベットの基数 b と法 d は定数として与えられていると仮定して良い。 (16 点)
algorithm rabin_carp inputs: text t of length n (t[1]...t[n]), pattern p of length m (p[1]...p[m]) output: position of match or -1 when no match found hp ← ht ← 0 for pi from 1 to m do hp ← (hp*b + p[pi]) mod d ht ← (ht*b + t[pi]) mod d end for ti from 1 to n-m+1 do if hp = ht then match ← TRUE for pi from 1 to m do match ← FALSE if p[pi] ≄ t[ti+pi-1] end return ti if match end ht ← ht - t[ti] * (bm-1 mod d) ht ← (ht*b + t[ti+m-1]) mod d end end
ハッシュ表に使われるハッシュ関数の注意点を三つ列挙し、説明しなさい。(6 点)
次の計算量を小さい順に並びなおしなさい。「<」または「=」で小さい場合と同等な場合を区別しなさい。
(例: O(1)=O(2)<O(nn)。)
O(1.001n),
O(1000 log log n),
O(n log n),
O(n1.001),
O(n!),
O(1.1n),
O(log7 n),
O(logn n),
O(nn),
O(n1.1)
O(1000n)
O(7100),
O(n),
O(log (n2)),
O(7100)
= O(logn n)
< O(1000 log log n)
< O(log7 n)
= O(log (n2))
< O(n)
= O(1000n) <
< O(n log n)
< O(n1.001)
< O(n1.1)
< O(1.001n)
< O(1.1n)
< O(n!)
< O(nn)
後期試験 ・ 2011 年 1 月 27 日 1 時限実施 ・ ページ
授業 科目 |
データ構造とアルゴリズム | 学生番号 | 学科 | 学年 | 組 | 番 | フリ ガナ |
評点 | ||||||||
氏名 | ||||||||||||||||
担当者 | DÜRST, Martin J. |
下記の三つの事情に合わせて、順列のアルゴリズムを実装するように頼まれた。 アルゴリズムを選んで、そのアルゴリズムの名前、仕組み、選んだ理由と実装の場合特に注意すべき点を記述しなさい。
下記の発言の後、正しければ ○、間違いであれば × を書きなさい。
例: 線形探索の計算量は O(n) である: ○
NP 完全問題でも、具体的なデータの場合意外と簡単に溶解ける場合もある: ○
Google は一つのアルゴリズムのおかげで大企業になった: ○
NP 完全問題はアルゴリズムでは解けない: ×
Ruby で変数の方型宣言が不要なので疑似コードに向いている: ○
どんなアルゴリズムでも解けない問題が存在する: ○
「普通」のヒープで合併は O(log n) で可能: ×
最初のアルゴリズムは西暦800年辺りに Muhammad ibn Mūsā al-Khwārizmī に発見された: ×
整列は条件によって O(n) でも実装が可能: ○
アルゴリズムを実装しないと評価できない: ×
NP=P を証明できれば2億円ンの賞金がもらえる: ×
後期試験 ・ 2011 年 1 月 27 日 1 時限実施 ・ ページ
次の英語の用語に相当する日本語の用語を書いて、簡単に説明しなさい。日本語の用語ではカタカナをできるだけ避けなさい。
高さ h (h≥1) の B+木の最少と最多のデータ項目の数を計算し、細かく説明しなさい。次の記号を使って、切り上げや切り捨ても考慮しなさい。
葉の最大項目数:
⌊Lp /
(Lk+Ld)⌋
(ページの大きさをキーとデータの大きさで割ったもの)
葉の最低項目数:
⌊αmin⋅⌊Lp /
(Lk+Ld)⌋⌋
(最低占有率掛ける葉の最大項目数)
内部節の最大の子供の数:
⌊Lp /
(Lk+Lpp)⌋
(ページの大きさをキーとデータの大きさで割ったもの)
内部節の最低の子供の数:
⌊αmin⋅⌊Lp /
(Lk+Lpp)⌋⌋
(最低占有率掛ける内部節の最大の子供の数)
高さ hの最大のデータ項目数:
⌊Lp /
(Lk+Lpp)⌋(h-1)⋅
⌊Lp /
(Lk+Ld)⌋
((h-1)は内部節の層の数。内部節の最大の子供の数を(h-1)にすると葉の数になって、
これを葉ごとの最大の項目数と書ける。)
高さ hの最低のデータ項目数:
⌊αmin⋅⌊Lp /
(Lk+Lpp)⌋⌋(h-1)⋅
⌊αmin⋅⌊Lp /
(Lk+Ld)⌋⌋
(最大のデータ項目数のところと同じが、最低占有率も考量する必要がある。
後期試験 ・ 2011 年 1 月 27 日 1 時限実施 ・ ページ
授業 科目 |
データ構造とアルゴリズム | 学生番号 | 学科 | 学年 | 組 | 番 | フリ ガナ |
評点 | ||||||||
氏名 | ||||||||||||||||
担当者 | DÜRST, Martin J. |
下記の問題のため、下記のアルゴリズムの設計方針や原理を使って、それぞれアルゴリズムの概略を提案し、予想される計算量、設計方針を使った場合の問題点について述べなさい。
注: この問題の目的は、できるだけ最適解な結果のアルゴリズムの発見よりも、設計方針の知識の応用である。
問題: 距離が三角不等式を満たす巡回セールスマン問題。詳細: 町 (頂点) m1 から mn があって、mi から mj までの距離 (辺の長さ) が idj で与えられた場合、m1 から出発して、どの順番でもいいがすべての町を一回訪問して m1 にもどるできるだけ短い巡回になる順番を求める。ただし idj + jdk ≥ idk。
分割統治法 (6 点)
町の二次元配置を見て、南北又は東西に町を二つのほぼ同じ数のグルーブに分け、 それぞれのグループにできるだけ短い巡回を探す。両方の巡回でもう一つの巡回に近い直接つながっている町を見つけ、 二つの巡回を一つの大きい巡回につなぐ。アルゴリズムを再帰的に適用する。町の数が小さい (例: 6以下) の場合、総当たり法で解く。 計算量は O(n log n)。二つの巡回を効率よくつなげるかどうかが課題。
焼き鈍し法 (6 点)
最初は乱数を使って一定の数の解を作る。繰り返し各解から複数の新しい解を作って、 今まで見つけた一番いい解を複数残す。新しい解を作るときに、複数の辺を乱数で決め、つなぎ直す。 繰り返しが進むにつれ、つなぎ直す辺の数 (温度) を少しずつ下げる。それにより、 早いうちに局所的な最適解に陥ることを避けられる。計算量は O(n∙繰り返しの数∙作成する解の数)。 問題点は温度の下げ具合などの調整の必要性。
貪欲アルゴリズム (6 点)
スタートする町を任意で決める。そこから次々と次に一番違い町を見つけ、つなぐ。最後の町から最初の町に戻る。 計算量は O(n2) (町ごとに残りの一番近い町を計算するため)。 部分的には特に最初の方では結構いい結果が期待できるが、最後の方は場合によって相当距離が増える可能性もある。
動的プログラミング (6 点)
町を東西または南北の方向 (又は両方向) に小さいグループに分ける。 グループごとの最適解を総当たり法で決める。隣り合わせのグループを大きいグループと合併する (方法は分割統治法の同等)。 それぞれの大きいグループの場合、どの分割を合併する場合にグループ全体の道が一番短くなるかを検討、記録する。 課題も分割統治法と同じ。