Я пытаюсь получить сложность конкретного алгоритма «разделяй и властвуй», поэтому транспонирую данную матрицу.
Из того, что я читал, я понял, что рекурсия должна начинаться следующим образом:
C(1) = 1
C(n) = 4C(n/2) + O(n)
Я знаю, как решить рекурсию, но я не уверен, правильно ли это.Каждый раз, когда вызывается функция, задача делится на 2 (переменные fIni и fEnd), а затем вызываются еще 4 функции.Кроме того, в конце swap вызывается со сложностью O (n²), поэтому я почти уверен, что не учту это в приведенной выше рекурсии.
Код выглядит следующим образом:
void transposeDyC(int **m,int f,int c, int fIni, int fEnd, int cIni, int cEnd){
if(fIni < fEnd){
int fMed = (fIni+fFin)/2;
int cMed = (cIni+cFin)/2;
transposeDyC(m,f,c, fIni, fMed, cIni, cMed);
transposeDyC(m,f,c, fIni, fMed, cMed+1, cEnd);
transposeDyC(m,f,c, fMed+1, fFin, cIni, cMed);
transposeDyC(m,f,c, fMed+1, fFin, cMed+1, cEnd);
swap(m,f,c, fMed+1, cIni, fIni, cMed+1, fEnd-fMed);
}
}
void swap (int **m,int f, int c,int fIniA, int cIniA, int fIniB, int cIniB, int dimen){
for (int i=0; i<=dimen-1; i++){
for (int j=0; j<=dimen-1; j++) {
int aux = m[fIniA+i][cIniA+j];
m[fIniA+i][cIniA+j] = m[fIniB+i][cIniB+j];
m[fIniB+i][cIniB+j] = aux;
}
}
}
Я действительно застрял в этой сложности с рекурсией, разделяй и властвуй.Я не знаю, как продолжить.