代码之家  ›  专栏  ›  技术社区  ›  Christian Ammer

如何交换数组元素以将数组从类似列的表示形式转换为类似行的表示形式

  •  3
  • Christian Ammer  · 技术社区  · 14 年前

    例如:数组

    a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3
    

    表示下表

    a1, b1, c1, d1
    a2, b2, c2, d2
    a3, b3, c3, d3
    

    现在我想把数组转换成以下形式

    a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, c3, d3
    

    是否存在将数组(从第一个窗体)和表的维度作为输入参数并将数组转换为第二个窗体的算法? 我想到了一种不需要分配额外内存的算法,相反,我认为应该可以用元素交换操作来完成这项工作。

    4 回复  |  直到 14 年前
        1
  •  7
  •   zildjohn01    14 年前

    你要找的术语是 就地矩阵转置 这里是 an implementation .

        2
  •  4
  •   Mark Ransom    14 年前

    维基百科为这个过程写了一篇文章,叫做就地矩阵转换。

    http://en.wikipedia.org/wiki/In-place_matrix_transposition

        3
  •  4
  •   Pieter    14 年前

    这只不过是 in-place matrix transposition . 一些伪代码:

    for n = 0 to N - 2
        for m = n + 1 to N - 1
            swap A(n,m) with A(m,n)
    

    如您所见,您需要2个索引来访问一个元素。这可以通过转换 (n,m) nP+m 具有 P 列的数目。

        4
  •  4
  •   Simon    14 年前

    何苦?如果它们被布置在一维数组中,并且您知道在一个逻辑行/span中有多少个元素,那么您可以用一点算术在任何索引处按顺序获取。

    int index(int row, int col, int elements)
    {
      return ((row * elements) + col);
    }
    
    int inverted_index(int row, int col, int elements)
    {
      return ((col * elements) + row);
    }
    

    然后,当你访问元素时,你可以说像…

    array[index(row, col, elements)];
    array[inverted_index(row, col, elements)];
    

    我这样做的大多数基本数组操作都是因为我可以通过对矩阵进行不同的索引来转置矩阵,而不需要进行任何内存调整。这也是你用电脑做的最快的事情。

    您可以遵循相同的原则,并使用一些您自己的算法,以满足最后一个示例的需要的术语来处理第一个数组。