同じ問題が、Robert Sedgewick と Kevin Wayne による本 Algorithms の Web バージョンで言及されています。(「創造的な問題」セクション、問題 19 を参照) .
そのリンクで著者によって与えられた問題のヒントは次のとおりです。
行 N/2 で最小値を見つけ、列の隣接 p と q をチェックします。p または q が小さい場合は、その半分で繰り返します。
より良いアプローチは次のとおりです。行N/2で最小値を見つけ、その列のすべてのエントリをチェックし、列のエントリが小さい場合は、小さい列のエントリが属する行で繰り返します。
例えば。以下の配列では、N=5:
1 12 3 1 -23
7 9 8 5 6
4 5 6 -1 77
7 0 35 -2 -4
6 83 1 7 -6
ステップ 1: 中段は [ 4 5 6 -1 77
] です。すなわち。行番号 3。
ステップ 2: 現在の行の最小エントリは です-1
。
ステップ 3: 最小エントリ (つまり-1
) の列近傍は5
と-2
です。-2
最小の隣人です。4行目にあります。
local minが得られるまで、手順 2 ~ 3 を続けます。
編集:
たとえば、@anuja からのコメントで言及されています
(主な問題は n 行 n 列の配列です。この入力は 3 行 4 列の配列ですが、それで作業できます)。
1 2 3 4
5 1 6 -1
7 3 4 -2
ステップ 1: 真ん中の行は[5 1 6 -1]
です。すなわち。行番号 2。

ステップ 2: 現在の行の最小エントリは です-1
。

ステップ 3: 最小エントリ (つまり-1
) の列近傍は4
と-2
です。
-2
最小列隣接です。3列目です。

ステップ 2 への反復: -2 は、その行で最小であり、隣接する列の中で最小です。したがって、極小値の出力として -2 で終了します。
