【问题标题】:Traverse a 2D array converted to 1D, diagonal遍历转换为 1D 对角线的 2D 数组
【发布时间】:2018-04-10 17:37:00
【问题描述】:

我想遍历一个已转换为一维的二维方阵。

问题是我想遍历它,就好像我在对角线中遍历原始 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

你有什么建议吗?我被卡住了。

【问题讨论】:

  • 如果你想将矩阵作为二维数组进行遍历,为什么要先将其转换为一维呢?
  • 我使用 malloc 创建了一维数组,但我想将其视为对角数组。我这样做是因为这样我分配的内存更少
  • 你卡在哪里了?到目前为止你有什么?
  • “沿对角线遍历”是什么意思?你能展示遍历模式吗? “对角线”通常表示主对角线......
  • "我使用 malloc 创建了一维数组" --> 发布该代码。

标签: c diagonal


【解决方案1】:

当您说您将二维数组分配为一维数组时,您所描述的内容称为数组展平。扁平化数组实际上是一种常见的安全实践,因为the structure of an array gives you a lot of information on its own,所以代码被混淆以缓解这种情况。甚至 the program's control flow itself 也会被混淆以增加安全性。

要对角遍历一个假设的 3x3 矩阵,该矩阵被展平为大小为 9 的一维数组,您可以从 arr[0] 开始,只需将偏移量加 4。这个方法是essentially isomorphic从左上角到右下角遍历矩阵对角线,同时提供一些额外的保密性,因为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 循环,表明这是一个二维数组。另一方面,当通过从 0 开始将索引增加 4 来迭代第二个数组时,您将访问与第一个数组中相同的元素,但您这样做并没有放弃底层结构数据。

这个人为的例子对于实际使用来说太琐碎了,但我鼓励你研究一下。如果您有任何问题,请告诉我。

【讨论】:

  • 从来没有听说过这是一种安全措施:你能提供一个可靠的来源吗?您将 4 添加到偏移量,而不是 3。
  • 当然,我会编辑它,请稍等。不知道为什么要在偏移量上添加 4,然后您将访问 arr[0]、arr[4] 和 arr[8]。你的意思是别的吗?加三,得到元素0、3、6,分别对应第一行、第一列、第二行第二列、第三行第三列
  • OP 要求对角线
  • 对,我给了他元素[0][0]、[1][1]、[2][2]给出的对角线
  • 啊,呃,我才明白你在说什么
【解决方案2】:

这样的?

#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]);
}

【讨论】:

  • 这里涉及的对角线在哪里?
  • 在 printf("%d ", arr[i]);
  • 我今天显然无法阅读。我的错。我将增量读取为i += n。
猜你喜欢
  • 2017-07-29
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2021-05-27
  • 2017-09-11
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
相关资源
最近更新 更多