3

Ich brauche Zweig-Code für die if-Anweisung in der inneren Schleife zu generieren if (i! = J). Ich bin verwirrt, wie man zeilenlosen Code erzeugt.Wie erstellt man für diesen Code verzweigungslosen Code?

for (int i = start; i < n; i++) 
    { 
     results[i] = 999; 
     for (int j = 0; j < n; j++) 
     { 
      if (i != j) 
      { 
       d = myfunction(x, y, i, j); 
       if (d < results[i]) 
        results[i] = d; 
      } 
     } 
    } 

Antwort

3

Ein Vergleich gibt 0 (falsch) oder 1 (wahr) in C++ zurück. So können Sie den innersten Zustand wie folgt konvertieren:

int condition = d < results[i] 
results[i] = d * condition + results[i] * !condition; 

zu überspringen i in der inneren Schleife, fügen Sie einfach ein an das ARG bei i und darüber hinaus:

... 
for (int j = 0; j < n - 1; j++) { 
    d = myfunction(x, y, i, j + (j >= i)); 
    int condition = d < results[i] 
    results[i] = d * condition + results[i] * !condition; 
} 
... 

Eine Alternative mit weniger Vergleiche würde sein, um die innere Schleife in zwei Schleifen geteilt:

for (int j = 0; j < i; j++) { 
    ... 
} 
for (int j = i + i; j < n; j++) { 
    ... 
} 

bearbeiten: Komplexe Inkrement/Loop ersetzt beginnen Mangeln.

P.S.: Eine Optimierungsoption könnte darin bestehen, das Minimum in einer lokalen Variablen zu erstellen und den Ergebnissen [i] nur nach der inneren Schleife zuzuordnen.

+0

Das Programm wird abstürzen, angenommen, ich habe ein Array der Größe = 5, wenn i = 4, j = 4, dann j + = (i == j); mache j = 5, um den Index des Arrays zu überschreiten. –

+0

Wie/warum wird es abstürzen? –

+0

Entschuldigung für späte Bearbeitung –

1

Wenn ich richtig verstehe, müssen Sie auf einem n von n Matrix arbeiten, aber ohne die Werte in einer Diagonale, das heißt:

X O O O 
O X O O 
O O X O 
O O O X 

Sie könnten das Problem durch „Abrollen“ der reframe Matrix wie so:

. O O O 
. . O O O 
. . . O O O 
. . . . O O O 

Dazu j in der inneren Schleife korrigieren könnte:

for (int i = 0; i < n; i++) { 
    // ... 
    for (int j = i + 1; j < i + n; j++) { 
     d = myfunction(x, y, i, j % n); 
     // ... 
    } 
} 
+1

'j% n' ist zweiglos, aber langsam, es sei denn, der Compiler wandelt es in einen Vergleich/cmov anstelle einer tatsächlichen Division um. (Oder wenn "n" eine Kompilierzeitkonstante ist, ist es nicht schlecht.) In der Quelle könnten Sie 'jmod ++; jmod = (jmod == n)? 0: j012; jmod; ' –

+0

@PeterCordes: Übrigens, da j begrenzt ist, können wir einfach' j% n' durch 'jn' ersetzen, um das gleiche Ergebnis zu erhalten: D (Antwort aktualisiert) –

+1

Das macht das Argument nicht negativ für j