对于同一循环的这两个连续组,是否有更有效的解决方案

Is there a more efficient solution for this two consecutive groups of the same loops?

本文关键字:是否 解决方案 有效 连续 循环 于同一 两个      更新时间:2023-10-16

我经常发现自己在编写这些代码片段,特别是当我必须在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] );
  }
}

提前致谢

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

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

  1. 快速失败退出第一个循环:一旦a设置true就无需再循环。
  2. if ( a == true )移到第二个循环之外,以便只计算一次,如果它为 false,则跳过整个循环。
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] );
    }
  }
}

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

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

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

与其终止第一个循环,不如继续并首先调用其余值的do_something(假设顺序无关紧要)。这将保存迭代和缓存。然后迭代回你发现a为真的点,然后去那里。

相关文章: