2015-01-18 4 views
0

Мне нужно транспонировать квадратную матрицу, представленную массивом символов. Есть ли способ выполнить его менее чем o (n^2) сложности? В любом случае, каков наиболее эффективный кэш-способ?Эффективный алгоритм преобразования матрицы

+0

Вы должны указать, что означает n. Ответ Сальвадора Дали интерпретирует n как количество строк. Другим разумным толкованием будет количество элементов. Одно возможно, а другое нет. – Praxeolitic

ответ

0

Это всегда будет O (NM), так как вы должны вычислить соответствующее транспонирования координат для каждого элемента:

// char matrix[N * M] 
// char transpose[N * M] 

for(int i = 0; i < N*M; i++) 
    transpose[i] = matrix[ (M * (i % N)) + (i/N) ]; 

Если вы делаете это с матрицами NxN, то он будет считать O (N^2) для вычисления транспонирования. Если вам не нужно хранить транспонирование, вы можете просто перебирать его, инвертируя свои индексы и эффективно выполняйте то же самое без дополнительной памяти.

+0

им жаль, он должен быть двухмерным массивом. – user2740785

+1

Сложность времени одинакова независимо от размера массива (как вы индексируете память). – Joel

1

Нет, вы не можете сделать это менее чем O(n^2), и причина в том, что вам нужно хотя бы коснуться каждого элемента в матрице один раз (это уже (n * n)). Поэтому вы не можете сделать лучше .

лучшее, что вы можете сделать, это использовать O(1) дополнительной памяти (не раз) делать на месте транспонированной матрицы (которая хорошо описанные в wikipedia).

Обратите внимание, что вы не всегда нужны вычислить транспонирование матрицы . Для многих приложений вы можете просто поменять координаты (если вам нужно A[i][j] - просто верните A[j][i] -й элемент)

1

Вы также можете добавить 1-битный флаг в свой матричный класс, превратив операцию транспонирования просто в xor на этот флаг O (1). Все операторы доступа к матричным элементам должны затем обменивать индекс строки с индексом столбца, если установлен флаг транспонирования.

Смежные вопросы