青山学院大学

後期試験 ・ 2022 年 1 月 27 日 1 時限実施 ・ ページ

授業
科目
データ構造とアルゴリズム 学生番号 学科 学年 フリ
ガナ
  評点
                        氏名    
担当者 DÜRST, Martin J.

計算量 (20 点)

下記左側にある計算量を持つプログラム断片を右側に書きなさい。記述は使い慣れたプログラム言語でも疑似コードでもよい。 文法の間違いではなく、計算量があっているかどうかで採点される。変数の宣言は不要。なお、n*nn*log(n) などの式は使用禁止。

例: O(n)
 
 
for (i=0; i<n; i++)
    sum += i*i;
O(n2)
for (i=0; i<n; i++)
    for (j=0; j<n; i++) {
        sum += i*i;
    }
O(4n)
fun(n) {
    if (n<=1)  sum += 1;
    else for (i=0; i<4; i++)  fun(n-1);
}
O(n3)
for (i=0; i<n; i++)
    for (j=0; j<n; j++)
        for (k=0; k<n; k++)
            sum += i*j+k;
O(n log n)
for (i=n; i>0; i/=2)
    for (k=0; k<n; k++) {
        sum += k*i;
    }
O(n!)
fun(n) {
    if (n<=1)  sum += n;
    else for (i=0; i<n; i++)  fun(n-1);
}

後期試験 ・ 2022 年 1 月 27 日 1 時限実施 ・ ページ

アルゴリズムの設計方針 / Algorith Design Strategies (25 点)

下記の「ハミルトン閉路問題」の課題のため、下記の最初の四つの部分問題のアルゴリズムの設計方針や原理を使った際の、 それぞれのアルゴリズムの概略を提案しなさい。また、それぞれに対し、予想される計算量とその根拠、設計方針を使った場合の問題点について述べなさい。
For the problem explained below, in the first four subproblems propose ideas for algorithms using the respective algorithm design strategies. In each case, indicate the expected time complexity and the reason for it, and the problems when using this design strategy.

注: この問題の目的は、最適な結果をもたらすアルゴリズムの発見よりも、設計方針の知識の応用である。
Caution: The purpose of this problem is to show you can apply your knowledge about design strategies, rather than to design the best algorithm.

課題: ハミルトン閉路問題では、n 個の頂点と m 個の辺からなるグラフが与えられ、全ての頂点を1回ずつ通る閉路 を求め、不可能であればその旨を出力する。

遺伝的アルゴリズム / genetic algorithm

@@@

貪欲アルゴリズム / greedy algorithm

@@@

分割統治法 / divide and conquer

@@@

動的計画法 / dynamic programming

@@@

社長に「大事な顧客の多数の大規模なグラフに対し、必ず明日まで解を出してくれ。」と言われたときの返事の概略を書きなさい。なお、ハミルトン閉路問題は調べたら、 NP完全問題であることが判明しました。

大変申し訳ございませんが、この問題は 3-SAT 問題、独立集合問題や巡回セールスマン問題をはじめ多くの問題と同様に NP 困難であり、 いまだに必ず早い時間 (数年以上のではなく、明日まで) で完璧に解けるアルゴリズム (方法) が見つかっていません。 万が一見つかったら世紀の大発見になり、一億円以上の賞金も貰える。 多くの専門家はそれが無理だと思っているが、その証明もいまだできていません。

青山学院大学

後期試験 ・ 2022 年 1 月 27 日 1 時限実施 ・ ページ

授業
科目
データ構造とアルゴリズム 学生番号 学科 学年 フリ
ガナ
  評点
                        氏名    
担当者 DÜRST, Martin J.

二分探索木とクイックソート (25 点)

二分探索木を作成しなさい。入力項目を一つ挿入するごとにその途中経過を書きなさい。 入力項目とその順番: A, O, Y, S, G, M. (6 点)

    A         A            A            A            A            A
               \            \            \            \            \
                O            O            O            O            O
                              \            \          / \          / \
                               Y            Y        G   Y        G   Y
                                            /            /         \ /
                                           S            S          M S

