dan*_*jar 7 arrays algorithm loops dimension
考虑到维度的数量和每个变量的大小,我如何迭代n维数组?
int n;
int size[n];
Run Code Online (Sandbox Code Playgroud)
由于维度的数量不固定,我无法为每个维度编写嵌套循环.我需要代码来处理每个维度.
另外,天气实际数据存储在n维数组或包含大行中所有数据的平面数组中并不重要.两者都可以接受.
int data[16][42][14]; // n-dimensional array
int data[16 * 42 * 14]; // flat array containing the same data
Run Code Online (Sandbox Code Playgroud)
您可以使用递归,对每个维度“猜测”其索引并递归调用一个较小的问题,类似于(伪代码):
iterate(d,n,size,res):
if (d >= n): //stop clause
print res
return
for each i from 0 to size[d]:
res.append(i) //append the "guess" for this dimension
iterate(d+1,n,size,res)
res.removeLast //clean up environment before next iteration
Run Code Online (Sandbox Code Playgroud)
哪里:
d 是当前访问的维度size,n是输入res 是代表当前部分结果的向量用调用iterate(0,n,size,res),其中res初始化为空列表。
C ++代码应类似于:
void iterate(int d,int n,int size[], int res[]) {
if (d >= n) { //stop clause
print(res,n);
return;
}
for (int i = 0; i < size[d]; i++) {
res[d] = i;
iterate(d+1,n,size,res);
}
}
Run Code Online (Sandbox Code Playgroud)
ideone上提供了完整的代码和一个简单的示例
Python代码:
def nd_range(start, stop, dims):
if not dims:
yield ()
return
for outer in nd_range(start, stop, dims - 1):
for inner in range(start, stop):
yield outer + (inner,)
Run Code Online (Sandbox Code Playgroud)
例:
print(list(nd_range(0, 3, 3)))
Run Code Online (Sandbox Code Playgroud)
[(0,0,0),(0,0,1),(0,0,2),(0,1,0),(0,1,1),(0,1,2),( 0,2,0),(0,2,1),(0,2,2),(1,0,0),(1,0,1),(1,0,2),(1, 1,0),(1,1,1),(1,1,2),(1,2,0),(1,2,1),(1,2,2),(2,0, 0),(2,0,1),(2,0,2),(2,1,0),(2,1,1),(2,1,2),(2,2,0) ,(2,2,1),(2,2,2)]