2016-10-27 7 views
0

私はこのコードをC言語で書いたので、実行には時間がかかります。それを改善する方法はありますか? 私がしたいのは、各行の値を合計し、その値をベクトルに保存することです。このコードでは、i1は行列の行の位置、列および関連する値を含む値です。 i1はソートされません。c(疎行列表現)のコードを改善する

while(a < 2*var) 
{ 
    for (int c=0; c < 2*var; c++) 
    { 
     if (i1[c][0] == a) 
     { 
      diag[b] += i1[c][2]; 
     } 
    } 
    a = a+1; 
    b = b+1; 
} 

ご意見やご提案は大変ありがとうございます。ありがとうございました。

+5

スタックオーバーフローは、コードを動作していないに特化しています。 [Code Review On-Topic Check](http://codereview.stackexchange.com/help/on-topic)の6つの質問すべてに「はい」と回答することができれば、[codereview.se] 。 – usr2564301

+0

あなたが投稿したコードの計算量は 'O(N^2)'です。私は、マトリックスに含まれるデータの構造を知らなくても、どのように改善できるのか分かりません。計算の複雑さを改善するための戦略は、マトリックスの内容について仮定できることに大きく依存します。 –

答えて

1

b = a + constとして、単純にdiag[i1[c][0] + const] += i1[c][2]を使用し、O(N )からO(N)までの複雑さを減らすことができます。

0

ai1[c][0]が整数型である場合、あなたは、単一のループにあなたのネストされたループを変更することができます。

for (int c = 0; c < 2 * var; c++) { 
    if (i1[c][0] >= a && i1[c][0] < 2 * var) { 
     diag[b + (i1[c][0] - a)] += i1[c][2]; 
    } 
} 
b += 2 * var - a; 
a = 2 * var;