2011-08-22 7 views
-6

行列として入力を受け取る(int [] []行列)、行列からすべての極大値を求める方法をJavaで記述してください。極大値は、マトリックス内の隣接するすべての極小値よりも大きい数値です。このメソッドは、見つかったすべてのローカル最大値のリストを返します。行列からすべての極大を見つける

私はこれを行うために、このコードを試してみましたが、このアイデアは、コード

private static List<Integer> findLocal(int[][] matrix) 
{ 

    List<Integer> locals = new ArrayList<Integer>(); 

    for (int i = 0; i < matrix.length; i++) { 
     for (int j = 0; j < matrix[0].length; j++) { 

      if (i < matrix.length - 1 && j < matrix[0].length - 1) { 
       if (matrix[i][j] < matrix[i + 1][j] && matrix[i][j] < matrix[i][j + 1] && matrix[i][j] < matrix[i + 1][j + 1]) { 
        locals.add(i + j); 
       } else { 

       } 

      } 
     } 

    } 

    return locals; 
} 
+1

何を試しましたか?このアルゴリズムのどの部分が難しいと思いますか?私たちはあなたのために何かをコーディングするだけではありません。私たちはここに*助けています*。 – dlev

+2

宿題のような音。これまでに何を試してきましたか、具体的な問題はどこにありますか? – flolo

+0

おそらく、彼はどこから始めるのか、まったく始めるのか分からないでしょうか? – mort

答えて

2

[OK]を正しいかどうかわからない、今あなたのアイデアを上にして来ているようで、それは基本的にあり働くアイデア。

これはちょうど1つの欠陥があります:あなたが見ている近親相姦は間違っています:(i + j) (i-1、j)、(i、j-1)とする。

だから、この点を確認するときには一般的に作業するはずですが、ボーダーを特別に注意しなければなりません。あなたは、その隣のポイントを考慮に入れているときに、-1番目とn + 1番目の列/行がないので、あなたは持っています。あなたがそれを扱う方法は、あなたがそれを扱う方法に依存します:境界が一定の価値を持っているならば、近隣は包囲すべきでしょうか?

+0

+1私は国境の事を忘れてしまった! –

2

あなたは要素が隣国の3よりも小さいかどうかをチェックし

if (matrix[i][j] < matrix[i + 1][j] 
    && matrix[i][j] < matrix[i][j + 1] 
    && matrix[i][j] < matrix[i + 1][j + 1]) { 

を書きます。他の5人の隣人はどうですか?

if (matrix[i][j] < matrix[i + 1][j] 
    && matrix[i][j] < matrix[i+1][j-1] 
    && matrix[i][j] < matrix[i+1][j+1] 
    && matrix[i][j] < matrix[i][j + 1] 
    && matrix[i][j] < matrix[i][j - 1] 
    && matrix[i][j] < matrix[i-1][j-1]) 
    && matrix[i][j] < matrix[i-1][j]) 
    && matrix[i][j] < matrix[i-1][j+1]) { 

これは、要素の直近の8つの近接、つまり直線と対角線をチェックしたいと仮定していることを前提にしています。これがあなたが望むものでない場合に調整してください。

また、ローカルマキシマを見つける必要があります。これは、ローカル最小値を示します。 <>に変更してください。

もう1つは、locals.add(i + j)はあなたの考えをしていないということです。要素(i = 3、j = 4)が極大値の場合は、locals.add(7)と言っています。これは明らかにあなたが望むものではありません。

+0

あなたはムーア近所を取った - 元のポスターが何を望んでいるのかわからない - 私はそれが短い(と私は怠け者である;-)としてフォンノイマンを使用した。 +1私は間違った関係を見なかった – flolo

0

要素の位置を正しく記憶するには、iとjを別々に保存する必要があります。したがって、

List<Integer> locals = new ArrayList<Integer>(); 

は機能しません。

List<Integer[]> locals = new ArrayList<Integer[]>(); 

代わりに使用できます。そして、新たに発見された極大値の位置を追加するために、

Integer[] localMax = {i, j}; 
locals.add(localMax); 
1

を使用し、私はすべての行列 要素のための8つの比較の必要がないと思います。あなたは、2つの余分な配列を取る必要があります。

  1. MATRIX[n+2][n+2]を:それはすべてのINT_MINの(つまり、すべての行列要素はすべて8人の 隣人を持っていること)の余分な 層でyoutは入力行列が含まれています。

  2. Mark[n+2][n+2] = {0}(あなただけマークされていない 入力行列の要素を訪問する必要があります)行列要素が が極小として宣言されている場合、あなたは マーク内のマークは、そのすべての隣人[] [すべき]ベクトル。

そうすることにより、複雑さはありませんが、(N^2)Oをままになります。比較の を最小化する予定です。

関連する問題