Сложность рекурсивного алгоритма «разделяй и властвуй»

Я пытаюсь получить сложность конкретного алгоритма «разделяй и властвуй», поэтому транспонируй данную матрицу.

Из того, что я читал, я понял, что рекурсия должна начинаться следующим образом:

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;
        }
    }
}

Я действительно застрял в этой сложности с рекурсией и разделяй и властвуй. Я не знаю, как продолжить.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
182
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Итак, рекурсия должна быть следующей? С(1) = 1 С(n) = 4С(n/2) + O(n²)

d3vcho 07.04.2019 18:51
Ответ принят как подходящий

Вы неправильно поняли рекурсию. Это 4C(n/2) + O(n2), потому что при обратном соединении матрицы для размера n всего n2 элементов.


Два пути:

  1. Основная теорема

    Здесь мы имеем a = 4, b = 2, c = 2, Logba = 2

    Поскольку Logba == c, это подпадает под случай 2, что приводит к сложности O (ncLog n) = O (n2 Log n).


  1. Визуализация дерева повторений

    Если вы попытаетесь развернуть свое повторение, вы увидите, что решаете задачу размера n, разбивая ее на 4 задачи размера n/2, а затем выполняя работу размера n2 (на каждом уровне).

    Общая работа, проделанная на каждом уровне = 4 * Работа (n/2) + n2

    Общее количество уровней будет равно количеству раз, которое вам придется разделить задачу размера n, пока вы не придете к задаче размера 1. Это будет просто равно Log2n.

    Следовательно, общая работа = Log(n) (4*(n/2) + n2), что равно O(n2 Log n).

Другие вопросы по теме