2012-04-04 15 views
0

私はサイズが2^N(N = 25)の4つの配列を持っています。配列の要素は私のアルゴリズムによって生成されています。これらはソートされていますが、数字を含みます。ここで、array1の各要素をとり、array2、array3、array4の要素を選択する必要があります。これらの合計が最小になるようにしなければなりません(a1 [k] + -a2 [j] + - a3 [m] + -A4 [T]。 私は問題をマージK外形寸法に似ていると思います。文学/実装/ヒューリスティックためにいくつかの一点にできるのと同じを行うため。 よろしく、 Allahbakshについては配列の3つ以上の最も近い数字

+0

1.例が非常に役に立ちます。 2.±記号を使用できます。 –

+1

あなたが言葉で求めていることは簡単です - array1の要素にかかわらず、array2,3,4の最小要素を取ると、合計も最小になります。しかし、あなたは何か違うことを知りたいと思う。 –

答えて

0

ステップ1 配列1 [k]は、配列2又はARRAY3の数値を見つけるか、その弾性率が[k]を配列1に近くなるようarray4。

eg . 
array1 = {1, 3, 67} 
array2 = {-31, 7, 47} 
array3 = {-1, 2, 10} 
array4 = {14, 15, 66} 

For array1[0] (ie. 1), the number closest to it is in array3 and its -1 as mod(-1) = 1 

ステップ2 残りの2つの配列のうち、お互いに近い数のペアを見つけます。全4つのアレイから

eg . 
array2 = {-31, 7, 47} 
array4 = {14, 15, 66} 

Closest elements are 7 and 14 with -7 + 14 = 7. 

は、最終的にあなたが分(A4 [T] - - A3 [M] + A1 [K] + -a2 [J] +)を取得する(再度係数を考慮する)。

+1

したがって、array1から1の場合、1 - 1 - 7 + 14 = 7?しかし、あなたはもっとうまくいくでしょう:1 + 7 + 10-14 = 4. – Henrik

+0

これは解を指数関数的に爆破します。私はこれを行うブルートフォースの方法はforループに入れることだと思います。 Nが増加するにつれて巨大な計算力を必要とする4つのアレイのための4つのループ。 KDMマージの発見的アルゴリズムはありますか? –

+0

@Henrick:良いキャッチ。私はアプローチを再訪する必要があります。 –

0

この問題はO(n)で解決できると思います。すべての配列を結合セットにマージして、2番目の値が配列番号になるようにしてください。それを反復し、各反復形式で4つの値から答えを出し、各ステップで、選択された数の間の最大距離を計算する - >この値を最小にする。
各配列から最小の数字を持つ初期結果配列。

public Integer[] findClosest(int[][] unionSet, Integer[] result) { 

    for (int i = 0; i < unionSet.length; i++) { 
     int value = unionSet[i][0]; 
     int position = unionSet[i][1]; 
     int currentDistance = getDistance(result); 
     Integer[] temp = Arrays.copyOf(result, result.length); 
     temp[position] = value; 
     int newDistance = getDistance(temp); 
     if (newDistance <= currentDistance) { 
      result = temp; 
     } 
    } 
    return result; 
} 

private int getDistance(Integer[] result) { 
    int max = 0; 
    int min = 0; 
    for (int i = 1; i < result.length; i++) { 
     if (result[i] != null) { 
      if (result[i] > result[max]) { 
       max = i; 
      } 
      if (result[min] != null && result[i] < result[min]) { 
       min = i; 
      } 
     } 
    } 

    return Math.abs(result[max] - result[min]); 
} 
関連する問題