2017-12-22 12 views
2

私は私が私が探しているすべての0 < = I、J < = 1024用a[i&j] += b[i] * c[j]を持っていることを新しい配列aが効率的な検索したい1024未満のサイズを持つ2つの整数配列bcを持っています正規のO(n^2)以外の解。iとjごとに[i&j] + = b [i] * c [j]を効率的に実行するにはどうすればよいですか?

基本的に私はこれを改善したい:

for(int i = 0; i < 1024; ++i){ 
    for(int j = 0; j < 1024; ++j){ 
     a[i&j] += b[i] * c[j]; 
    } 
} 
+0

しかし 'I&同じ値を与えるj'は、あなたが何をすべきかをしたいですか多く、' [0] ==言えば '1' 、b [0] == 1、b [1] == 0( '0&0 == 0'、' 0&1 == 0')である。 'c [0]'は0か1でなければなりませんか? – Phylliida

+1

@Phylliida申し訳ありませんが、私は同じ値をすべて追加します。私はコードで質問を更新しました。 aが初期化されていると仮定します。 –

+0

それはもっと理にかなっていますが、配列の型を保証していますか? (8バイト整数、16バイト整数、32バイト整数、浮動小数点など) – Phylliida

答えて

1

ノー怖いです。可能なすべての組み合わせとijの場合は、b[i]c[j]を追加する必要があるため、すべてを繰り返してください。しかし、少しでも改善することができます。

a[n]を特定したいが、配列全体ではない場合は、より良いアプローチがありますa

int n = 666; // Input 
// Split input into bits 
int e[10] = {}; 
for (int i = 0, ne = 0; i < 10; i++) { 
    if ((n & (1<<i)) == 0) 
     e[ne++] = i; // Store the indices of zero bits of input 
} 

は今入力からb[i]c[j]を作成します。

int i, j; 
// Enumerate all possible combinations of i and j 
for (int count = 0; count < pow(3, ne); count++){ 
    int t = count; 
    i = j = 0; 
    for (int k = 0; k < ne; k++) { 
     switch (t % 3) { 
      case 0: break; 
      case 1: 
       i |= 1 << k; 
       break; 
      case 2: 
       j |= 1 << k; 
       break; 
     } 
     t /= 3; 
    } 
    i |= n, j |= n; 
    a[n] += b[i] * c[j]; 
} 
関連する問題