Рекурсивная транспозиция матрицы в Python
Я реализую рекурсивный подход для транспонирования матрицы как алгоритм, не обращающий внимания на кеш . У меня проблема при транспонировании и обмене, проблема в том, что матрица имеет нечетное количество столбцов:
1 2 3
4 5 6
7 8 9
Число 5 находится в двух матрицах меньшего размера, созданных рекурсивными вызовами.
2 3
5 6
и
4 5
7 8
Это приводит к двойной замене во время рекурсивных вызовов. Я не хочу использовать какую-либо структуру для хранения замененных элементов.
Есть ли способ решить эту проблему двойной замены?
Вот реализация упомянутых методов.
class Matrix:
def __init__(self, N):
self.N = N
def transpose(self):
self._transpose(0, 0, self.N)
def _transpose(self, start_row, start_col, size):
if size == 1:
return # Base case: do nothing for a 1x1 matrix
first_half_size = size // 2
second_half_size = size - first_half_size
# Transpose the diagonal quadrants
self._transpose(start_row, start_col, first_half_size)
self._transpose(start_row + second_half_size, start_col + second_half_size, first_half_size)
# Transpose swap the off-diagonal quadrants
self._transpose_swap(start_row, start_col + first_half_size, start_row + first_half_size, start_col, second_half_size)
def _transpose_swap(self, start_row1, start_col1, start_row2, start_col2, size):
if size == 1:
# Base case: swap items
self.swap(start_row1, start_col1, start_row2, start_col2)
else:
first_half_size = size // 2
second_half_size = size - first_half_size
self._transpose_swap(start_row1, start_col1, start_row2, start_col2, first_half_size)
self._transpose_swap(start_row1, start_col1 + first_half_size, start_row2 + first_half_size, start_col2, second_half_size)
self._transpose_swap(start_row1 + first_half_size, start_col1, start_row2, start_col2 + first_half_size, second_half_size)
self._transpose_swap(start_row1 + second_half_size, start_col1 + second_half_size, start_row2 + second_half_size, start_col2 + second_half_size, first_half_size)