Java 二维矩阵的数据结构设计
我有一个2D矩阵。我的问题要求我在逻辑上将其划分为4个子矩阵。e、 如果我的原始矩阵是4*4,那么有4个子矩阵是2*2。 一个从(0,0)开始,另一个是原始矩阵的(0,2)、(2,0)和(2,2)索引。 我在程序中多次访问和设置值。我想通过类似矩阵[x][y]的方式访问子矩阵元素。at(row,col),其中x,y指定子矩阵编号,row,col表示在(row,col)处使用该子矩阵的元素。 例如 矩阵[2][2]。在[0][0]-->处应给出第四个子矩阵中的第一个元素 非常感谢您的帮助Java 二维矩阵的数据结构设计,java,multidimensional-array,Java,Multidimensional Array,我有一个2D矩阵。我的问题要求我在逻辑上将其划分为4个子矩阵。e、 如果我的原始矩阵是4*4,那么有4个子矩阵是2*2。 一个从(0,0)开始,另一个是原始矩阵的(0,2)、(2,0)和(2,2)索引。 我在程序中多次访问和设置值。我想通过类似矩阵[x][y]的方式访问子矩阵元素。at(row,col),其中x,y指定子矩阵编号,row,col表示在(row,col)处使用该子矩阵的元素。 例如 矩阵[2][2]。在[0][0]-->处应给出第四个子矩阵中的第一个元素 非常感谢您的帮助 提前感谢
提前感谢您希望查看空间填充曲线。sfc将2d复杂度降低为1d复杂度。它可以帮助理解四叉树,也可以像四叉树一样使用。你想看看尼克的希尔伯特曲线四叉树空间索引博客。你想看看空间填充曲线。sfc将2d复杂度降低为1d复杂度。它可以帮助理解四叉树,也可以像四叉树一样使用。你想看看尼克的希尔伯特曲线四叉树空间索引博客。我不确定这里有什么问题。基本上,您只需要一个伪语义api来寻址二维矩阵的元素。注意(假定为随机)对数组的读写。我们假设您没有处理线程问题 类型为Foo,Foo[][]的二维数组当然可以工作。你只需要把它包起来
public class Matrix<T> {
public interface Quadrant<T> {
T get(int i, int j);
void set(T v, int i, int j);
}
public static final int XDIM = 4;
public static final int YDIM = 4;
private final Object[][] matrix = new Object[XDIM][YDIM];
public Matrix() { /* .. */ }
public Quadrant<T> quadrant(final int x, final int y) {
return new Quadrant<T> () {
@SuppressWarnings("unchecked")
@Override public final T get(int i, int j) {
return (T) matrix [x+i][y+j]; // todo: range checks, etc.
}
@Override public final void set(T v, int i, int j) {
matrix [x+i][y+j] = v; // todo: range checks, etc.
}
};
}
public static void main(String[] args) {
Matrix<Object> m = new Matrix<Object>();
m.quadrant(2, 2).set("hi there!", 0, 1);
System.out.format("{%d, %d}:(%d, %d) => %s\n", 2, 2, 0, 1, m.quadrant(2, 2).get(0, 1));
}
}
公共类矩阵{
公共界面象限{
T-get(inti,intj);
无效集(tv,inti,intj);
}
公共静态最终int XDIM=4;
公共静态最终整数YDIM=4;
私有最终对象[][]矩阵=新对象[XDIM][YDIM];
公共矩阵(){/*..*/}
公共象限(最终整数x,最终整数y){
返回新象限(){
@抑制警告(“未选中”)
@覆盖公共最终T get(int i,int j){
返回(T)矩阵[x+i][y+j];//todo:范围检查等。
}
@覆盖公共最终无效集(tV、int i、int j){
矩阵[x+i][y+j]=v;//todo:范围检查等。
}
};
}
公共静态void main(字符串[]args){
矩阵m=新矩阵();
m、 象限(2,2)。设置(“你好!”,0,1);
System.out.format(“{%d,%d}:(%d,%d)=>%s\n”,2,2,0,1,m.quadrant(2,2).get(0,1));
}
}
我不确定这里有什么问题。基本上,您只需要一个伪语义api来寻址二维矩阵的元素。注意(假定为随机)对数组的读写。我们假设您没有处理线程问题
类型为Foo,Foo[][]的二维数组当然可以工作。你只需要把它包起来
public class Matrix<T> {
public interface Quadrant<T> {
T get(int i, int j);
void set(T v, int i, int j);
}
public static final int XDIM = 4;
public static final int YDIM = 4;
private final Object[][] matrix = new Object[XDIM][YDIM];
public Matrix() { /* .. */ }
public Quadrant<T> quadrant(final int x, final int y) {
return new Quadrant<T> () {
@SuppressWarnings("unchecked")
@Override public final T get(int i, int j) {
return (T) matrix [x+i][y+j]; // todo: range checks, etc.
}
@Override public final void set(T v, int i, int j) {
matrix [x+i][y+j] = v; // todo: range checks, etc.
}
};
}
public static void main(String[] args) {
Matrix<Object> m = new Matrix<Object>();
m.quadrant(2, 2).set("hi there!", 0, 1);
System.out.format("{%d, %d}:(%d, %d) => %s\n", 2, 2, 0, 1, m.quadrant(2, 2).get(0, 1));
}
}
公共类矩阵{
公共界面象限{
T-get(inti,intj);
无效集(tv,inti,intj);
}
公共静态最终int XDIM=4;
公共静态最终整数YDIM=4;
私有最终对象[][]矩阵=新对象[XDIM][YDIM];
公共矩阵(){/*..*/}
公共象限(最终整数x,最终整数y){
返回新象限(){
@抑制警告(“未选中”)
@覆盖公共最终T get(int i,int j){
返回(T)矩阵[x+i][y+j];//todo:范围检查等。
}
@覆盖公共最终无效集(tV、int i、int j){
矩阵[x+i][y+j]=v;//todo:范围检查等。
}
};
}
公共静态void main(字符串[]args){
矩阵m=新矩阵();
m、 象限(2,2)。设置(“你好!”,0,1);
System.out.format(“{%d,%d}:(%d,%d)=>%s\n”,2,2,0,1,m.quadrant(2,2).get(0,1));
}
}
i认为可能会有一些更简单的方法?也许吧,但从2d到1d的复杂度降低是值得寻找的,并将极大地帮助您解决问题!但是,如果你能告诉我四叉树是否能帮助你解决问题,你可以很快解决你的问题?实际上,我需要它来进行矩阵乘法,所以我担心四叉树在这里会很有用,虽然会有更简单的方法?也许吧,但是从2d复杂度降低到1d复杂度是值得寻找的,并且会对你的问题有很大帮助!但是,如果你能告诉我四叉树是否能帮助你解决问题,你可以很快解决你的问题。实际上,我需要它进行矩阵乘法,所以我担心四叉树在这里会很有用。谢谢,这解决了我的大部分问题。我想再做一次改变。因为象限也是矩阵,所以当我们调用m.Quadrant(2,2)时,有没有方法返回类型矩阵而不是象限。你可以任意剪切和切片它。例如,将矩阵作为一个接口,然后从矩阵扩展象限。谢谢,这解决了我的大部分目的。我想再做一次改变。因为象限也是矩阵,所以当我们调用m.Quadrant(2,2)时,有没有方法返回类型矩阵而不是象限。你可以任意剪切和切片它。例如,使矩阵成为一个接口,然后从矩阵扩展象限。