0

我经常发现自己在编写这些代码,特别是当我必须在二维数组中做某事时。

循环是相同的,只是里面的操作不同,最重要的是,最后一组中的操作取决于第一组。

我主要关心的是:对于较大的 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

在您描述的一般情况下,答案可能是“否”-您暗示第二次查看的操作依赖于完成的第一个循环,因此您必须这样做。

但是,在您列出的特定情况下,有两个简单的优化:

  1. 在第一个循环中快速失败:一旦a设置true,就不需要再循环了。
  2. 移动第二个循环的if ( a == true ) 外部,使其只评估一次,如果它为假,则跳过整个循环。
于 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

您可以继续并首先调用剩余的值,而不是终止第一个循环do_something(假设顺序无关紧要)。这将节省迭代和缓存。然后迭代回到你发现a是真的点并去那里。

于 2012-09-20T16:32:38.730 回答
0

根据代码完成:这取决于您的编程语言。在编程语言 A 中可能会给您带来性能提升的东西实际上可能会损害另一种语言的性能。

Code Complete 中描述了一些技术,例如循环展开,这可能会提高性能(对于第一个循环或者如果您可以内联 do_something)。

一旦某个条件为真,也许您也可以转义/退出循环?例如一旦 a=true,退出第一个循环。(正如 Findus 已经指出的那样,如果设置了 a,则只执行第二个循环)

于 2012-09-20T14:53:38.773 回答