Подтвердить что ты не робот

Сложность рекурсивной функции перестановки строк

От: Есть ли какие-нибудь лучшие методы для перестановки строки?

Какова сложность этой функции???

void permute(string elems, int mid, int end)
{
    static int count;
    if (mid == end) {
        cout << ++count << " : " << elems << endl;
        return ;
    }
    else {
    for (int i = mid; i <= end; i++) {
            swap(elems, mid, i);
            permute(elems, mid + 1, end);
            swap(elems, mid, i);
        }
    }
}
4b9b3361

Ответ 1

Игнорируя печать, удовлетворяющее соотношение рекуррентности

T(n) = n*T(n-1) + O(n)

Если G(n) = T(n)/n!, получим

G(n) = G(n-1) + O(1/(n-1)!)

который дает G(n) = Theta(1).

Таким образом, T(n) = Theta(n!).

Предполагая, что печать выполняется ровно n! раз, мы получаем временную сложность как

Theta(n * n!)

Ответ 2

Не задумываясь над своим кодом, я могу с уверенностью сказать, что его сложность - O (n!). Это связано с тем, что любая эффективная процедура для перечисления всех перестановок из n отдельных элементов должна будет перебираться по каждой перестановке. Нет! перестановки, поэтому алгоритм должен быть как минимум O (n!).

Edit:

Это на самом деле O (n * n!). Благодаря @templatetypedef для указания этого.

Ответ 3

long long O(int n)
{
    if (n == 0)
        return 1;
    else 
       return 2 + n * O(n-1);
}

int main()
{
    //do something
    O(end - mid);
}

Это вычислит сложность алгоритма.

Actualy O (N) - N!!! = 1 * 3 * 6 * ... * 3N