重要アルゴリズム解説
共通テスト「情報Ⅰ」第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
- Nums[0] から順に target と比較する。
- 最初に見つけた位置だけを pos に記録する。
- 見つからなかった場合は pos が -1 のままになる。
2 二分探索
整列済みの配列に対して、中央を調べながら探索範囲を半分にします。
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
- 中央 mid を調べる。
- target が中央より大きければ左側を捨てる。
- target が中央より小さければ右側を捨てる。
3 交換法
隣り合う値を比較し、順序が逆なら交換します。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
- 隣の2つを比較する。
- 左が大きければ交換する。
- 1回の外側ループで、右端から順に値が確定する。
4 選択法
未整列部分から最小値の位置を探し、先頭側と交換します。
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パスの最後に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 に近い値
- 正方形の中にランダムな点を打つ。
- 円の中に入った点を数える。
- 命中割合から円周率などを近似する。
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]
- 最初の人は到着したらすぐ開始する。
- 2人目以降は、到着時刻と前の終了時刻を比べる。
- 遅い方が開始時刻になる。
7 運動シミュレーション
位置や速度を、決められた順番で繰り返し更新します。更新順が結果に影響します。
x = 0 v = 4 t = 0 x < 10 の間繰り返す: |x = x + v |v = v - 1 ⎿ t = t + 1 表示する(x, v, t)
実行結果:10 / 0 / 4
- 位置 x を速度 v だけ進める。
- 速度 v を変化させる。
- 終了条件を満たすまで、同じ順番で更新する。