Java 行主订单地址计算

Java 行主订单地址计算,java,arrays,data-structures,Java,Arrays,Data Structures,我正在计算一个n维数组转换成平面1d数组的索引 private int toFlatindex(int... dimensionIndices){ int index = 0; for (int k = dimensionIndices.length - 1; k >= 0; k--) { // Check if the specified index is within the bounds of the array if(di

我正在计算一个n维数组转换成平面1d数组的索引

    private int toFlatindex(int... dimensionIndices){
    int index = 0;

    for (int k = dimensionIndices.length - 1; k >= 0; k--) {

        // Check if the specified index is within the bounds of the array
        if(dimensionIndices[k] < 0 || dimensionIndices[k] >= dimensionSizes[k]) {
            return -1;
        }

        // get the index in the flat array using the formula from https://en.wikipedia.org/wiki/Row-major_order#Address_calculation_in_general
        int start = 1;
        for (int l = dimensionSizes.length - 1; l >= k+1; l--) {
            start = start * dimensionSizes[l]; 
        }

        index += dimensionIndices[k]*start;
    }

    return index;
}
private int-toFlatindex(int…dimensionindex){
int指数=0;
对于(int k=dimensionindex.length-1;k>=0;k--){
//检查指定的索引是否在数组的边界内
如果(维数索引[k]<0 | |维数索引[k]>=维数大小[k]){
返回-1;
}
//使用以下公式获取平面数组中的索引:https://en.wikipedia.org/wiki/Row-major_order#Address_calculation_in_general
int start=1;
对于(int l=尺寸大小。长度-1;l>=k+1;l--){
开始=开始*尺寸[l];
}
索引+=维度索引[k]*开始;
}
收益指数;
}

我已经写了这段代码,它看起来是正确的,测试结果是正确的。虽然我已经从维基百科中编码了这个公式,但我并不完全理解发生了什么。我希望有人能解释这一点,或者更好地链接关于地址计算的视频教程/讲座。

让我们手动完成前几个维度

对于单行的一维数组,元素
[k]
位于位置
k

对于二维数组,元素
[j,k]
指定行
j
的第k个元素。这是
k+第j行的开头
。第j行的开头是
j*列数
。如果尺寸列在数组
dimensionSize
中,则列数为
dimensionSize[0]

综上所述,元素
[j,k]
的尺寸为
尺寸[0]*j+k

对于三维数组,元素
[i,j,k]
指定元素立方体的“平面”内
i
j
的第k个元素。这是平面i中j行的
k+起点
。平面i中第j行的起点为
i*平面尺寸+j*行尺寸
。综上所述,元素
[i,j,k]
位于

dimensionSize[0] * dimensionSize[1] * i + dimensionSize[0] * j + k.
另一种写法是

dimensionSize[0] * (dimensionSize[1] * i + j) + k.
这种模式正在形成。如果我们有一个4d数组,元素
[h,i,j,k]
将是

dimensionSize[0] * (dimensionSize[1] * (dimensionSize[2] * h + i) + j) + k
现在用数组
dimensionindex[0..3]
替换索引k、j、i、h,您应该能够看到该函数正在对任意数量的维度执行此计算

更简单的编码是:

int getOffset(int [] sizes, int [] indices) {
  int ofs = indices[sizes.length - 1];
  for (int d = sizes.length - 2; d >= 0; --d) {
    ofs = ofs * sizes[d] + indices[d];
  }
  return ofs;
}