关于如何存储和使用多维数据的建议?
Suggestions for how to store and work with multidimensional data?
我正在处理一个 16x16x16 的信息立方体,在每个位置我都需要存储一对(int,int)。在大多数用例中,立方体的大部分将包含 (0,0),但每个位置都有可能包含唯一信息。
可能值得注意的是,pair(int,int) 中保存的信息之间的唯一关系是它们处于相同的位置。
- 第一个值可能仅为 0-9,但可以是其他值
- 表示该位置的属性。
- 第二个值表示一个模式,它将是 0-6 或 1-6 的升序组合(例如 12、123456)
- 它描述了当前位置与相邻6个位置之间的关系。
- 第二个值在技术上可以只是 0-64,但为了我在使用它时的理智,我使用了那个模式。
我目前只使用 3d 数组,但考虑到数组的大部分都具有相同的 (0,0) 值,这似乎是一种巨大的浪费。我还应该提到,在保存之外和设置期间,我不会经常访问此信息。
如果有人对更好的存储结构有建议,我将不胜感激。
首先想到的是为立方体、对和三元组定义自己的 classes,如下所示:
public class IntTuple {
private final int x;
private final int y;
private final int z;
public Tuple(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public int getX() { return x; }
public int getY() { return y; }
public int getZ() { return z; }
}
还有一对类似的 class。然后立方体可以是这样的:
public class Cube {
private HashMap<IntTuple, IntPair> cubeMap = new HashMap<IntTuple, IntPair>();
private zeroPair = new IntPair(0, 0);
public addPair(IntTuple coords, IntPair pair) {
cubeMap.put(coords, pair);
}
public IntPair getPair(IntTuple coords) {
if (cubeMap.containsKey(coords))
return cubeMap.get(coords);
else
return zeroPair;
}
}
在存储方面,您减少了一些开销,因为您只存储具有非零对的坐标,并且您可以使用散列图进行快速访问。仅创建一个零对,您将始终 return 那个参考。
如果您想要更大的可伸缩性,可以使所有三个 class 都具有通用类型,这样您就可以重新使用结构来存储整数以外的对象。
我正在处理一个 16x16x16 的信息立方体,在每个位置我都需要存储一对(int,int)。在大多数用例中,立方体的大部分将包含 (0,0),但每个位置都有可能包含唯一信息。
可能值得注意的是,pair(int,int) 中保存的信息之间的唯一关系是它们处于相同的位置。
- 第一个值可能仅为 0-9,但可以是其他值
- 表示该位置的属性。
- 第二个值表示一个模式,它将是 0-6 或 1-6 的升序组合(例如 12、123456)
- 它描述了当前位置与相邻6个位置之间的关系。
- 第二个值在技术上可以只是 0-64,但为了我在使用它时的理智,我使用了那个模式。
我目前只使用 3d 数组,但考虑到数组的大部分都具有相同的 (0,0) 值,这似乎是一种巨大的浪费。我还应该提到,在保存之外和设置期间,我不会经常访问此信息。
如果有人对更好的存储结构有建议,我将不胜感激。
首先想到的是为立方体、对和三元组定义自己的 classes,如下所示:
public class IntTuple {
private final int x;
private final int y;
private final int z;
public Tuple(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public int getX() { return x; }
public int getY() { return y; }
public int getZ() { return z; }
}
还有一对类似的 class。然后立方体可以是这样的:
public class Cube {
private HashMap<IntTuple, IntPair> cubeMap = new HashMap<IntTuple, IntPair>();
private zeroPair = new IntPair(0, 0);
public addPair(IntTuple coords, IntPair pair) {
cubeMap.put(coords, pair);
}
public IntPair getPair(IntTuple coords) {
if (cubeMap.containsKey(coords))
return cubeMap.get(coords);
else
return zeroPair;
}
}
在存储方面,您减少了一些开销,因为您只存储具有非零对的坐标,并且您可以使用散列图进行快速访问。仅创建一个零对,您将始终 return 那个参考。
如果您想要更大的可伸缩性,可以使所有三个 class 都具有通用类型,这样您就可以重新使用结构来存储整数以外的对象。