【发布时间】:2015-01-06 18:29:31
【问题描述】:
在 C++ 中,我希望迭代一个 n 维数组,其范围分别为 min[n] 到 max[n],并在整个过程中分别保持 ord[n] 中的纵坐标。
即。一个通用的解决方案:
for (int x = 0; x < 10; x++)
for (int y = 3; y < 20; y++)
for (int z = -2; z < 5; z++)
...
doSomething(x, y, z ...)
形式:
int min[n] {0, 3, -2 ...}
int max[n] {10, 20, 5 ...}
int ord[n] {0, 0, 0 ...};
int maxIterations = (max[0] - min[0]) * (max[1] - min[1]) * ....
for (int iteration = 0; iteration < maxIterations; iteration++)
doSomething(ord)
iterate(n, ord, min, max)
我能想到的 iterate() 最快的算法是:
inline void iterate(int dimensions, int* ordinates, int* minimums, int* maximums)
{
// iterate over dimensions in reverse...
for (int dimension = dimensions - 1; dimension >= 0; dimension--)
{
if (ordinates[dimension] < maximums[dimension])
{
// If this dimension can handle another increment... then done.
ordinates[dimension]++;
break;
}
// Otherwise, reset this dimension and bubble up to the next dimension to take a look
ordinates[dimension] = minimums[dimension];
}
}
这会根据需要递增和重置每个纵坐标,避免调用堆栈或任何数学运算。
有更快的算法吗?
【问题讨论】:
-
你测过运行时间吗?
doSomething(x, y, z ...)很快吗?您的第一个版本(3 for 循环)不应该由任何体面的编译器展开吗? -
tgmath - 是的,编译器可能会将硬编码的循环展开为 3 级,但我需要一个 N 级循环,其中 N 在编译时未知,而且我目前正在处理 100 万次以上的迭代,这可能不展开。我对迭代算法的优化感兴趣,而不是对 doSomething() 的优化。
标签: c++ algorithm optimization multidimensional-array n-dimensional