アルゴリズムと計算量:解説つき練習問題

ヒントと解説つきの無料のアルゴリズムと計算量選択式練習問題。3 つのレベル:重要な用語と事実, 概念の応用, 事例と分析。

無料の練習問題やさしい

n が大きいとき、最も速く増加する計算量クラスはどれですか?

次の問題 →

練習する内容

  1. やさしい重要な用語と事実
  2. ふつう概念の応用
  3. むずかしい事例と分析

アルゴリズムと計算量をゼロから学ぶ

1計算量が測るもの

アルゴリズムは、問題を解く、正確な手順の有限なリストです。たとえばリストの並べ替えや、電話帳から名前を探すことなどです。

2 つのアルゴリズムが同じ問題を解いても、かかる時間が大きく違うことがあります。計算量は、入力が大きくなると仕事の量がどのように増えるかを表します。

入力の大きさを n と呼びます:並べ替える項目の数、リストの長さ、グラフの節点の数などです。

1000 ページの電話帳から名前を探す場合を考えましょう。すべてのページを読むと、最大 1000 ステップかかります。真ん中を開いて毎回半分にしていくと、約 10 ステップですみます。

時間計算量はステップ数を数えます。空間計算量は追加のメモリを数えます。どちらも n の関数として書きます。

通常は最悪の場合、つまり大きさ n のすべての入力のうち最も仕事が多い場合を見ます。ときには、平均の場合や最良の場合が問われることもあります。

セルフチェック 仕事量が n² のように増えるアルゴリズムは、n = 1000 のとき 1 秒かかる。n = 2000 のとき、およそどれだけの時間がかかるか。
  1. 1 秒
  2. 2 秒
  3. 4 秒
  4. 8 秒

答え: 4 秒. n を 2 倍にすると n² は 2² = 4 倍になるので、時間は約 1 秒から約 4 秒になります。2 秒は線形に増える場合の答え、8 秒は n³ の場合です。

2ビッグオーと増加の階級

ビッグオー記法は、大きな n で重要なものだけを残します。定数倍を捨て、最も速く増える項だけを残します。

3n² + 5n + 2 ⇒ O(n²)

n = 1000 のとき、n² の項は 3 000 000 ですが、5n は 5000 にすぎません。小さい項は合計をほとんど変えません。

次の階級が何度も出てきます。増加が遅いものから速いものの順です:

  • O(1)(定数):添字で配列の要素を読む。
  • O(log n)(対数):二分探索。毎回、問題を半分にします。
  • O(n)(線形):すべての項目を 1 回走査する。たとえば最大値を見つける。
  • O(n log n):マージソートのような優れた並べ替えアルゴリズム。
  • O(n²)(2 次):項目に対する二重ループ。たとえばバブルソート。
  • O(2ⁿ)(指数):すべての部分集合を試す。すぐに実用にならなくなります。
ntlog nnn log nn²2ⁿ

ビッグオーは上界です:仕事量は多くともこの速さでしか増えません。Ω(ビッグオメガ)は下界、Θ(シータ)は上界であり下界でもある厳密な界です。

ビッグオーでは、対数の底は関係ありません。底が異なる対数は、定数倍しか違わないからです。

セルフチェック 4n + 2n² + 100 のビッグオーは何か。
  1. O(100)
  2. O(2n²)
  3. O(n)
  4. O(n²)

答え: O(n²). n が大きいと n² の項が支配的になり、定数倍の 2 は捨てられます。O(n) は誤った項を残しており、O(2n²) は定数を捨て忘れています。

3探索、整列、再帰

ほとんどすべての講義に出てくるアルゴリズムがいくつかあります。その計算量は事実として覚えましょう。

  • 線形探索は項目を 1 つずつ調べます:O(n)。二分探索は整列済みの配列が必要で、毎回範囲を半分にします:O(log n)。
  • バブルソート、挿入ソート、選択ソートは、二重ループで項目を比較して入れ替えます:O(n²)。挿入ソートは、すでに整列済みの配列では O(n) です。
  • マージソートは配列を半分に分け、それぞれを整列して併合します:どの場合でも O(n log n) で、追加メモリは O(n) です。
  • クイックソートはピボットを中心に分けます:平均では O(n log n) ですが、最悪の場合は O(n²) です。たとえば、整列済みの配列で先頭要素をピボットにした場合です。
  • 項目を比較するだけの整列では、最悪の場合に Ω(n log n) より速くはできません。計数ソートは比較をしないので、それより速くなります。

