我有一个问题。
我使用二维数组在Java中创建了一个Pascal三角形生成器程序,它通常很简单。 但是,我似乎无法弄清楚如何仅使用一维阵列编程相同的东西。
有没有人有任何建议?我会尝试尽可能地插入代码,但我会在一般意义上问这个问题;在将二维阵列转换为一维阵列时你应该怎么想?
感谢。
答案 0 :(得分:1)
到目前为止发布的所有答案都给出了将二维阵列转换为一维阵列的千篇一律的解决方案。据我所知,在静态尺寸的2D数组中存储Pascal的三角形是非常低效的,因为大约一半的条目未被使用。
主要问题是三角形是......好的,三角形,而矩形的二维矩阵相对容易展开。
但是,展开三角形仍然非常简单。您只需要弄清楚每个偏移的位置。考虑将您的pascal三角形存储在一维数组中,如下所示:
1,1,1,1,2,1,1,3,3,1
考虑Pascal三角形中的第i行。它的第一个条目是在1维数组中的(1 + 2 + ... + i-1)条目。这是一个简单的算术级数和,其值为(i-1)(i)/ 2。所以,写一些函数,如:
int getArrayOffset(int row, int offset) {
// assert(row>0);
return (row*(row-1))/2 + offset - 1;
}
int calculateEntry(int row, int offset, int[] triangle) {
triangle[getArrayOffset(row,offset)] = triangle[getArrayOffset(row-1,offset-1)]+triangle[getArrayOffset(row-1,offset)];
}
void calculatePascal(int n) {
int [] triangle = new int[getArrayOffset(n+1,1)];
for (int row=1; row <=n; row++) {
triangle[getArrayOffset(row,1)]=1;
triangle[getArrayOffset(row,row)]=1;
for (int offset=2; offset < row; offset++) {
calculateEntry(row,offset,triangle);
}
}
}
答案 1 :(得分:0)
在我看到您的代码之前我不确定,但一般情况下 - 您可以在代码中尝试不同的寻址模式。
2D情况:数组是mxn ...寻址去[i,j]
相同的数据可以存储在1D中,逐行/逐列存储。让我们说它是明智的。那么寻址模式将是 - [i *(n)+ j] 其中i = 0..m&amp; J = 0..N
干杯,
瑞诗凯诗
答案 2 :(得分:0)
您只需将所有对数组的访问操作替换为data[x][y]
到data[x+y*width]
或data[x*height+y]
。
如果您只给出了一个字段的索引,并且想要计算
x=index%width;
y=index/width; //be sure to use integer division here
或
x=index/width; //be sure to use integer division here
y=index%width;
您可以在此处找到有关配对功能的更多信息: http://en.wikipedia.org/wiki/Cantor_pairing_function