最大値・最小値のフローチャートはどう書く?動かしてわかる比較と更新

8、3、12、5、9を順に比較し、最大値12と最小値3を示す図

複数の数値から最大値や最小値を探すには、すべての値を並べ替える必要はありません。まず1つを候補にして、残りを順番に比べ、条件に合うときだけ候補を入れ替えます。

ただし、「最初の候補は0でよいのか」「同じ値が出たら更新するのか」「比較しなかった先頭の値はどうなるのか」で迷うことがあります。この記事では、フローチャートを動かしながら、今比較している値と、ここまでの候補を分けて確認します。数値の並びを変え、実行結果を予想してみましょう。

最大値・最小値を探す基本は「候補を持って比較する」

たとえば、5日分の問い合わせ件数が「8、3、12、5、9」だったとします。最大の件数を求める手順は次のとおりです。

  1. 先頭の8を、最大値の候補にする。
  2. 次の3は8より小さいので、候補は8のまま。
  3. 12は8より大きいので、候補を12に更新する。
  4. 5も9も12より小さいので、候補を変えない。
  5. すべて確認したら、候補の12が最大値になる。

「候補」は、ここまで調べた中で最も大きい値(または小さい値)を覚えておくためのものです。すべて調べ終えるまでは途中の結果なので、候補と呼びます。教材の図では「候補」と表記します。最小値なら、候補より小さい値が見つかったときに更新します。最大値と最小値で変わるのは、この比較の向きです。

目的 候補を更新する条件 条件を満たさない場合
最大値 今の値 > 候補 候補を変えずに次へ
最小値 今の値 < 候補 候補を変えずに次へ

フローチャートの2つのひし形を読み分ける

図の最初のひし形は「まだ調べる値があるか」を確認します。「いいえ」なら終了です。2つ目は「今の値が候補より大きいか、または小さいか」を確認します。こちらの「いいえ」は終了ではなく、更新を飛ばして次の値へ進むという意味です。

位置を表す i は0から数えます。5個のデータなら位置は0〜4で、値[i] はその位置にある数値です。先頭を候補にした場合、次に比較する位置は1です。図の ← は「右側の値を左側の変数に入れる」という代入を表します。

動かして確認|今の値と候補はどう変わる?

数値はカンマ区切りで1〜8個、-99〜99の整数を入力できます。「探す値」で最大値・最小値を切り替え、終了時の候補を予想してから実行してください。青枠は現在の比較位置や実行箇所、緑色の記録行は候補を更新した処理です。入力を変えると実行状態はリセットされます。