再帰関数は、より小さい入力で自分自身を呼び出し、直接答えられる基底ケースに達するまで続けます。その実行時間は漸化式で書きます:

  • T(n) = T(n/2) + O(1) は、二分探索と同じく O(log n) になります。
  • T(n) = 2T(n/2) + O(n) は、マージソートと同じく O(n log n) になります。
  • T(n) = T(n − 1) + O(n) は O(n²) になります。
  • T(n) = 2T(n − 1) + O(1) は O(2ⁿ) になります。

知っておくべき設計の考え方が 3 つあります。分割統治法は、分割し、解き、併合します。貪欲法は、各ステップで局所的に最良の選択をします。動的計画法は、重なり合う部分問題の答えを記憶し、1 回だけ計算します。

セルフチェック クイックソートの最悪の場合の時間計算量はいくらか。
  1. O(log n)
  2. O(n log n)
  3. O(n)
  4. O(n²)

答え: O(n²). ピボットが悪いと、毎回の分割で片側に n − 1 個の項目が残り、O(n²) になります。O(n log n) は平均の場合で、マージソートの最悪の場合でもあります。

4ステップごとの方法

コードの時間計算量を求めるには:

  1. n が何かを決めます:入力の大きさです。
  2. 各ループが何回実行されるかを数えます。毎回 1 ずつ増えるループは約 n 回実行されます。2 倍にする、または半分にするループは約 log₂ n 回実行されます。
  3. 入れ子になったループは掛け算になります。順に続くループは足し算になります。
  4. 再帰関数では、漸化式を書きます:何回の呼び出しが、どの大きさで行われるか、さらに 1 回の呼び出しあたりの仕事量です。
  5. 最も速く増える項を残し、定数を捨てます。
  6. 小さな数で確認します。たとえば n = 8 や n = 1024 です。

理論の問題では、まずそれが述べているアルゴリズムや考え方の名前を挙げ、次にその計算量と条件(整列済みの入力、非負の重み、重なり合う部分問題)を思い出します。

5例題

すべてのステップをたどりましょう。開く前に次のステップを予想してみましょう。

例題

このコードの時間計算量はいくらか。for i = 1 to n: (j = 1; while j < n: j = j × 2)

1

入力の大きさを決める

n は、ループが数え上げる最大の数です。

2

外側のループを数える

i は 1 から n まで 1 ずつ増えるので、外側のループは n 回実行されます。

3

内側のループを数える

j は 1、2、4、8、… という値をとり、n に達すると止まります。k 回の後は j = 2k なので、ループは約 log₂ n 回で止まります。

4

ループを組み合わせる

内側のループは外側のループの中にあるので、回数は掛け算になります。

n · log₂ n ⇒ O(n log n)
5

数で確認する

n = 1024 のとき、内側のループは log₂ 1024 = 10 回実行されるので、本体は 1024 · 10 = 10 240 回実行されます。これは n² = 1 048 576 よりずっと少ない回数です。

答え

O(n log n)

6よくある間違い

  • 順に続くループを掛け算してしまう。n + n = 2n でも O(n) のままです。
  • O(2n) や O(n/2) のように、定数を残す。どちらも O(n) です。
  • 倍々になるループを n 回と数える。実際には約 log₂ n 回実行されます。
  • 整列されていないデータや、中央に 1 ステップで到達できない連結リストで、二分探索を使う。
  • 最悪の場合を問われているのに、クイックソートの平均の場合を答える。
  • ビッグオーが「ちょうど」を意味すると考える。O(n²) は上界で、Θ(n²) が正確な増加の仕方です。
セルフチェック ある関数が n 回の反復をするループを実行し、その後、別に n 回の反復をする別のループを実行する。その時間計算量はいくらか。
  1. O(2n)
  2. O(log n)
  3. O(n)
  4. O(n²)

