2016-11-10 14 views
1

私は可能なすべての値の合計を含む2次元配列を生成するアルゴリズムを持っています。たとえば、配列[1,5,8,4,5]の場合、2D配列sums[1][3]は、元の配列(17)のインデックス1-3の合計を返す必要があります。大きなOに関して、効率はO(N )と考えています。このアルゴリズムをより効率的にする方法はありますか?このアルゴリズムをより効率的にするにはどうすればよいですか?

public static int[][] sum(int[] values){ 
    int[][] sums = new int[values.length][values.length]; 
    for(int x = 0; x < values.length; x++){ 
     int total = 0; 
     for(int y = x; y < values.length; y++) { 
      total += values[y]; 
      sums[x][y] = total; 
     } 
    } 
    return sums; 
} 
+3

'N^2'サイズの表を入力する必要があります。あなたは 'O(N^2)未満でこれをどうやってやることができますか? ' –

+0

似たような質問です。 O(nlog(n))で行うことができます。 http://stackoverflow.com/a/37907843/3160529 – Shubham

+0

これはまさに私が不思議に思っていたものです。私の講義スライドの質問です。私はそれを理解しようとしています。 –

答えて

4

あなたは接頭和アレーでO(n)時間と空間でこれを解決することができます。

array = [1, 5, 8, 4, 5] 
prefixes = [1, 6,14,18,23] 

sums(1,3) = prefixes[3] - prefixes[0] = 18 - 1 = 17 
+0

これは決して質問に答えるものではありません。 'sums(1,3)=配列[1] +配列[3]'です。だからポイントは何ですか?減算によって加算を置き換えました。そして、それは2D配列を満たしていません。 @EugeneSh。 –

+0

ご意見ありがとうございます。 'array [1] + array [3]'は '9'と等しくないのですか?私はOPが 'array [1] + array [2] + array [3]'の総和を返すべきであることをOPが '5 + 8 + 4 = 17'とすることを意味すると思います。私が理解しているように、問題は「このアルゴリズムをより効率的にするにはどうすればいいですか?私の答えはそれを行う一つの方法を示唆していると私は思う。 –

+0

あなたの答えは動作しますが、私の必要とするものではありません。私が探しているのは、 'arr [1] [3]'はインデックス1-3からのすべての値の合計を返すような2つの配列を生成するアルゴリズムです。この答えは、合計を計算する方法を使用します(これはほとんど不可能ですが)。 –

0

計算し、次のようにprefix合計:あなたのクエリを1として

public static int[] sum(int[] values){ 
    int[] prefix_sums = new int[values.length]; 
    prefix_sums[0] = values[0]; 
    for(int x = 1; x < values.length; x++){ 
     prefix_sums[x] = prefix_sums[x-1] + values[x]; 
    } 
    return prefix_sums; 
} 

、インデックスxからインデックスy(0ベースのインデックス作成)までの合計を求めたい場合は、合計を取得する方法です。

if(x==0) 
    result = prefix_sums[y]; 
else 
    result = prefix_sums[y] - prefix_sums[x-1]; 

希望する!

関連する問題