13_標準アルゴリズム(線形探索・最大値・最小値)

はじめに

本資料で扱う擬似言語では、配列の要素番号は 1から始まる ものとします(1番目の要素は data[1])。

これまで学んだ「変数・繰り返し・条件分岐・配列」を組み合わせると、実務で頻出する標準的な処理(アルゴリズム)を実現できます。

この資料では、最も基本的な以下の処理を取り上げます。


線形探索(ある値を探す)

配列の中に「特定の値」が存在するかを確認する処理です。配列の要素を順に調べていき、条件に合う値が見つかれば終了します。これは「リニアサーチ(線形探索)」と呼ばれる基本的な検索方法です。


関数linear_searchは、要素数5の整数型配列の中に、指定した値(key)が含まれているかどうかを調べる。

○ 論理型: linear_search(整数型の配列: array, 整数型: key)
    整数型: i
    論理型: found ← false

    for ( i を 1 から array の要素数 まで 1 ずつ増やす )
    if ( array[i] が key と等しい )
            found ← true
        endif
    endfor

    return found
呼び出し例:
論理型: result ← linear_search({4, 7, 1, 5, 9}, 5)

この場合、5 は配列内に含まれるため、result には true が返されます。


最大値の探索

配列の中から「最も大きな値(最大値)」を見つける処理です。最初の要素を仮の最大値とし、それより大きい値が見つかれば更新していきます。


関数find_maxは、要素数5の配列から最大値を見つけて返す。

○ 整数型: find_max(整数型の配列: scores)
    整数型: i, max ← scores[1]

    for ( i を 2 から scores の要素数 まで 1 ずつ増やす )
    if ( scores[i] が max より大きい )
            max ← scores[i]
        endif
    endfor

    return max
呼び出し例:
整数型: result ← find_max({20, 55, 18, 72, 39})

この場合、最大値は 72 のため、result には 72 が返されます。


最小値の探索

最大値と同様に、配列の中から「最も小さな値(最小値)」を探す処理です。

関数find_minは、与えられた配列の中から最小値を探し、その値を返す。

○ 整数型: find_min(整数型の配列: values)
    整数型: i, min ← values[1]

    for ( i を 2 から values の要素数 まで 1 ずつ増やす )
    if ( values[i] が min より小さい )
            min ← values[i]
        endif
    endfor

        return min
呼び出し例:
整数型: result ← find_min({12, 4, 9, 6, 15})

この場合、最小値は 4 のため、result には 4 が返されます。


[理解度チェック]

問題1:

次の関数を呼び出したとき、変数 result に格納される値として正しいものを選びなさい。

○ 論理型: linear_search(整数型の配列: array, 整数型: key)
    整数型: i
    論理型: found ← false

    for ( i を 1 から array の要素数 まで 1 ずつ増やす )
    if ( array[i] が key と等しい )
            found ← true
        endif
    endfor

    return found
論理型: result
result ← linear_search({3, 6, 9, 12, 15}, 10)
正解と解説 正解:**イ** 10 は配列内に存在しないため、found は true にならず false が返されます。

問題2:

次の関数を呼び出したとき、変数 result に格納される値として正しいものを選びなさい。

○ 整数型: find_max(整数型の配列: scores)
    整数型: i, max ← scores[1]

    for ( i を 2 から scores の要素数 まで 1 ずつ増やす )
    if ( scores[i] が max より大きい )
            max ← scores[i]
        endif
    endfor

    return max
整数型: result
result ← find_max({18, 24, 21, 30, 27})
正解と解説 正解:**ウ** 最大値は 30 なので、それが返されます。

問題3:

関数find_minは、与えられた配列の中から最小値を求めて返す。 空欄に入るものを選びなさい。

○ 整数型: find_min(整数型の配列: scores)
    整数型の配列: data ← {8, 6, 5, 9, 7}
    整数型: i, min ← __空欄a__

    for ( i を 2 から data の要素数 まで 1 ずつ増やす )
        if ( data[i] が min より小さい )
            min ← data[i]
        endif
    endfor
    return min
正解と解説 正解:**イ** 最初の要素で初期化し、以降の値と比較するのが定石です。

問題4:

関数linear_searchは、配列aと値keyを受け取り、aの中にkeyが含まれるかどうかを判定する。見つかればtrue、見つからない場合はfalseを返す。 空欄に入るものを選びなさい。

○ 論理型: linear_search(整数型の配列: a, 整数型: key)
    整数型: i
    論理型: found ← false

    for ( i を 1 から a の要素数 まで 1 ずつ増やす )
        if ( a[i] が key と等しい )
            __空欄b__
        endif
    endfor

    return found
正解と解説 正解:**ア** 見つかったことを記録するには、found ← true の処理が必要です。

問題5:

関数linear_searchidxは、配列aと値keyを受け取り、aの中の最初に見つかったkeyの位置の要素番号を返す。見つからない場合は-1を返す。 空欄に入るものを選びなさい。

○ 整数型: linear_searchidx(整数型の配列: a, 整数型: key)
    整数型: i
    for ( i を 1 から a の要素数 まで 1 ずつ増やす )
        if ( a[i] が key と等しい )
            __空欄b__
        endif
    endfor
    return -1
正解と解説 正解:**エ** return文に達すると、以降の処理を行わず関数の呼び出し元へ値を返します。
---