答え: O(n). 順に続くループは足し算になります:n + n = 2n で、定数は捨てられるので O(n) です。O(n²) が正しいのは、一方のループがもう一方の中にある場合だけです。

7試験問題の例

  • やさしい:用語と事実。二分探索、マージソート、配列アクセスの計算量、O、Ω、Θ の意味、再帰とは何か。
  • ふつう:概念の応用。コード片の計算量、解くべき漸化式、n が 2 倍になったときの時間の変化、課題に合うアルゴリズム。
  • むずかしい:事例と分析。マスター定理、クイックソートの最悪の場合、貪欲法と動的計画法の比較、クラス P、NP、NP 完全。

P には、多項式時間で解ける問題が含まれます。NP には、解を多項式時間で検証できる問題が含まれます。P の問題はすべて NP にも含まれます。P = NP かどうかは、まだわかっていません。

アプリでステップごとに学ぶアプリでステップごとに学ぶ

例題

例題 1やさしい

増加の上界(upper bound)を表す記法はどれですか?

  1. ABig Omega
  2. BLittle omega
  3. CBig O
  4. DBig Theta
ヒントを表示
  1. 「高々」です。
  2. 誤答を 2 つ消しました。残りの 2 つのうち 1 つが正解です。
答えと解説を表示

これが答えになる理由

O は上界、Ω は下界、Θ はタイトな上下界(tight bound)を表します。

答え

C · Big O
例題 2ふつう

ソート済み配列で、両端から 1 つずつポインタを内側へ動かして、和が目標値になる 2 つの要素を探します。時間計算量は何ですか?

  1. AO(n)
  2. BO(n log n)
  3. CO(n²)
  4. DO(log n)
ヒントを表示
  1. 各ステップで、どちらか一方のポインタを 1 つ動かします。
  2. 誤答を 2 つ消しました。残りの 2 つのうち 1 つが正解です。
答えと解説を表示

これが答えになる理由

和が小さすぎれば左のポインタを右へ、大きすぎれば右のポインタを左へ動かすので、ステップは高々 n 回です。

答え

A · O(n)
例題 3むずかしい

シュトラッセンのアルゴリズムは、半分のサイズのブロックの再帰的な掛け算を 8 回ではなく 7 回にして行列を掛けます。実行時間は何ですか?

  1. AΘ(n² log n)
  2. BΘ(n2)
  3. CΘ(n³)
  4. DΘ(nlog₂ 7)、約 n2.81
ヒントを表示
  1. 漸化式は T(n) = 7T(n/2) + O(n²) です。
  2. 誤答を 2 つ消しました。残りの 2 つのうち 1 つが正解です。
答えと解説を表示

これが答えになる理由

a = 7、b = 2 で、nlog₂ 7 が O(n²) の加算の作業量より支配的なので、約 n2.81 になります。

答え

D · Θ(nlog₂ 7)、約 n2.81

質問と回答

アルゴリズムと計算量とは?

2 つのアルゴリズムが同じ問題を解いても、かかる時間が大きく違うことがあります。計算量は、入力が大きくなると仕事の量がどのように増えるかを表します。

入力の大きさを n と呼びます:並べ替える項目の数、リストの長さ、グラフの節点の数などです。

アルゴリズムと計算量はどう順を追って学ぶ?
  1. 計算量が測るもの
  2. ビッグオーと増加の階級
  3. 探索、整列、再帰
  4. ステップごとの方法
  5. 例題
  6. よくある間違い
  7. 試験問題の例
アルゴリズムと計算量の練習では何を学ぶ?
  • やさしい: 重要な用語と事実
  • ふつう: 概念の応用
  • むずかしい: 事例と分析

どの問題にも選択肢が 4 つあり、正解は 1 つだけです。 行き詰まったら、まず小さなヒントを開き、必要なときだけ詳しい解説を見ましょう。

練習のしかた

  • どの問題にも選択肢が 4 つあり、正解は 1 つだけです。
  • 行き詰まったら、まず小さなヒントを開き、必要なときだけ詳しい解説を見ましょう。
  • 進捗、間違えた問題、保存した問題は記録されるので、試験前に復習できます。

このトピックの前後のトピック

次に学ぶ

このトピックを含む科目

コンピュータサイエンスのほかのトピック

印刷用ワークシート