Java- 将多维数组映射到单维

Java- Mapping multi-dimensional arrays to single

我发布的这个与我的另一个未解决的问题有关,但我认为这应该是它自己的问题。

备选题(供参考):

基本上,我需要存储大量数据并快速访问这些数据。这将在无限内存情况下理想地工作:

boolean[][][][] sets = new boolean[256][256][256][256];
boolean get(byte[] a) {
    return sets[a[0]][a[1]][a[2]][a[3]];
}

但是,这使用了大约 16gb 的 ram,这对我的应用程序来说太多了。我认为如果使用位而不是布尔值(在 Java 中存储为 4 个字节),它会将内存使用量减少到 512MB 左右。但是,我似乎无法理解如何正确访问这些位。例如,如果您将每个地址映射为如下内容:position = a * b * c * d 那么它将映射到与 d * c * b * a 等相同的位

我发现此线程涵盖了如何将二维数组转换为一维数组,但我似乎无法理解如何将其扩展为四维数组。谁能解释一下? Map a 2D array onto a 1D array C

2D -> 1D 数组的解决方案:

int array[width * height];
int SetElement(int row, int col, int value)
{
  array[width * row + col] = value;  
}

我只是不确定如何将它扩展到 4D -> 1D

 int array[256 * 256 * 256 * 256];
 int setElement(int a, int b, int c, int d, boolean value)
 {
    array[?????????] = value;  
 }

要回答有关将 4D 映射到 1D 的问题,如果您想象一个棋盘,您可以通过思考是否每一行都有 width 个元素来得出 2D 到 1D 的公式,我首先向下 row 行数然后移动到 col,然后我在 width * row + col。现在想象一堆 height 个棋盘并进行相同的练习以将其扩展到三个维度。四个维度更难,因为你无法真正想象它,但到那时你可以看到模式。

这个程序展示了四个维度的公式。我 运行 它用于此处发布的非常小的数字,但您可以玩一下尺寸并看看它是如何工作的。

class Dim
{
    // dimensions
    static int d1 = 2 ;   // "rows"
    static int d2 = 2;    // "cols"
    static int d3 = 3;    // "height"
    static int d4 = 2;    // the fourth dimension!

    public static void main(String[] args) {
        for (int i=0; i<d1; i++) {
            for (int j=0; j<d2; j++) {
                for (int k=0; k<d3; k++) {
                    for (int m=0; m<d4; m++) {
                        int oneD = fourDtoOneD(i, j, k, m);
                        System.out.printf("(%d, %d, %d, %d) -> %d\n", i, j, k, m, oneD);
                    }
                }
            }
        }
    }

    static int fourDtoOneD(int i, int j, int k, int m) {
        return ((d2*d3*d4) * i) + ((d2*d3) * j) + (d2 * k) + m;
    }
}


$ java Dim
(0, 0, 0, 0) -> 0
(0, 0, 0, 1) -> 1
(0, 0, 1, 0) -> 2
(0, 0, 1, 1) -> 3
(0, 0, 2, 0) -> 4
(0, 0, 2, 1) -> 5
(0, 1, 0, 0) -> 6
(0, 1, 0, 1) -> 7
(0, 1, 1, 0) -> 8
(0, 1, 1, 1) -> 9
(0, 1, 2, 0) -> 10
(0, 1, 2, 1) -> 11
(1, 0, 0, 0) -> 12
(1, 0, 0, 1) -> 13
(1, 0, 1, 0) -> 14
(1, 0, 1, 1) -> 15
(1, 0, 2, 0) -> 16
(1, 0, 2, 1) -> 17
(1, 1, 0, 0) -> 18
(1, 1, 0, 1) -> 19
(1, 1, 1, 0) -> 20
(1, 1, 1, 1) -> 21
(1, 1, 2, 0) -> 22
(1, 1, 2, 1) -> 23