二分探索木の探索の場合の平均計算量 (1 点): O(log n)         二分探索木の探索の場合の最悪の計算量 (1 点): O(n)

最悪の計算量になる条件を説明しなさい。(2 点)

入力される順番がソートされている順番に近い場合、木の高さが O(n) になる場合。

最悪の計算量にならないようにするための対策を説明しなさい。(3 点)

項目の入力や削除の順番は変えられませんので、二分探索木をやめて、何かの平行木 (2-3-4 分木、赤黒木など) やハッシュ表を使うしかありません。

クイックソートの平均計算量 (1 点): O(n log n)                          クイックソートの最悪の計算量 (1 点): O(n2)

最悪の計算量になる条件説明しなさい。(2 点)

ピボットの選択が何回も範囲の一番小さいや一番大きい項目 (やそれに近い項目) になった場合。

最悪の計算量にならないようにするための対策を説明しなさい。(2 点)

ピボットを乱数で選ぶか、三つの要素の中央値で選ぶ。

計算量とは関係のない、クイックソートの実装にできる工夫を三つ列挙しなさい。(3 点)

  1. stack overflow を防ぐために、長い部分を末尾再起で実行する。
  2. 部分が小場合、クイックソートをやめ、挿入ソートで「仕上げ磨き」する。
  3. 添え字の比較を不要にするために、番兵を使う。

二分探索木もクイックソートも平均計算量と最悪の計算量の関係が似ている。しかし、最悪の計算量への対策が違う。
計算量の共通点と対策の違いの根本的な理由を説明しなさい。(3 点)

計算量が違うのはどちらも、分割のところでデータの真ん中あたりの項目を使えるかどうかにかかっています。 しかし、クイックソートの場合、すべてのデータ項目がそろっているので、分割点はアルゴリズム内で選べるのにたいし、二分探索木の場合、挿入の順番は外部に依存しているので、別のデータ構造を使うしかない。

後期試験 ・ 2022 年 1 月 27 日 1 時限実施 ・ ページ

探索用のデータ構造の選択 / Selection of Data Structures for Seaching (合計 18 点)

下記の三つの事情に合わせて、探索用のデータ構造を実装するように頼まれた。 データ構造を選んで、そのデータ構造の名前、仕組み、探索の計算量、選んだ理由と実装の場合特に注意すべき点を記述しなさい。

データ項目が挿入される順番が予想不可能な場合でも対応可能な、ライブラリに組み込むための本格的な実装が必要。
ハッシュ表を使います。キーからハッシュ関数でビンの番号を決め、そこからチェーン法でデータ項目を連結リストでつなぐ。 質のいいハッシュ関数を使って、占有率をある一定の値 (例: 5.0) より小さく保つと連結リストの平均の長さが限定されて、操作 (挿入、削除、探索) が一定時間 (O(1)) で可能。
 
 
扱うデータの量が膨大で、現代の計算機のメインメモリに入りきらない。
B+ 木が最適を使います。データを最下層だけにおいて、それより上の層にキーのみを配置し、ノードの大きさ を外部メモリのページの大きさに合わせることで、外部メモリへのアクセスの数を抑えて、高速化につながる。 計算量は挿入、削除、探索とも O(log n) だが、一つ一つのページの取り寄せにかかる時間が長い。 実装の場合には特に削除がめんどくさい。
 
 
 
扱うデータ項目の全てのキーが前もって知られているし、項目ごとに必要なメモリが一定である。データの量がかなりあるが、早い探索アルゴリズムが欲しい。
項目を整列し、配列に入れるのが最適かと思われる。探索は二分探索で O(log n)。 実装が簡単で、余分のメモリもいりません。
 
 
 
 

