java - 行主序地址计算

标签 java arrays data-structures

我正在计算转换为平面一维数组的 n 维数组的索引。

    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;
}

我已经编写了这段代码,它显示并测试正确。尽管我已经从维基百科编写了公式,但我并不完全理解发生了什么。我希望有人对此进行解释,或者更好地链接有关地址计算的视频教程/讲座。

最佳答案

让我们手动处理前几个维度。

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

对于二维数组,元素 [j,k]指定k '行的第一个元素 j 。这是k + start of row j 。第 j 行的起始位置为 j * number of columns 。如果维度列在数组 dimensionSize 中,则列数为 dimensionSize[0]

将其放在一起,元素 [j,k]位于dimensionSize[0] * j + k .

对于 3d 数组,元素 [i,j,k]指定k '行的第一个元素 j在“平面”内i的元素立方体。这是k + start of row j in plane i 。平面 i 中第 j 行的起始位置为 i * size of plane + j * size of row 。把这些放在一起,元素 [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

现在用数组 dimensionIndices[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;
}

关于java - 行主序地址计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35542598/

相关文章:

java - 我的多维数组代码无法正常工作

java - 简单的正则表达式匹配

java - 在应用程序服务器级别配置数据源与 Spring 的 applicationContext 的优点/缺点

c++ - 从单向链表中查找元素(从尾部开始)

java - 如何在运行时创建通用 Collection<T>?

javascript - 如何按日期对 Javascript 对象数组进行排序?

java - 如何返回出现错误的字符串(类型不匹配)

c - 将数组添加到节点 n 叉树时出现段错误

algorithm - 在 N 个列表中查找匹配项的有效方法?

java - 从大型未排序数组中删除重复项并保持顺序