对于同一循环的这两个连续组,是否有更有效的解决方案
Is there a more efficient solution for this two consecutive groups of the same loops?
我经常发现自己在编写这些代码片段,特别是当我必须在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] );
}
}
提前致谢
在您描述的一般情况下,答案可能是"否" - 您暗示第二个外观的操作依赖于第一个循环的完成,因此您必须这样做。
但是,在您列出的特定情况下,有两种简单的优化:
- 快速失败退出第一个循环:一旦
a
设置true
就无需再循环。 - 将
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
为真的点,然后去那里。
相关文章:
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- C++ LeetCode #377 的 DP 解决方案中,此代码是否有错误?
- 使用通常称为 API 实现C++多个客户和生产者解决方案,这是否有效?
- 如何检查文件是否复制成功?(便携式解决方案)C++
- 继承是否是将一组模型参数传递给不同类的可行解决方案
- 是否有一个很好的方法可以在C 11中打印出像JSON一样的Trie结构(仅迭代解决方案)的扁平命名空间
- 如何计算该程序的复杂性?是否有任何其他复杂性较低的解决方案
- 在 C++14 中,是否有一种优雅的解决方案可以在可变参数模板中选择可调用和不可调用的类型
- 哪些有效的解决方案可以检查Arraya是否包含Arrayb的所有元素
- 是否有任何好的解决方案可以解决C 中两个类之间的交叉引用
- 是否有一种记忆有效的方法来探索从输入排列产生的解决方案
- 对于同一循环的这两个连续组,是否有更有效的解决方案
- 是否可以在Visual Studio中将文件添加到CMake生成的解决方案文件夹中
- c++11 是否提供与 python maketrans/translate 中实现的解决方案类似的解决方案?
- 检查是否从CMake生成Visual Studio解决方案或Makefile
- 在一个解决方案中是否可以有具有不同平台工具集的项目?(MSBuild)
- QLineEdit:是否有一个优雅的解决方案来告诉多个QLineEdit部件分开事件处理程序
- CLang中的enable_if bug (bug 11723)是否有更好的解决方案?