2010-12-14 9 views
5

Ich habe ein Codesegment geschrieben, um den längsten Pfad in einem Diagramm zu bestimmen. Folgendes ist der Code. Aber ich weiß nicht, wie ich die rechenintensive Methode durch die rekursive Methode in der Mitte erreichen kann. Da das Finden des längsten Pfades ein NP-vollständiges Problem ist, nehme ich an, dass es etwas wie O(n!) oder O(2^n) ist, aber wie kann ich es tatsächlich feststellen?Berechnungskomplexität eines Algorithmus für den längsten Pfad mit einer rekursiven Methode

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

Antwort

8

Ihre Rekursion ist T(n, m) = mT(n, m-1) + O(n), wo n Anzahl der Knoten bezeichnet und m bezeichnet Anzahl von unvisited Knoten (weil Sie longestPathm mal nennen, und es ist eine Schleife, die die besuchten Test n mal ausführt). Der Basisfall ist T(n, 0) = O(n) (nur der besuchte Test).

Lösen Sie dies und ich glaube, Sie bekommen T (n, n) ist O (n * n!).

EDIT

Arbeits:

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!) 
+0

ich die Idee zu bekommen. Aber kannst du bitte erklären, wie du das nottest! innen groß O. – nirandi

+0

vielen Dank. das macht mehr Sinn. Der Anfang O (n) ist wegen der Foor-Schleife, die wir im Hauptcode haben, richtig? – nirandi

+1

Und auch ich denke, da für jeden Knoten die maximale Anzahl der zu besuchenden Knoten n-1 ist, denke ich, wir sollten T (n, n-1) nehmen. – nirandi

Verwandte Themen