IT1-CODE-POCKET

重要アルゴリズム解説

共通テスト「情報Ⅰ」第3問の学習に向けて、学んでおくと理解に役立つアルゴリズムを、覚えるポイント・コード例・実行結果・処理の流れで確認できます。

1 線形探索

先頭から順番に target と比較します。未整列の配列でも使えます。

学習ポイント:添字の増え方、発見時の終了条件、重複がある場合の返り値

暗記事項:「先頭から順に比較」「未整列でも使える」

Nums = [4, 9, 2, 9, 6]
target = 9
pos = -1

i を 0 から 要素数(Nums) - 1 まで 1 ずつ増やしながら繰り返す:
|もし Nums[i] == target かつ pos == -1 ならば:
⎿⎿ pos = i

表示する(pos)
実行結果:1
  1. Nums[0] から順に target と比較する。
  2. 最初に見つけた位置だけを pos に記録する。
  3. 見つからなかった場合は pos が -1 のままになる。
2 二分探索

整列済みの配列に対して、中央を調べながら探索範囲を半分にします。

学習ポイント:low / high / mid の更新、左右どちらを捨てるか、整列済み前提

暗記事項:「整列済みでないと使えない」「中央比較で半分に絞る」

Nums = [2, 5, 8, 11, 14, 20]
target = 14
low = 0
high = 要素数(Nums) - 1
pos = -1

low <= high の間繰り返す:
|mid = (low + high) ÷ 2
|もし Nums[mid] == target ならば:
||pos = mid
||繰り返しを抜ける
|もし Nums[mid] < target ならば:
||low = mid + 1
|そうでなければ:
⎿⎿ high = mid - 1

表示する(pos)
実行結果:4
  1. 中央 mid を調べる。
  2. target が中央より大きければ左側を捨てる。
  3. target が中央より小さければ右側を捨てる。
3 交換法

隣り合う値を比較し、順序が逆なら交換します。1パスごとに大きい値が後ろへ送られます。

学習ポイント:1パスごとにどの端が確定するか、隣接比較、交換回数の追跡

暗記事項:「隣どうしを比較」「大きい値を後ろへ送る」

Nums = [5, 2, 4, 1]
swap = 0

i を 0 から 要素数(Nums) - 2 まで 1 ずつ増やしながら繰り返す:
|j を 0 から 要素数(Nums) - 2 - i まで 1 ずつ増やしながら繰り返す:
||もし Nums[j] > Nums[j + 1] ならば:
|||temp = Nums[j]
|||Nums[j] = Nums[j + 1]
|||Nums[j + 1] = temp
⎿⎿⎿ swap = swap + 1

表示する(Nums, swap)
実行結果:[1, 2, 4, 5] / 5
  1. 隣の2つを比較する。
  2. 左が大きければ交換する。
  3. 1回の外側ループで、右端から順に値が確定する。
4 選択法

未整列部分から最小値の位置を探し、先頭側と交換します。

学習ポイント:未整列部分から最小値を選ぶ流れ、最小値位置の更新、最後に1回交換

暗記事項:「最小値の位置を覚える」「1パスで1個確定」

Nums = [5, 2, 4, 1]

i を 0 から 要素数(Nums) - 2 まで 1 ずつ増やしながら繰り返す:
|min_pos = i
|j を i + 1 から 要素数(Nums) - 1 まで 1 ずつ増やしながら繰り返す:
||もし Nums[j] < Nums[min_pos] ならば:
|⎿⎿ min_pos = j
|temp = Nums[i]
|Nums[i] = Nums[min_pos]
⎿ Nums[min_pos] = temp

表示する(Nums)
実行結果:[1, 2, 4, 5]
  1. 未整列部分の先頭を仮の最小値にする。
  2. 残りを調べて、より小さい値の位置を覚える。
  3. 1パスの最後に1回だけ交換する。
5 モンテカルロ法

乱数を使って試行を繰り返し、条件を満たす割合から値を近似します。

学習ポイント:乱数生成、条件判定、命中数カウント、比率から近似値へ変換

暗記事項:「精密解ではなく近似」「試行回数を増やすと安定」

inside = 0
trial = 1000

i を 1 から trial まで 1 ずつ増やしながら繰り返す:
|x = 0以上1未満の乱数
|y = 0以上1未満の乱数
|もし x × x + y × y <= 1 ならば:
⎿⎿ inside = inside + 1

pi = 4 × inside ÷ trial
表示する(pi)
実行結果例:3.14 に近い値
  1. 正方形の中にランダムな点を打つ。
  2. 円の中に入った点を数える。
  3. 命中割合から円周率などを近似する。
6 待ち行列シミュレーション

到着時刻、開始時刻、終了時刻、待ち時間を順番に更新します。

学習ポイント:到着・開始・終了・待ち時間の列更新、最大値の意味

暗記事項:「開始時刻 = 最大値(到着時刻, 前客終了時刻)」

Arrive = [0, 3, 6, 7]
service = 4
Start = [0, 0, 0, 0]
Finish = [0, 0, 0, 0]

Start[0] = Arrive[0]
Finish[0] = Start[0] + service

i を 1 から 要素数(Arrive) - 1 まで 1 ずつ増やしながら繰り返す:
|Start[i] = 最大値(Arrive[i], Finish[i - 1])
⎿ Finish[i] = Start[i] + service

表示する(Start)
実行結果:[0, 4, 8, 12]
  1. 最初の人は到着したらすぐ開始する。
  2. 2人目以降は、到着時刻と前の終了時刻を比べる。
  3. 遅い方が開始時刻になる。
7 運動シミュレーション

位置や速度を、決められた順番で繰り返し更新します。更新順が結果に影響します。

学習ポイント:変数更新の順序、終了条件、表示タイミング

暗記事項:「更新順が変わると結果も変わる」

x = 0
v = 4
t = 0

x < 10 の間繰り返す:
|x = x + v
|v = v - 1
⎿ t = t + 1

表示する(x, v, t)
実行結果:10 / 0 / 4
  1. 位置 x を速度 v だけ進める。
  2. 速度 v を変化させる。
  3. 終了条件を満たすまで、同じ順番で更新する。