如何迭代n维?

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)

ami*_*mit 6

您可以使用递归,对每个维度“猜测”其索引并递归调用一个较小的问题,类似于(伪代码):

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 是当前访问的维度
  • sizen是输入
  • 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上提供了完整的代码和一个简单的示例


dan*_*jar 5

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)]