問題 #8 ・ 計算量 ・ 難易度 4
次の関数 matrixSearch は、n 行 m 列の二次元配列 A から値 target を探索する。配列 A は各行が昇順に整列済みであり、かつ各列も昇順に整列済みである。この関数の最悪時の時間計算量を n と m で表したものとして正しいものはどれか。ここで、配列の要素番号は 1 から始まる。
○論理型: matrixSearch(整数型の二次元配列: A, 整数型: n, 整数型: m, 整数型: target)整数型: row ← 1整数型: col ← mwhile (row ≦ n and col ≧ 1)if (A[row, col] = target)return trueelseif (A[row, col] < target)row ← row + 1elsecol ← col - 1endifendwhilereturn false
この関数は、n 行 m 列の整列済み二次元配列の右上隅(row=1, col=m)から探索を開始する「階段探索」と呼ばれるアルゴリズムである。 【動作の仕組み】 ・A[row, col] = target ならば探索成功で true を返す。 ・A[row, col] < target ならば、現在の行には target より大きい値しかないため、行を 1 つ下に進める(row ← row + 1)。 ・A[row, col] > target ならば、現在の列には target より小さい値しかないため、列を 1 つ左に進める(col ← col - 1)。 【計算量の導出】 while ループの各繰返しでは、row が 1 増えるか col が 1 減るかのいずれかが必ず起こる(target が見つかった場合は即座に return する)。row は 1 から始まり最大で n+1 になるまで増加でき(最大 n 回)、col は m から始まり最小で 0 になるまで減少できる(最大 m 回)。したがって、ループの実行回数は高々 n + m 回であり、各繰返しの処理は定数時間 O(1) であるから、全体の最悪時の時間計算量は O(n + m) である。 【具体例によるトレース】 3 行 4 列の配列 A = {{1,3,5,7},{2,4,6,8},{3,5,7,9}} で target=0(存在しない値)を探す場合: row=1, col=4: A[1,4]=7 > 0 → col=3 row=1, col=3: A[1,3]=5 > 0 → col=2 row=1, col=2: A[1,2]=3 > 0 → col=1 row=1, col=1: A[1,1]=1 > 0 → col=0 col < 1 でループ終了 → false を返す(4 回) target=9.5 を探す場合: row=1, col=4: 7 < 9.5 → row=2 row=2, col=4: 8 < 9.5 → row=3 row=3, col=4: 9 < 9.5 → row=4 row > 3 でループ終了 → false を返す(3 回) ジグザグに進む最悪ケース(target=4.5): row=1, col=4: 7 > 4.5 → col=3 row=1, col=3: 5 > 4.5 → col=2 row=1, col=2: 3 < 4.5 → row=2 row=2, col=2: 4 < 4.5 → row=3 row=3, col=2: 5 > 4.5 → col=1 row=3, col=1: 3 < 4.5 → row=4 ループ終了(6 回 = n + m = 3 + 4 - 1)
登録すると解いた結果が残り、間違えた問題は日をおいて復習に出ます。
この問題は AI が作り、別の AI に解かせて検証し、人が確認したうえで公開しています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。
記号の意味に迷ったら擬似言語の記法で確かめられます。