Вычислительная сложность алгоритма самого длинного пути с рекурсивным методом
Я написал сегмент кода, чтобы определить самый длинный путь в графе. Ниже приведен код. Но я не знаю, как получить вычислительную сложность в этом из-за рекурсивного метода в середине. Так как поиск самого длинного пути - это полная проблема 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);
}
1 ответ
Решение
Ваше отношение повторения 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!)