通常は初期値を「先頭の値」にします。「0から始める(結果が正しくない場合あり)」では、候補を0にして、先頭からすべての値を比較します。たとえば「-8、-3、-12」の最大値は-3ですが、どの値も0より大きくないため、候補が0のまま終了します。初期値によって結果がどう変わるかを確認するための設定です。初期化は、教材に表示する「候補の更新回数」には含めません。

    位置 i—
    比較する値—
    最大値の候補—

    開始前です。

    はいいいえはいいいえ戻る 開始 候補 ← 先頭の値i ← 1 i < 5? 値[i] > 候補? 候補 ← 値[i] i ← i + 1 終了

    比較と更新の記録

    処理i値候補

    予想して確認

    現在の設定の解答・解説

    なぜ初期値を0にすると間違うことがあるのか

    すべて負の数の最大値

    「-8、-3、-12」の最大値は-3です。しかし候補を0にすると、どの値も0より大きくないため、更新されず0のまま終了します。データに存在しない0が答えになってしまうのです。

    先頭の-8を候補にすれば、-3との比較で更新されます。-12は-3より小さいので更新されず、正しい最大値-3が残ります。「0より大きいものを探す」のではなく、「今までに調べたものの中で一番大きいものを残す」と考えるのがポイントです。

    すべて正の数の最小値

    「8、3、12」の最小値は3です。ここでも初期値0は適切ではありません。0より小さい値がないため、候補は0のままです。先頭の8から始めると3で更新され、12では更新されません。

    数値の範囲が保証される場合には、その範囲の下限・上限などから始める設計もあります。ただし、条件が変わると成立しないことがあります。空でないデータなら、実際の先頭の値を初期値にする方法は、正負に左右されず使えます。

    同じ値があるときは更新しなくてよい?

    「4、9、2、9」の最大値を探す場合、最初の9で候補が9になります。最後の9は候補と同じなので、9 > 9 は偽です。候補を更新しなくても、最大値は正しく9のままです。

    最大の値だけが欲しいなら、同じ値で更新する必要はありません。一方、「最大値がある位置」も記録するなら、同値の扱いが結果に影響します。位置も同時に更新する実装では、>なら最初に出た位置、>=なら最後に出た位置を残せます。今回の教材は値だけを求めるため、厳密な大小比較を使っています。

    データが1つ、または0個の場合

    データが「7」だけなら、先頭の7を候補にした時点で答えが決まります。比較する残りの値がないので、値同士の比較は0回です。ただし、残りがあるかを確認するひし形は通ります。

    データが0個なら、先頭の値を読むことも最大値・最小値を返すこともできません。「データなし」として扱う、入力を促すなど、通常の数値結果とは別の扱いが必要です。この教材では空欄での実行を止め、入力を求めます。空のデータの答えを便宜的に0とすることはしません。

    練習問題5問|答えと、候補が変わる場面を予想する

    上の「練習問題」から同じ設定を選べます。問題2・3は、正しい最大値・最小値ではなく、誤った初期値の設定でプログラムが実際に返す候補も考えてください。

    問題1:8、3、12、5、9の最大値

    初期値は先頭の値です。終了時の候補と、候補を更新する回数は?

    解答・解説

    候補は12、候補の更新は1回です。先頭の8を初期値とし、残り4個を比較します。12のときだけ更新されます。

    問題2:-8、-3、-12の最大値を、0から探す

    初期値を0にします。終了時の候補と、本当の最大値は一致しますか?

    解答・解説

    候補は0、本当の最大値は-3なので一致しません。どの値も0より大きくなく、更新は0回です。初期値を先頭の値に変更すると-3になります。

    問題3:8、3、12の最小値を、0から探す

    初期値は0です。どの値で候補を更新しますか?

    解答・解説

    一度も更新しません。候補は0ですが、本当の最小値は3です。先頭の8を初期値にすれば、3のときに更新されます。

    問題4:4、9、2、9の最大値

    初期値は先頭の値です。9が2回あるので、候補も2回更新しますか?

    解答・解説

    更新は1回です。最後の9は候補と同じで「より大きい」を満たさないため、そのまま次へ進みます。終了時の候補は9です。

    問題5:7だけの最小値

    初期値は先頭の値です。値の比較は何回必要ですか?

    解答・解説

    0回です。初期化で候補が7になり、残りの値がないことを確認して終了します。候補の更新も0回です。

    並べ替えずに探せる理由と、仕事での使いどころ

    先頭から順番に調べる間、候補には「調べ終わった範囲の最大値・最小値」が残ります。次の値が候補を上回る、または下回る場合だけ更新すれば、この性質は保たれます。最後まで調べ終えたとき、全体の答えが残る仕組みです。

    データがn個で先頭を初期値にするなら、値同士の比較はn-1回です。100個なら99回、1,000個なら999回。データ数に比例して手間が増えるので、時間計算量はO(n)と表します。入力データを除き、候補と位置などを保持する追加領域はO(1)です。なお、この教材は学習用に実行履歴も保存するため、履歴の領域は別途使います。

    この方法は、日別件数の最多日を調べる前段階、測定値の最大・最小、処理時間の最大値などに使えます。ただし「どの日だったか」「同率のものをすべて出したい」なら、値だけでなく日付・位置・該当一覧も保存する設計が必要です。ランキング全体が必要な並べ替えと、最大の1件だけが必要な探索は、目的を分けて考えましょう。

    まとめ|先頭を候補にして、必要なときだけ更新する

    空でないデータから最大値・最小値を求める基本は、先頭を候補にし、残りを順に比較することです。残りの有無を確認する条件と、候補を更新する条件は別です。まずは小さなデータで、比較した値・更新前の候補・更新後の候補を追ってください。負の数、同じ値、1件だけの例を試すと、初期値や比較条件の意味がはっきりします。

    あわせて確認したい記事

    シェアする