как поменять элементы массива для переноса массива из столбца в представление в виде строки - PullRequest
3 голосов
/ 09 июня 2010

Например: массив

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 ]

7 голосов
/ 09 июня 2010

Вы ищете термин транспонирование матрицы на месте , а вот реализация .

4 голосов
/ 10 июня 2010

Зачем беспокоиться? Если они размещены в одномерном массиве, и вы знаете, сколько элементов в логической строке / диапазоне, то вы можете последовательно получить любой индекс с небольшой арифметикой.

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

Я делаю большинство моих базовых манипуляций с массивами именно по этой причине, потому что я могу транспонировать матрицу, просто индексируя ее по-другому, без перестановок памяти. Это также самая быстрая вещь, которую вы можете сделать с компьютером.

Вы можете следовать тому же принципу и обращаться к своему первому массиву в терминах, которые соответствуют потребностям вашего последнего примера, с некоторыми из ваших собственных арифметических действий.

4 голосов
/ 09 июня 2010

Википедия посвящает этому процессу статью, которая называется Транспонирование матрицы на месте.

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

4 голосов
/ 09 июня 2010

Это не что иное, как транспонирование матрицы на месте .Некоторый псевдокод:

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, равным количеству столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...