授業へのコメント / Comment about Course (9 点)

この授業で一番分かりにくかったことを書きなさい。 (決まった正解はありません。)
What was most difficult to understand in this course? (there is no definite answer)

@@@@
@@@@

この授業で一番勉強になったことを書きなさい。 (決まった正解はありません。)
What topic in this course was most interesting for you? (there is no definite answer)

@@@@
@@@@

一回目の授業では参考書の購入 (又は貸出) と熟読が強く薦められました。熟読した参考書の詳細を書きなさい。参考書を読まなかった場合、その理由を書きなさい。

石畑清著、アルゴリズムとデータ構造、
岩波講座ソフトウェア化学、岩波書店

青山学院大学

後期試験 ・ 2022 年 1 月 27 日 1 時限実施 ・ ページ

授業
科目
データ構造とアルゴリズム 学生番号 学科 学年 フリ
ガナ
  評点
                        氏名    
担当者 DÜRST, Martin J.

疑似コードとラビン-カープ (Rabin-Karp) アルゴリズム (25 点)

疑似コードの特徴を五つ列挙しなさい。(5 点)

  1. 変数宣言が不要
  2. 特殊記号が使用可能 (←, ≦ 等)
  3. 一部自然言語が使用可能
  4. 実行可能でなくてよい
  5. アルゴリズムの特徴や書き手の好みに合わせるのが可能

ラビン-カープアルゴリズムの疑似コードを書きなさい。(20 点)

   algorithm: Rabin-Karp
     input: pattern p, of length m; text t, of length n; base b; divisor d;
     output: position, or nil when not found
   
     pattern_hash ← (∑i=0m-1p[i]*b(m-i-1)) mod d
     running_hash ← (∑i=0m-1t[i]*b(m-i-1)) mod d
     for i from 0 to (n-m-1)
       if pattern_hash = running_hash and pattern = text[i..(i+m-1)]
         return i
       end_if
       running_hash -= text[i] * (b(m-i) mod d)
       running_hash *= b
       running_hash += text[i+m]
       running_hash = running_hash mod d
     end_for
   end_algorithm
  

3-SAT 問題と帰着 (6 点)

次の 3-SAT 問題を独立集合問題に帰着しなさい。

(¬ab ∨ ¬c) ∧ (a¬b ∨ ¬c) ∧ (¬abc)

   
   
   
   
   
   

後期試験 ・ 2022 年 1 月 27 日 1 時限実施 ・ ページ

挿入ソートと選択ソートの比較 (26 点)

挿入ソートと選択ソートのアルゴリズムは両方とも二重ループを使用する。外側のループが何回か完了した時点の配列の状態をそれぞれ書きなさい。(6点)

完了した回数挿入ソート選択ソート
開始前 4 2 9 7 0 3 8 5 6 1 4 2 9 7 0 3 8 5 6 1
1 2 4 9 7 0 3 8 5 6 1 0 2 9 7 4 3 8 5 6 1
2 2 4 9 7 0 3 8 5 6 10 1 9 7 4 3 8 5 6 2
3 2 4 7 9 0 3 8 5 6 10 1 2 7 4 3 8 5 6 9
5 0 2 3 4 7 9 8 5 6 10 1 2 3 4 7 8 5 6 9

ソートする配列の長さが n で、外側のループ回数が k 回目のとき、それぞれのアルゴリズムは平均で何回、配列の要素の比較を行っているかと、その理由を書きなさい。(6点)

挿入ソート: (1+k)/2回。なぜかというと、最低1回で最大で k回比較が必要で、すべての回数が同じ割合です。

選択ソート: n-k回。なぜかというと、k回目の外側のループでは n-k+1 この項目の中の最小の項目を見つける必要がある。

ソートする配列の長さが n で、外側のループ回数が k 回目のとき、平均で何回配列の要素を移動しているかとその理由を書きなさい。
なお、項目の交換の場合、一時的に避難する必要があるので、一つの交換のためには三つの移動が必要。(6点)

