2011-12-08 10 views
2

配列内の任意の2つの数値の合計のすべての組み合わせを調べる必要があります。等しい場合は印刷します。 この問題に対する線形解法は、O(N^2)の複雑さを有する。 ソートしてからバイナリ比較をすることを考えました。複雑さはまだ(NlogN + N)並べ替えられていない配列の値を見つける

私はそれのすべての組み合わせを見つける必要があります。

この問題の線形解法 例:

//Linear search, find all the combinations 
Find(int a[], int Target) 
    { 
     for(i=0; i<arr_size; i++) 
      for(j=0; j<arr_size; j++) 
       if((a[i]+a[j]) == Target) 
        cout<<a[i]<<a[j] 
    } 

さらに複雑さを減らす方法はありますか?

おかげで、あなたが最初にすべての不可能をフィルタリングすることができ 達人

+1

を改善し、 "複雑さはまだ(NlogN + N)である" - O(NlogN)の複雑さの何が問題なの? –

+0

線形解は 'if(i!= j &&(a [i] + a [j])== Target''を持つべきです。ソートそのものが複雑になるのであれば、ソートの仕方がはっきりしません。 – nnnnnn

答えて

0

。これはアレイを通して2回の反復しか必要とせず、セットを劇的に減少させる可能性がある。そうでない場合は、2回の繰り返ししか失われません。

まず、最小の数字を見つけて、すべての値>(目標 - 最小数)を除外します。

0

は少しパフォーマンス

private static void find(int[] a, int target) { 

    for (int i = 0; i < a.length; i++) { 
     if (a[i] == target) { 
      System.out.println("result found"); 
      break; 
     } 
     if (a[i] > target) { 
      break; 
     } 
     for (int j = 0; j < a.length; j++) { 
      if ((i != j && (a[i] + a[j]) == target)) { 
       System.out.println("result found"); 
      } 
     } 
    } 
} 
+0

あなたは、セットのすべての要素が非負であると仮定していますか? –

+0

はい、配列が正の値を持つと仮定します。 –

+0

がネガを許している場合は、上記のアルゴリズムを使用する必要があります。とにかく、それは同じ考えです。 –