Я пытаюсь получить сложность конкретного алгоритма «разделяй и властвуй», поэтому транспонируй данную матрицу.
Из того, что я читал, я понял, что рекурсия должна начинаться следующим образом:
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;
}
}
}
Я действительно застрял в этой сложности с рекурсией и разделяй и властвуй. Я не знаю, как продолжить.
Каждый шаг рекурсии уменьшает количество элементов в 4 раза, поэтому количество уровней рекурсии будет порядка O(log n). На каждом уровне своп имеет порядок O(n^2), поэтому алгоритм имеет сложность O((n^2)(log n)).
Вы неправильно поняли рекурсию. Это 4C(n/2) + O(n2), потому что при обратном соединении матрицы для размера n всего n2 элементов.
Два пути:
Здесь мы имеем a = 4, b = 2, c = 2, Logba = 2
Поскольку Logba == c, это подпадает под случай 2, что приводит к сложности O (ncLog n) = O (n2 Log n).
Визуализация дерева повторений
Если вы попытаетесь развернуть свое повторение, вы увидите, что решаете задачу размера n, разбивая ее на 4 задачи размера n/2, а затем выполняя работу размера n2 (на каждом уровне).
Общая работа, проделанная на каждом уровне = 4 * Работа (n/2) + n2
Общее количество уровней будет равно количеству раз, которое вам придется разделить задачу размера n, пока вы не придете к задаче размера 1. Это будет просто равно Log2n.
Следовательно, общая работа = Log(n) (4*(n/2) + n2), что равно O(n2 Log n).
Итак, рекурсия должна быть следующей? С(1) = 1 С(n) = 4С(n/2) + O(n²)