挿入ソート: k/2+2回。なぜかというと、新しく挿入する項目をよけると戻すには2回、その間の項目をずらすのは最低0回で最大k回の平均となる。

選択ソート: 3回。なぜかというと、見つかった最小の項目と
最初の項目を交換するためです。

アルゴリズムの特徴がよく見えるように授業で使ったアニメーションと同様に、外側のループの回数のちょうど半分が完了した時点での状態を描きなさい。(6点)。

挿入ソート選択ソート
     
     
     
    [図省略]
     
     
     
     
     
     
    
 

両方のアルゴリズムが同時にスタートし、終了までに同じ時間を要するという前提で、上記の図のどちらがなぜ先なのか説明しなさい。(4点)

挿入ソートの方の図が先です。なぜかというと挿入ソートの外側のループが回数ごとに重くなるが、選択ソートの方は回数ごとに軽くなる。

アルゴリズムを選ぶにあたって、それぞれの一番大事な特徴を書きなさい。(4点)

挿入ソート: すでに殆ど整列されている場合、早い (「仕上げ磨き」に最適)

選択ソート: 項目の移動は O(n) で少なくて、実行時間の揺れも少ない

青山学院大学

後期試験 ・ 2022 年 1 月 27 日 1 時限実施 ・ ページ

授業
科目
データ構造とアルゴリズム 学生番号 学科 学年 フリ
ガナ
  評点
                        氏名    
担当者 DÜRST, Martin J.

用語の説明 / Explanation of Terms (40 点)

次の英語の用語に相当する日本語の用語を書いて、簡単に説明しなさい。日本語の用語ではカタカナをできるだけ避けなさい。部分問題 X.11 以降は説明を長くしなさい。

chaining
連鎖法; ハッシュ表で激突が生じるときに連続リストを使う方法
magnetic tape
磁気テープ; 昔よく使われた外部大量記憶装置の一つ、マージソートが最適
asymptotic lower bound
漸近的下界; 最低でもこのぐらい増えること、アルゴリズムより問題の場合に多く使用
perfect hash function
完全ハッシュ関数; 激突の無いハッシュ関数、データに合わせて作る必要がある
brute force algorithm
腕力法; 効率的なアルゴリズムとの比較に使われる単純なもの
cryptographic hash function
暗号技術的ハッシュ関数; 電子著名などに使う強いハッシュ関数
simulated annealing
焼き鈍し法; 解を乱数の変化で、「温度」を提げながら見つける近似アルゴリズム
tractable problem
手に負える問題; 計算量が多項式である問題 (指数的計算量との区別のため)
inorder
通りがけ順、(二分) 木の辿り方で、親を左のこの後、右のこの前に処理する
stable sorting
安定な整列法; 整列基準において同等の様子の順番を入れ替えない整列法
abstract datatype
抽象データ型; データ上の操作だけが定義; 実装は内部に隠ぺい、変更可能
例としては辞書、優先順位キュー、スタック、キューなどがある。実装によって、計算量が変わる
dictionary
辞書; データ項目をキーを使って探索、挿入、削除できる抽象データ型
実装としては二分探索木、AVL木、赤黒木、2-3-4木、B-木、B+木、ハッシュ表などがある
amortized analysis
償却分析、データ構造をたまに時間をかけて大幅に作り直す場合の計算量の分析
応用例としては ハッシュ表の作成の計算量がある。
priority queue
優先順位キュー; 順位の優先度が一番高い項目を常に先に出す抽象データ型
効率的な実装にはヒープ (上下の順番だけが保たれる完全に分木) がある。
traveling salesman problem
巡回セールスマン問題; 配達などの最短 (最速、最安) ルートを認める問題
実用性が非常に高いだが、判定問題 (ある距離など以下が可能か) は NP 完全問題