「北海道大学大学院情報科学院修士課程入学試験」(令和6年8月実施)の情報理工学コース「アルゴリズムとデータ構造」対策ページです。
分野別対策
アルゴリズムとデータ構造
計算量、オーダー表記
参考にしたサイトは以下のとおり。
プログラムの計算量、オーダー表記 O( ) の求め方のまとめ _ 工業大学生ももやまのうさぎ塾.html
- 項の強さを弱い順に左から並べると、以下のとおりである。
- \(logn, \sqrt{n}, n, nlogn, n^2, n^3, 2^n, n!\)
問題
アルゴリズムの優劣を考える際に用いる時間計算量および空間計算量 (領域計算量) の \(O\)(ラージオー) 記法による漸近的評価について説明し、そのような記法を用いる実用的意義について、例を用いて述べよ。
解答
時間計算量および空間計算量のO記法による漸近的評価アルゴリズムの優劣を評価するために、主に時間計算量と空間計算量が用いられる。これらは、それぞれアルゴリズムが処理を行うのに要する時間と、必要とするメモリ領域の量を表す。O記法(ビッグオー記法)は、これらの計算量を漸近的に評価するために使用される。
時間計算量時間計算量は、入力のサイズ \(n\) が大きくなるときに、アルゴリズムがどの程度の時間を要するかを評価する。例えば、アルゴリズムAの時間計算量が \(O(n^2)\) と評価される場合、入力サイズが2倍になると、処理時間は約4倍になることを意味する。この記法では、定数係数や低次の項は無視され、最も影響が大きい項のみが考慮される。
空間計算量空間計算量(領域計算量)は、アルゴリズムが動作するために必要とするメモリの量を示す。同様に、O記法を用いて漸近的な評価を行うことで、大規模なデータに対してどの程度のメモリを必要とするかを判断できる。
実用的意義O記法を用いることで、アルゴリズムのスケーラビリティを理解しやすくなる。例えば、ソートアルゴリズムの比較において、クイックソートの時間計算量が平均 \(O(n \log n)\) であるのに対し、バブルソートは \(O(n^2)\) である。この違いは、入力サイズが大きくなるときにクイックソートの方が圧倒的に効率的であることを示している。
O記法による評価は、アルゴリズムを選択する際の重要な基準となり、大規模な問題に対する適用可能性を判断するために不可欠である。例えば、検索アルゴリズムで、二分探索は \(O(\log n)\) で動作するため、線形探索の \(O(n)\) よりも遥かに効率的であることがわかる。このように、O記法は理論的な性能評価だけでなく、実際のプログラム設計においても非常に有用である。
最小全域木
参考にしたサイトは以下のとおり。
うさぎでもわかる離散数学(グラフ理論) 第13羽 最小全域木の求め方(クラスカル法・プリム法) _ 工業大学生ももやまのうさぎ塾.html
- 全域木とは、もとのグラフのすべての点を含み、さらに選んだ辺が木となっているようなグラフである。
- 全域木の個数を数える方法は以下の通りである。
- ラプラス行列\(L\)(各行各列がグラフの頂点に対応していて、対角成分にはその頂点の次数、非対角成分には枝がある部分に\(-1\)、ない部分に\(0\)を格納した正方行列)を作る。
- \(L\)の11余因子\(L_{11}\)の行列式の値が全域木の個数となる。
- 最小全域木とは、選んだ辺の重みの合計が一番小さい全域木のことである。
- 最小全域木を求めるアルゴリズム①「クラスカル法」は以下のとおりである。
- 重みが小さい順に辺をチェックする。
- チェックした辺を追加しても閉路ができなければ辺を追加する。追加して閉路ができてしまう場合は無視する。
- すべての辺をチェックし終わったときに追加された辺が最小全域木である。
- 最小全域木を求めるアルゴリズム②「プリム法」は以下のとおりである。
- スタートの点を1つ決める(どこでも良い)。
- スタート点から辿れる辺の中で最も重みが小さい辺を追加する(最も重みが小さい辺が複数ある場合は、重みが小さいどの辺を選んでも良い)。
- 追加した辺につながっているすべての点から辿れる辺かつ追加しても閉路とならない辺の中から最も重みが小さい辺を追加する。
- 追加できる辺がなくなったとき、最小全域木である。
ダイクストラ法
参考にしたサイトは以下のとおり。
ダイクストラ法による単一始点最短経路を求めるアルゴリズム _ アルゴリズムロジック.html
- ダイクストラ法は、ネットワークにおいて、すべての頂点\(v\)に対して、指定された頂点\(s\)から頂点\(v\)への最短路長\(D(v)\)を求めるアルゴリズムである。
- アルゴリズムは以下のとおりである。
- 始点\(s\)を「既に最短距離が確定した頂点」、他の頂点を「まだ最短距離が確定していない頂点」とする。
- 以下をすべての頂点の最短距離が確定するまで繰り返す。
- すべての「既に最短距離が確定した頂点\(u\)」から「まだ最短距離が確定していない頂点\(v\)」へ伸びるすべての辺\(e=(u, v)\)について、「\(v\)と\(D(v)\)の候補」をまとめておく。
- 候補の中から、\(D(v)\)が最小のものを選択し、\(v\)を「既に最短距離が確定した頂点」に加える。
幅優先探索(BFS)、深さ優先探索(DFS)
参考にしたサイトは以下のとおり。
うさぎでもわかる2分探索木 後編 2分探索木における4つの走査方法 _ 工業大学生ももやまのうさぎ塾.html
深さ優先探索と幅優先探索 _ 高校数学の美しい物語.html
幅優先探索 (BFS)
- 概略
幅優先探索 (BFS) は、グラフや木の探索アルゴリズムであり、探索の開始点から近い順にすべての頂点やノードを探索する方法である。具体的には、最初にルートノードや開始ノードをキューに入れ、その後、キューから順にノードを取り出して、隣接するすべての未探索のノードをキューに追加していく。この過程をキューが空になるまで繰り返す。
- 特徴
- 最短経路: BFSは、探索を開始するノードから他のすべてのノードへの最短経路を見つけることができる。特に無加重のグラフにおいて、最短経路の問題に適している。
- 使用するデータ構造: キュー(FIFO)を使用して、探索するノードを管理する。
- メモリ効率: BFSは探索のすべてのレベルのノードをキューに保持するため、メモリ使用量が大きくなることがある。特に、広いグラフや木では、キューのサイズが非常に大きくなる可能性がある。
- 用途: 幅優先探索は、迷路問題、ネットワークルーティング、ウェブクローリングなど、探索の深さよりも幅を優先する問題でよく使われる。
深さ優先探索 (DFS)
- 概略
深さ優先探索 (DFS) は、グラフや木の探索アルゴリズムであり、探索の開始点からできるだけ深く進み、行き止まりに達したらバックトラックして他の未探索のノードを探索する方法である。具体的には、ルートノードや開始ノードをスタックに入れ、スタックからノードを取り出して、その隣接ノードをスタックに追加していく。スタックが空になるまでこの過程を繰り返す。
- 特徴
- メモリ効率: DFSは、探索中のノードとその子ノードのみをスタックに保持するため、BFSに比べてメモリ使用量が少なく済む。特に、深いグラフや木ではメモリ効率が良い。
- 使用するデータ構造: スタック(LIFO)を使用して、探索するノードを管理する。再帰を用いて実装されることも多い。
- 全体探索: DFSは、すべてのノードを探索する必要がある問題に適しており、木やグラフのすべてのノードを訪問することが保証される。
- 用途: 深さ優先探索は、パズルの解決、コンポーネントの検出、トップソート、バックトラッキングアルゴリズムなど、探索の幅よりも深さを優先する問題でよく使われる。
幅優先探索と深さ優先探索の比較
- 経路の探索: BFSは最短経路を見つけるのに優れているが、DFSは一つの経路を見つけるのに優れている。
- メモリ使用量: BFSはメモリ使用量が多くなりがちであるが、DFSは比較的少なく済む。
- 時間効率: 両者の時間計算量は、最悪の場合は同じであるが、問題の特性によってどちらが効率的かが異なる。
- 用途の違い: BFSは最短経路探索やレベルごとの探索に適し、DFSは完全探索やバックトラッキングに適している。
二分探索木
- 具体例
- 各ノードには値が格納されており、全てのノードは最大2つの子ノードを持つことができる。
- 任意のノード \(N\) について、その左の子ノードに格納されている全ての値は \(N\) の値より小さく、右の子ノードに格納されている全ての値は \(N\) の値より大きい。
- 左の子ノードと右の子ノードに対しても、同様の性質が再帰的に適用される。
- ルートノードから開始し、挿入する値が現在のノードの値よりも小さい場合は左の子ノードへ、大きい場合は右の子ノードへ進む。
- 進む先の子ノードが存在しない場合、その場所に新しいノードを作成して値を挿入する。
問題
二分探索木 (binary search tree) は、全順序 (total ordering) をもつ \(n\) 個の要素からなる集合を格納するためのデータ構造である。 このデータ構造について簡潔に説明せよ。 また、空の二分探索木に、ランダムに選ばれた \(n\) 個の要素を、二分探索木の構造を保ちながら一つずつ挿入する場合に、 要素一つあたりの挿入 (insert) にかかる平均時間計算量を \(O(\log n)\) とするための方法について説明せよ。
解答
二分探索木 (Binary Search Tree, BST) は、全順序 (total ordering) を持つ要素からなるデータ構造である。 具体的には、以下の条件を満たすように構造化されている。
これにより、任意の値に対する探索、挿入、削除といった操作を効率的に行うことが可能である。
空の二分探索木にランダムに選ばれた \(n\) 個の要素を挿入していく場合、それぞれの挿入操作は次の手順に従う。
各挿入操作において、BSTの高さに依存する比較が行われる。ランダムに選ばれた要素を挿入する場合、木の高さは平均して \(O(\log n)\) となるため、各要素の挿入にかかる平均時間は \(O(\log n)\) となる。
単純グラフ
- 具体例
-
以下の定義を答えよ。
- 頂点の次数
- 完全グラフ
頂点の次数とは、その頂点に接続している辺の数のことを指す。
完全グラフとは、任意の2つの異なる頂点の間に辺が存在するグラフのことを指す。 \( n \) 頂点の完全グラフは \( K_n \) と表され、その辺の数は \( \frac{n(n-1)}{2} \) である。
-
単純グラフ \(G(V, E)\) のすべての頂点の次数が \( \frac{n-1}{2} \) 以上であるとき、 \(G(V, E)\) は連結であることを示せ。
証明:
- 連結でないと仮定して、背理法によって証明する。
- つまり、\(G\)を\(G_1\)と\(G_2\)に分離可能だと仮定する。
- このとき、\(G_1\)に含まれる頂点 \(v\) は \( \frac{n-1}{2} \) 個以上の頂点と接続されている。
- \(v\) と接続されていない\(G_2\)に含まれる頂点の数は \( n - 1 - \frac{n-1}{2} = \frac{n-1}{2} \) 以下である。
- 頂点数が \( \frac{n-1}{2} \) 以下の頂点群における最大次数は\( \frac{n-1}{2} - 1 \)以下である。
- したがって、\(G_2\)に含まれる頂点の次数が\( \frac{n-1}{2} \) 以上にならず、矛盾する。
-
辺の数が \( m = \frac{(n-1)(n-2)}{2} \) であるような、連結ではない単純グラフが存在することを示せ。
証明:
- 1個の頂点だけが連結でない単純グラフでは、連結な\(n-1\)個の頂点から2頂点を選ぶと辺が存在するため、辺の数が\( m = \frac{(n-1)(n-2)}{2} \)となる。
-
単純グラフ \( G(V, E) \) の辺の数が \( m \geq \frac{(n-1)(n-2)}{2} + 1 \) であるとき、 \( G(V, E) \) は連結であることを示せ。
証明:
- \( m = \frac{(n-1)(n-2)}{2} \) のとき、グラフは1個の頂点だけが連結でない単純グラフであることを示した。
- しかし、\( m \geq \frac{(n-1)(n-2)}{2} + 1 \) であれば、少なくとも1つの追加の辺が存在する。
- この追加の辺は、連結でない1個の頂点を結びつける役割を果たすため、グラフ全体が連結になる。
- したがって、\( G(V, E) \) は連結であることが示された。
\(n\)個の頂点と\(m\)個の辺からなる無向グラフ \(G(V, E)\) について、以下の問いに答えよ。なお、ループ(自己閉路)も多重辺も含まないグラフを単純グラフという。
ユークリッドの互除法
参考にしたサイトは以下のとおり。
アルゴリズムとデータ構造 - Tohoku University
- 具体例 問題
-
正整数 \(a, b (a \geq b)\) に対し、 \(a\) を \(b\) で割った商を \(q\)、余りを \(r\) とする。このとき、\(b,q,r\) を用いて\(a\)を表せ。
\( a = bq + r \quad \text{(ただし、} 0 \leq r < b \text{)} \)
-
(1) において \(r \neq 0\) のとき、ユークリッドの互除法では \(GCD(a, b)\) の出力が、何と同じであることを用いて計算するのか答えよ。
\( GCD(a, b) = GCD(b, r) \)
-
アルゴリズム GCD(a, b) の擬似コードを再帰アルゴリズムで書け。
def GCD(a, b): if b == 0: return a else: return GCD(b, a % b) -
(3) の再帰アルゴリズムにおいて、\(GCD(a, b)\) が実行時の再帰回数が \(O(log a)\) であることを示せ。
証明:
- \(a > b > r, q \geq 1\)より、\(a = bq + r > 2r\)である。
- つまり、互除法は各ステップで少なくとも半分に値が減少するため、最大で \( \log_2 a \) 回のステップが必要である。
- したがって、再帰の深さは \( O(\log a) \) である。
-
\(GCD(a, b)\) が \(O(log a)\) の多項式時間で計算できることを示せ。ただし、正整数 \(a, b (a \geq b)\) に対し、\(a\) を \(b\)で割った余りは \(O((\log_2 a)^2)\) 時間で計算できることを用いること。
証明:
- ユークリッドの互除法では、各ステップで \( a \) と \( b \) の割り算を行う。
- よって、全体の計算量は \( O((\log_2 a)^2) \times O(\log_2 a) = O((\log a)^3) \)となる。
- これにより、GCD(a, b) は \( O(\log_2 a) \) の多項式時間で計算できることが示された。
正整数 \(a, b (a \geq b)\) を入力とし、それらの最大公約数を出力するユークリッドの互除法によるアルゴリズム \(GCD(a, b)\) について、以下の問いに答えよ。
ネットワークフロー問題
参考にしたサイトは以下のとおり。
うさぎでもわかる離散数学(グラフ理論) 第15羽 最大フロー・最小カットの求め方 _ 工業大学生ももやまのうさぎ塾.html
- 具体例
- ネットワーク: グラフ \( G = (V, E) \) は、頂点の集合 \( V \) と辺の集合 \( E \) からなる。各辺 \( e \in E \) には非負の容量 \( c(e) \) が割り当てられている。
- ソースとシンク: 特定の始点であるソース \( s \) と終点であるシンク \( t \) が指定される。フローはソースからシンクに向けて流れる。
- フロー: 各辺 \( e \) に対して、フロー \( f(e) \) が存在し、これはその辺に流れる量を示す。このフローは、以下の2つの制約を満たさなければならない:
- 容量制約: 各辺のフローは、その辺の容量を超えない。すなわち、\( 0 \leq f(e) \leq c(e) \)。
- フロー保存則: ソースとシンクを除くすべての頂点 \( v \in V \) では、入ってくるフローの合計と出ていくフローの合計が等しい。
- 目的: ソースからシンクに流れるフローの総量(ネットワーク全体のフロー量)を最大化する。
- 最小カット容量: \( S \) と \( T \) の間にある辺の容量の総和が最も小さいカットを「最小カット」と呼び、その容量を「最小カット容量」と呼ぶ。
- ソースからシンクに流れることができる最大のフロー量は、そのネットワークにおいて存在するすべてのカットの中で、最小カットの容量と一致する。
- 逆に、最小カット容量を持つカットは、そのカットを越えてこれ以上フローを増加させることができない。
問題
グラフ理論において、有向連結グラフの各有向辺に非負の実数が割り当てられたものをネットワークと呼ぶ。 ネットワークフロー問題(最大フロー問題ともいう)について概略を述べよ、さらに、この問題に関する「最大フロー量と最小カット容量は等しい」という性質について説明せよ。
解答
ネットワークフロー問題(最大フロー問題)の概略ネットワークフロー問題とは、グラフ理論における問題の一つで、特に有向連結グラフ(ネットワーク)において、フローを最適化する問題である。この問題では、グラフの各辺にキャパシティ(容量)が割り当てられており、フローを源(ソース)からシンク(吸収点)まで最大化することが目的となる。
ネットワークフロー問題は、以下の要素から構成される:
この問題を解くための代表的なアルゴリズムとしては、フォード-ファルカーソン法、エドモンズ-カープ法、プッシュ-リレーベル法などがある。
最大フロー最小カット定理「最大フロー量と最小カット容量は等しい」という性質は、ネットワークフロー問題における最も重要な理論の一つである。これを 最大フロー最小カット定理 と呼ぶ。
定理の説明この定理は、以下のように述べることができる:
あるネットワークにおいて、ソースからシンクに流れる最大フロー量は、ソースとシンクを分ける最小のカット(カットセット)の容量に等しい。
ここで、カット(cut) とは、グラフの頂点集合 \( V \) を2つの部分集合 \( S \) と \( T \) に分けることで、\( S \) にソース \( s \) が含まれ、\( T \) にシンク \( t \) が含まれるようにするものを指す。このとき、カットに含まれるすべての辺の容量の合計をカット容量と呼ぶ。
最大フロー最小カット定理は、以下のことを保証している:
この定理の意味するところは、ネットワークの限界(つまり、フローの最大量)は、最も弱い部分(最小カット)によって決定されるということである。この定理は、ネットワークフローの理論において非常に強力な結果であり、フローの最適化問題やその応用において重要な役割を果たしている。
まとめネットワークフロー問題は、ソースからシンクに至るフローの最大化を目指す問題であり、最大フロー最小カット定理は、この問題におけるフローの最大量がネットワークの最も制限された部分(最小カット)の容量によって決定されることを示す重要な結果である。
到達可能性行列
参考にしたサイトは以下のとおり。
- 具体例
- 隣接行列\(A\)を求める。
- \(A\)に単位行列\(I\)を加える。
- この行列\(A+I\)をブール代数演算のもと、次の状態が得られるまで\(r\)回数分の乗算を繰り返す。
- このとき\((A+I)^r = (A+I)^{r+1} = T\)とおくと、この\(T\)が到達可能性行列。
問題
\(n\)個のノードからなる有向グラフにおける2ノード間の到達可能性を判定する方法について説明せよ。
解答
到達可能性行列を求めればよい。
到達可能性行列は、対角成分が1で、他の要素\(r_{ij}\)は点\(i\)から点\(j\)へ到達可能である場合に1、そうでない場合に0である行列。
以下の手順によって求めることができる。
ソート
参考にしたサイトは以下のとおり。
基本情報技術者 ソートのアルゴリズムとは? - Avinton Japan.html
- 具体例
-
挿入ソート (Insertion Sort)
- アルゴリズムの概要: 挿入ソートは、未ソートのデータを順次取り出し、すでにソートされた部分に正しい位置に挿入していくことでソートを行う。
- 平均時間計算量: \(O(n^2)\)
- 最悪時間計算量: \(O(n^2)\)
- 解説: 挿入ソートは、データがほぼソートされている場合に効率的であるが、逆にソートがまったくされていない場合は非常に非効率である。平均および最悪の計算量は二次時間計算量である。
-
マージソート (Merge Sort)
- アルゴリズムの概要: マージソートは、与えられた配列を再帰的に2つに分割し、それぞれをソートした後にマージすることでソートを行う。
- 平均時間計算量: \(O(n \log n)\)
- 最悪時間計算量: \(O(n \log n)\)
- 解説: マージソートは、分割と統治法を使用しており、常に安定した効率性を持っている。データの分割と統合のステップがログ時間計算量をもたらし、全体としては線形対数時間計算量になる。
-
クイックソート (Quick Sort)
- アルゴリズムの概要: クイックソートは、配列からピボットを選び、ピボットより小さい要素と大きい要素に分割し、それぞれを再帰的にソートすることで全体をソートする。
- 平均時間計算量: \(O(n \log n)\)
- 最悪時間計算量: \(O(n^2)\)
- 解説: クイックソートは、選択されたピボットが適切であれば効率的であるが、最悪の場合、選択が偏ってしまうと二次時間計算量に悪化する可能性がある。
問題
平均時間計算量と最悪時間計算量について説明せよ。次に、「挿入ソート(整列済みの配列部分に、新しく読み込んだデータを順次挿入する)」、「マージソート(配列を再帰的に2分割した上で、分割した配列を順次整列しながらマージする)」、「クイックソート(ピボットとなる数を選び、その数より小さいデータとそれ以外に分割していき、最終的に、これらの配列をまとめ上げる)」の3種類のアルゴリズムを、これらの計算量の概念を使って比較せよ。
解答
平均時間計算量と最悪時間計算量について平均時間計算量とは、アルゴリズムが与えられた問題を解くのにかかる平均的な時間を表すものである。これは、あらゆる入力ケースを考慮し、それらのケースでの計算時間の平均を取ることで得られる。
最悪時間計算量とは、アルゴリズムが最も時間がかかるケースに対して必要とする最大の計算時間を表すものである。この計算量は、特定のアルゴリズムが最悪の状況下でどの程度の時間を要するかを評価するために使用される。
ソートアルゴリズムの計算量比較効率性: クイックソートとマージソートは平均計算量が共に \(O(n \log n)\) であるため、効率的である。ただし、クイックソートはデータ分割がうまくいかないと最悪計算量が \(O(n^2)\) になるリスクがある。一方、マージソートは常に \(O(n \log n)\) で安定している。
安定性: 挿入ソートはデータがほぼソートされている場合に適しており、少量のデータセットに対しては効果的である。しかし、大量のデータや無秩序なデータに対しては非効率的である。
実用性: クイックソートは最悪ケースに注意を払いつつも、一般に最も実用的であると考えられている。マージソートは、安定性が求められる場面や一定の効率性が常に保証される場合に適している。
これらのソートアルゴリズムは、データの性質や問題の要件に応じて使い分けるべきである。
動的計画法
参考にしたサイトは以下のとおり。
うさぎでもわかるアルゴリズム 動的計画法 _ 工業大学生ももやまのうさぎ塾.html
- 具体例
問題
アルゴリズムの技法の1つである動的計画法とは、どのような原理によって計算の効率化を図る技法であるかを説明せよ。具体的な例題として、10円、20円、30円、40円、50円、60円の6種類の額面の切手をそれぞれ1枚ずつ持っている場合に、このうち何枚かを組み合わせてちょうど100円にする組合せが何通りあるかを求める問題を考え、この問題を動的計画法により解いた場合の計算過程を図または表で示して、どのように計算時間が節約されるかを説明せよ。
解答
この問題は、部分問題に分割して解くことができる。具体的には、「合計が100円になる組み合わせが何通りあるか?」という問題を、 より小さな合計金額についての問題に帰着させる。
部分問題の定義:
\( dp[i] \) を「合計が \( i \) 円になる組み合わせの数」と定義する。
初期条件:
何も選ばない状態、つまり合計が0円である場合は、1通りの組み合わせがあるとする。したがって、\( dp[0] = 1 \) である。
遷移方程式:
各額面 \( a \) について、金額 \( i \) を超えない範囲で以下のように遷移する:
\( dp[i] += dp[i - a] \)
これは、「現在の金額 \( i \) から額面 \( a \) を引いた金額 \( i - a \) で作れる組み合わせに、額面 \( a \) を追加する」ことを意味する。
計算過程:
まず、金額 \( i \) に対して \( dp[i] \) をすべて0で初期化し、初期条件 \( dp[0] = 1 \) を設定する。そして、各額面に対して上記の遷移を行う。
実際の計算過程:
| 金額 i | 0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 初期状態 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 10円追加 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 20円追加 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 30円追加 | 1 | 1 | 1 | 2 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 40円追加 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 1 | 1 | 1 |
| 50円追加 | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 3 |
| 60円追加 | 1 | 1 | 1 | 2 | 2 | 3 | 4 | 4 | 4 | 5 | 5 |
最終結果:
上記の計算から、ちょうど100円にする組み合わせの数は5通りであることがわかる。
(実際、(60, 40), (60, 30, 10), (50, 40, 10), (50, 30, 20), (40, 30, 20, 10)の5通りである。)
計算時間の節約:
このように動的計画法を用いることで、各金額に対しての計算を順次積み重ねていくため、 全ての組み合わせを直接調べるよりも計算効率が大幅に向上する。 具体的には、全探索の場合はある切手を「追加する」「追加しない」によって2分木を構築できるため、計算量は\(O(2^n)\)となる。 一方で、動的計画法の場合は上の表を埋めるだけでよいので、\(\text{縦} \times \text{横} = 6 \times 10 = 60\)より、\(O(60)\)で済む。
分割統治法
参考にしたサイトは以下のとおり。
分割統治法とは - 意味をわかりやすく - IT用語辞典 e-Words.html
うさぎでもわかるソーティング 応用ソート編 クイックソート・マージソート・シェルソート・ヒープソート _ 工業大学生ももやまのうさぎ塾.html
- 具体例
問題
分割統治法について、その概略と、計算効率の観点からの有用性について、具体例をあげながら、350字程度で説明せよ。
解答
分割統治法(Divide and Conquer)は、問題解決のアプローチとして、問題をいくつかのより小さな部分問題に分割し、それらを独立して解いた後、その解を組み合わせることで元の問題を解決する手法である。このアプローチは、複雑な問題を扱う際に特に有効であり、アルゴリズムの計算効率を向上させるためによく用いられる。
具体的な例として、マージソートとクイックソートのアルゴリズムが挙げられる。マージソートでは、まず配列を中央で2つに分割し、各部分を再帰的にソートする。その後、2つのソート済みの部分配列をマージ(統合)して、全体をソートする。このプロセスにおいて、分割とマージの各ステップでの計算量は \(O(n \log n)\) であり、非常に効率的である。一方、クイックソートでは、基準となるピボットを選び、配列をそのピボットを基に2つの部分に分割する。この分割は、ピボットより小さい要素と大きい要素に分ける形で行われる。その後、各部分を再帰的にソートし、結果を結合する。クイックソートの平均計算量も \(O(n \log n)\) であり、最悪の場合でも \(O(n^2)\) に抑えられることが知られている。
分割統治法の有用性は、計算効率の観点から特に顕著である。まず、大規模なデータ処理において、問題を小さく分割して処理することで、各部分問題に対して効率的なアルゴリズムを適用できる点が挙げられる。これにより、全体の計算量が大幅に削減される。また、各部分問題が独立しているため、並列処理が可能となり、複数のプロセッサやコアを利用して計算時間をさらに短縮できる。例えば、分割統治法を用いた並列アルゴリズムは、マルチコアプロセッサ上での実行において高いスループットを達成する。
さらに、分割統治法は、問題の再帰的な性質を活かして、プログラムの実装をシンプルかつ明瞭にすることができる。これにより、複雑なアルゴリズムの設計や理解が容易になり、メンテナンス性が向上する。以上の理由から、分割統治法は多くのアルゴリズムにおいてその有用性が認められており、計算効率の最適化を図る際に重要な手法となっている。
ハッシュ表
参考にしたサイトは以下のとおり。
【C言語】ハッシュ法(データ探索アルゴリズム)について分かりやすく解説 _ だえうホームページ.html
- 具体例
- 検索 (Search): ハッシュテーブルにおける検索の計算時間は、ハッシュ関数が良く設計され、衝突が少ない場合、平均して \(O(1)\) 時間である。最悪の場合でも、チェイン法やオープンアドレス法などの解決法により、\(O(n)\) 時間になることがあるが、これも極めて稀である。
- 挿入 (Insert): 新しい要素の挿入も、検索と同様に \(O(1)\) 時間で行える。挿入時には、ハッシュ値に基づいて適切な位置を決定し、そこに値を格納する。衝突が発生した場合には、チェイン法などで適切な処理を行う。
- 削除 (Delete): 削除も \(O(1)\) 時間で行える。削除対象のキーをまず検索し、見つかった場合にその値を削除する。削除後の管理(例: チェイン法の場合はリストから削除、オープンアドレス法の場合は削除済みのマークをつける)はデータ構造に依存するが、時間は大きく変わらない。
問題
有限個の非負整数値を格納し、与えられた値の検索(search)と、挿入(insert)、削除(delete)の操作をもつデータ構造を辞書データ構造と呼ぶ。 辞書データ構造を一つ取り上げ、計算時間とメモリ量の観点から説明せよ。
解説
辞書データ構造の典型的な例として、ハッシュテーブルを取り上げる。
ハッシュテーブルの概要:ハッシュテーブルは、キーと値のペアを効率的に格納し、検索、挿入、削除といった操作を高速に行うことができるデータ構造である。キーをハッシュ関数を用いてハッシュ値に変換し、そのハッシュ値に対応する位置に値を格納することで、これらの操作を行う。
操作の計算時間:
メモリ量:ハッシュテーブルのメモリ量は、格納するデータの数 \(n\) に比例する。さらに、ハッシュテーブルのサイズ(バケット数)が必要となり、メモリ消費は \(O(n)\) である。また、ハッシュテーブルは適切な負荷率(バケット数に対する要素数の比率)を維持するため、一定のメモリオーバーヘッドが存在する。この負荷率が高すぎると衝突が増え、操作の計算時間が悪化するため、負荷率を管理するためのメモリが必要である。