2016-10-27 3 views
0

Ich habe dieses Stück Code in C geschrieben, die zu lange dauert. Gibt es eine Möglichkeit, es zu verbessern? Was ich tun möchte, ist die Summe der Werte jeder Zeile und speichern Sie den Wert in einem Vektor. In diesem Code ist i1 der Wert, der die Zeilenpositionen einer Matrix, die Spalten und den zugehörigen Wert enthält. i1 ist nicht sortiert.Verbessern von Code in c (Sparse-Matrix-Darstellung)

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; 
} 

Jede Idee oder Vorschlag wird sehr geschätzt. Vielen Dank.

+5

Stack-Überlauf ist spezialisiert auf nicht-Code arbeiten. Wenn Sie alle sechs Fragen im [Code Review On-Topic Check] (http://codereview.stackexchange.com/help/on-topic) mit "Ja" beantworten können, können Sie nach [codereview.se] fragen. . – usr2564301

+0

Die Rechenkomplexität des von Ihnen geposteten Codes ist 'O (N^2) '. Ich kann nicht sehen, wie es verbessert werden kann, ohne die Struktur der in der Matrix enthaltenen Daten zu kennen. Die Strategie zur Verbesserung der rechnerischen Komplexität wird stark von den Annahmen abhängen, die man bezüglich des Inhalts der Matrix treffen kann. –

Antwort

1

Als b = a + const, können Sie einfach diag[i1[c][0] + const] += i1[c][2] verwenden und die Komplexität von O (N) bis O (N) reduzieren.

0

Wenn a und i1[c][0] Integer-Typen sind, können Sie Ihre verschachtelten Schleifen in eine einzige Schleife ändern:

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;