Я пытаюсь реализовать алгоритм Штрассена для умножения матриц на С++ и хочу найти способ разбить две матрицы на четыре части за постоянное время. Вот текущий способ, которым я это делаю:
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
A11[i][j] = a[i][j];
A12[i][j] = a[i][j+n];
A21[i][j] = a[i+n][j];
A22[i][j] = a[i+n][j+n];
B11[i][j] = b[i][j];
B12[i][j] = b[i][j+n];
B21[i][j] = b[i+n][j];
B22[i][j] = b[i+n][j+n];
}
}
Этот подход, очевидно, O (n ^ 2), и он добавляет n ^ 2 * log (n) к среде выполнения, поскольку он вызывается для каждого рекурсивного вызова.
Кажется, что способ сделать это в постоянное время состоит в том, чтобы создать указатели на четыре подматрицы, а не копировать значения, но мне трудно понять, как создавать эти указатели. Любая помощь будет оценена по достоинству.