Java 如何将Pascal三角形生成器从二维阵列转换为一维阵列?
我有个问题 我用Java编写了一个使用二维数组的Pascal三角形生成器程序,它通常很简单。 然而,我似乎不知道如何仅使用1-D数组来编程相同的东西 有人有什么建议吗?我会尽量在可能的时候插入一次代码,但我问的是一般意义上的问题;将二维阵列转换为一维阵列时,您应该考虑什么Java 如何将Pascal三角形生成器从二维阵列转换为一维阵列?,java,arrays,Java,Arrays,我有个问题 我用Java编写了一个使用二维数组的Pascal三角形生成器程序,它通常很简单。 然而,我似乎不知道如何仅使用1-D数组来编程相同的东西 有人有什么建议吗?我会尽量在可能的时候插入一次代码,但我问的是一般意义上的问题;将二维阵列转换为一维阵列时,您应该考虑什么 谢谢。在看到您的代码之前我不确定,但一般来说- 您可以在代码中尝试不同的寻址模式 2D案例:数组是mxn。。。地址[i,j] 相同的数据可以存储在1D中,一行接一行/按列存储。让我们说它是按行的。然后寻址模式将是-[i*(n)
谢谢。在看到您的代码之前我不确定,但一般来说- 您可以在代码中尝试不同的寻址模式 2D案例:数组是mxn。。。地址[i,j] 相同的数据可以存储在1D中,一行接一行/按列存储。让我们说它是按行的。然后寻址模式将是-[i*(n)+j] 其中i=0..m&j=0..n 干杯
Rishikesh您只需将对数组的所有访问操作从
数据[x][y]
替换为数据[x+y*宽度]
或数据[x*高度+y]
。
如果你只给出了一个字段的索引,你想计算出它的坐标
x=index%width;
y=index/width; //be sure to use integer division here
或
您可以在此处了解有关配对功能的更多信息:
到目前为止发布的所有答案都给出了将二维阵列转换为一维阵列的千篇一律的解决方案。据我所知,在静态尺寸的2D数组中存储Pascal三角形是非常低效的,因为大约一半的条目是未使用的 主要问题是三角形是。。。三角形,而矩形2D矩阵相对容易展开 然而,三角形仍然很容易展开。您只需要找出每个偏移的位置。考虑将Pascal三角形存储在一维数组中: 1,1,1,1,2,1,1,3,3,1 考虑帕斯卡三角形中的第i行。它的第一个条目位于一维数组中的第(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);
}
}
}
int getArrayOffset(int行,int偏移量){
//断言(行>0);
返回值(第*行(第1行))/2+偏移量-1;
}
int计算尝试(int行、int偏移、int[]三角形){
三角形[getArrayOffset(行,偏移)]=三角形[getArrayOffset(行-1,偏移-1)]+三角形[getArrayOffset(行-1,偏移)];
}
void calculatescal(int n){
int[]三角形=新的int[getArrayOffset(n+1,1)];
对于(int row=1;row请发布您的代码,以及您尝试过的内容。使用/
和应用于原始数组维度的%
运算符应该很容易操作。可以肯定的是,1D数组代码的可读性会较低Java不知道2D数组,只有1D数组包含1D数组,所以在那里做不了多少;-)。
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);
}
}
}