Вычислительная сложность самого длинного алгоритма пути с рекурсивным методом

StackOverflow https://stackoverflow.com/questions/4438150

Вопрос

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

public static int longestPath(int A) {
    int k;
    int dist2=0;
    int max=0;

    visited[A] = true;

    for (k = 1; k <= V; ++k) {
        if(!visited[k]){
            dist2= length[A][k]+longestPath(k);
            if(dist2>max){
                max=dist2;
            }
        }
    }
    visited[A]=false;
    return(max);
}
Это было полезно?

Решение

Ваше отношение рецидивов T(n, m) = mT(n, m-1) + O(n), куда n обозначает количество узлов и m Обозначает количество необычных узлов (потому что вы звоните longestPath m раз, и есть петля, которая выполняет посещаемый тест n раз). Базовый случай T(n, 0) = O(n) (только посещенный тест).

Решите это, и я считаю, что вы получите t (n, n) o (n * n!).

РЕДАКТИРОВАТЬ

Работающий:

T(n, n) = nT(n, n-1) + O(n) 
        = n((n-1)T(n, n-2) + O(n)) + O(n) = ...
        = n(n-1)...1T(n, 0) + O(n)(1 + n + n(n-1) + ... + n(n-1)...2)
        = O(n)(1 + n + n(n-1) + ... + n!)
        = O(n)O(n!) (see http://oeis.org/A000522)
        = O(n*n!)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top