2013-02-08 55 views
0

与Java似乎是一个重大的放缓使用多维数组时: -在Java中,如何在单个数组中表示2d坐标系?

int[] oneDArray=new int[3000*3000]; 
int[][] twoDArray=new int[3000][3000]; 

for(int x=0;x<oneDArray.length;x++){ 
    oneDArray[x]=x; 
} 



for(int x=0;x<twoDArray.length;x++){ 
    for(int y=0;y<twoDArray[0].length;y++){ 
     twoDArray[x][y]=x; 
    } 
} 

的结果是:一维时间为4ms,而2D需要15毫秒,执行图形功能时,这是一个相当大的延迟。

如何在Java中只用一个数组表示2d坐标?

+0

你可以总是有一个坐标对象的数组,但我怀疑这将解决时间延迟问题 – smk 2013-02-08 13:20:30

回答

5
int w = 3000; 
int h = 3000; 

int[] array = new int[w * h]; 

/* Here is how to calculate the index for a specific (x, y) */ 
int index = y * w + x; 

array[index] = 5; 
+0

谢谢我会测试性能,这是O(n),因为通常2d会暗示O(n^2) – user2054388 2013-02-08 13:48:14

+1

分配在这两种情况下都是O(n),访问元素是O(1)都是这种情况。但2D变慢,因为流水线在解析最终元素的内存地址时停顿。 – 2013-02-08 14:26:23

1

这是很常见的是使用一维数组来表示2D数据。例如,你可以翻译该指数是这样的:

1Dindex = xIndex + IMAGE_WIDTH*yIndex 
1

对于在矩形的矩形阵列,其中所有行均可以简单地使用该oneDArray[x*3000 + y]保持在位置上的值的惯例相同的长度(X,Y) 。

0

选项1:

使用1D阵列对象Pair[]

class Pair { 
    int x; 
    int y; 
} 

选项2:

使用1D和2D之间的算术转化:例如你有尺寸100× 200;

然后a[i, j] = a[i * 200 + j]

0

如何通过线性做类似混合坐标的数组?数组中的所有偶数元素都可能属于x,而奇数元素属于y。如果你成对挑选它们,写起来更容易。

事情是这样的:

x = [x1, x2, x3, x4, ..... , x3000] 
y = [y1, y2, y3, y4, ..... , y3000] 

和喜欢的东西替代它:

data = [x1, y1, x2, y2, x3, y3, x4, y4, ...... , x3000, y3000] 

,可以随后从该选择所有的偶数元素来获得x和奇数元素得到年。 一奖金的这是,你可以这样做:

coord (point in position i) = [data [2i], data[2i+1]] 

带回家点i的坐标。

否则我绝对同意首先对所有x进行线性化,然后像其他人所建议的那样对y进行线性化。

+0

你是建议像垂直行和列数据的交错结构吗? – user2054388 2013-02-08 13:40:05

+0

我试图在编辑中更好地解释它。如果您需要其他信息,请告知我。 – mgm 2013-02-08 15:06:52