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
我发布的这个与我的另一个未解决的问题有关,但我认为这应该是它自己的问题。
备选题(供参考):
基本上,我需要存储大量数据并快速访问这些数据。这将在无限内存情况下理想地工作:
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