遍历一个二维数组转换为一维,对角线
Traverse a 2D array converted to 1D, diagonal
我想遍历一个已经转换为一维的二维方阵。
问题是我想遍历它就像我在对角线带中遍历原始 2D 一样。
数组是对角线的,我最初是用一维的 malloc 创建的,以避免分配太多内存。
数组大小:
int Tsize = N*(N+1)/2; //table size -> diagonal array of (N+1)*N/2 elements
int* table = malloc(Tsize*sizeof(int));
我知道这样你遍历一个扁平的二维数组。
do{
i = row*N + col;
col++;
if (col>N-1){
col = 0;
row++;
}
printf("%d ", x[i]);
} while( row < N);
而 here 是我发现的用于遍历对角线数组的方法。
对于这个数组:
int x[3][3] = {1, 2, 3,
ø, 4, 5,
ø, ø, 6};
ø:我不会使用那个元素。
我创建了这个数组:
int k[6] = {1,2,3,4,5,6};
我想这样遍历它:
1,4,6,2,5,3
你有什么建议吗?我卡住了。
当您说您将 two-dimensional 数组分配为 one-dimensional 数组时所描述的称为 array-flattening。展平数组实际上是一种常见的安全做法,因为 the structure of an array gives you a lot of information on its own, so the code is obfuscated to mitigate this. Even the program's control flow itself 将被混淆以提高安全性。
要沿对角线遍历一个假设的 3x3 矩阵,将其展开为大小为 9 的一维数组,您可以从 arr[0]
开始,只需将偏移量加 4。这个方法是essentially isomorphic to iterating through the matrix diagonal from the top left to the bottom right, while providing some additional secrecy because it's not as trivial to deduce the structure of the data.
您可以像这样想象这个转换:
a [0] [1] [2]
[3] [4] [5]
[6] [7] [8]
b [0] [1] [2] [3] [4] [5] [6] [7] [8]
因此,当您遍历第一个数组时,您嵌套了两个 for
循环,表明这是一个 two-dimensional 数组。另一方面,当通过从 0 开始将索引递增 4 来遍历第二个数组时,您将访问与第一个数组中相同的元素,但是您这样做并没有放弃底层结构数据。
这个人为的例子对于实际使用来说太简单了,但我鼓励你研究一下。如果您有任何问题,请告诉我。
是这样的吗?
#include <stdio.h>
#include <stdlib.h>
int
main() {
int i, n = 5;
int *arr = malloc(n*n*sizeof(int));
for (i = 0; i < n*n; i++)
arr[i] = i + 1;
for (i = 0; i < n*n; i += n+1)
printf("%d ", arr[i]);
}
我想遍历一个已经转换为一维的二维方阵。
问题是我想遍历它就像我在对角线带中遍历原始 2D 一样。
数组是对角线的,我最初是用一维的 malloc 创建的,以避免分配太多内存。
数组大小:
int Tsize = N*(N+1)/2; //table size -> diagonal array of (N+1)*N/2 elements
int* table = malloc(Tsize*sizeof(int));
我知道这样你遍历一个扁平的二维数组。
do{
i = row*N + col;
col++;
if (col>N-1){
col = 0;
row++;
}
printf("%d ", x[i]);
} while( row < N);
而 here 是我发现的用于遍历对角线数组的方法。
对于这个数组:
int x[3][3] = {1, 2, 3,
ø, 4, 5,
ø, ø, 6};
ø:我不会使用那个元素。
我创建了这个数组:
int k[6] = {1,2,3,4,5,6};
我想这样遍历它:
1,4,6,2,5,3
你有什么建议吗?我卡住了。
当您说您将 two-dimensional 数组分配为 one-dimensional 数组时所描述的称为 array-flattening。展平数组实际上是一种常见的安全做法,因为 the structure of an array gives you a lot of information on its own, so the code is obfuscated to mitigate this. Even the program's control flow itself 将被混淆以提高安全性。
要沿对角线遍历一个假设的 3x3 矩阵,将其展开为大小为 9 的一维数组,您可以从 arr[0]
开始,只需将偏移量加 4。这个方法是essentially isomorphic to iterating through the matrix diagonal from the top left to the bottom right, while providing some additional secrecy because it's not as trivial to deduce the structure of the data.
您可以像这样想象这个转换:
a [0] [1] [2]
[3] [4] [5]
[6] [7] [8]
b [0] [1] [2] [3] [4] [5] [6] [7] [8]
因此,当您遍历第一个数组时,您嵌套了两个 for
循环,表明这是一个 two-dimensional 数组。另一方面,当通过从 0 开始将索引递增 4 来遍历第二个数组时,您将访问与第一个数组中相同的元素,但是您这样做并没有放弃底层结构数据。
这个人为的例子对于实际使用来说太简单了,但我鼓励你研究一下。如果您有任何问题,请告诉我。
是这样的吗?
#include <stdio.h>
#include <stdlib.h>
int
main() {
int i, n = 5;
int *arr = malloc(n*n*sizeof(int));
for (i = 0; i < n*n; i++)
arr[i] = i + 1;
for (i = 0; i < n*n; i += n+1)
printf("%d ", arr[i]);
}