0

特に2D配列で何かをしなければならないときは、自分でこれらのコードを書いていることがよくあります。

ループは同じですが、内部の操作が異なり、最も重要なことに、最後のグループの操作は最初のグループに依存します。

私の主な関心事は、n、mの値が大きい場合のより効率的なコードはありますか?

for ( int y = 0 ; y < m ; ++y ) {
  for ( int x = 0 ; x < n ; ++x ) {
    if ( v[x][y] == z ) a = true;
  }
}

for ( int y = 0 ; y < m ; ++y ) {
  for ( int x = 0 ; x < n ; ++x ) {
    if ( a == true ) do_something( v[x][y] );
  }
}

前もって感謝します

4

4 に答える 4

1

あなたがそれを説明する一般的なケースでは、答えはおそらく「いいえ」です-あなたは2番目のルックの操作が完了した最初のループに依存していることを意味するので、あなたはまさにそれをしなければなりません。

ただし、リストした特定のケースでは、2つの簡単な最適化があります。

  1. 最初のループからすばやく失敗します。一度a設定trueすると、それ以上ループする必要はありません。
  2. if ( a == true ) 2番目のループの外側に移動して、評価が1回だけになるようにし、falseの場合はループ全体をスキップします。
于 2012-09-20T14:48:10.500 に答える
0
for ( int y = 0 ; y < m && !a; ++y ) {
  for ( int x = 0 ; x < n && !a; ++x ) {
    if ( v[x][y] == z ) a = true;
  }
}

if ( a == true ) {
  for ( int y = 0 ; y < m ; ++y ) {
    for ( int x = 0 ; x < n ; ++x ) {
      do_something( v[x][y] );
    }
  }
}
于 2012-09-20T14:47:31.017 に答える
0

コードコンプリートによる:プログラミング言語によって異なります。プログラミング言語Aでパフォーマンスが向上する可能性があるものは、実際には別の言語でのパフォーマンスを損なう可能性があります。

コードコンプリートで説明されているいくつかの手法があります。たとえば、ループ展開はパフォーマンスの向上につながる可能性があります(最初のループの場合、またはdo_somethingをインライン化できる場合)

おそらく、特定の条件が真になったら、ループをエスケープ/終了することもできますか?たとえば、a = trueになったら、最初のループを終了します。(そしてFindusがすでに指摘したように、aが設定されている場合にのみ2番目のループを実行します)

于 2012-09-20T14:53:38.773 に答える
0

最初のループを終了する代わりに、続行して残りの値を最初に呼び出すことができますdo_something(順序は重要ではないと想定しています)。これにより、反復とキャッシュが節約されます。a次に、あなたが真実であることがわかったポイントに戻って繰り返し、そこに行きます。

于 2012-09-20T16:32:38.730 に答える