2016-06-05 13 views
0

Ich habe einen Algorithmus, um ein Problem zu lösen, aber ich kenne seine Komplexität nicht. Der Algorithmus überprüft, ob alle Scheitelpunkte eines Graphen "gut" sind. Ein "guter" Eckpunkt ist ein Eckpunkt, der auf alle anderen Eckpunkte eines Graphen zugreifen kann, der einem Pfad folgt, der sich selbst gestartet hat.Komplexität dieses einfachen Algorithmus

public static boolean verify(Graph graph) 
{ 
    for(int i=0; i < graph.getVertex().size(); i++) 
    { 
     // List of vertexes visited 
     ArrayList<Character> accessibleVertex = new ArrayList<Character>(); 
     getChildren(graph.getVertex().get(i), graph.getVertex().get(i).getName(), accessibleVertex);  

     // If the count of vertex without father equals a count of the list of vertexes visited, his is a "good" vertex 
     if((graph.getVertex().size()-1) == accessibleVertex.size()) 
      return true; 
    } 

    return false; 
} 

private static void getChildren(Vertex vertex, char fatherName, ArrayList<Character> accessibleVertex) 
{ 
    // Ignore the 'father' 
    if(vertex.getName() != fatherName) 
     addIfUnique(vertex.getName(), accessibleVertex); 

    for(int i=0; i < vertex.getEdges().size(); i++) 
    { 
     getChildren(vertex.getEdges().get(i).otherVertex(), fatherName, accessibleVertex); 
    } 
} 

private static void addIfUnique(char name, ArrayList<Character> accessibleVertex) 
{ 
    boolean uniqueVertex = true; 

    for(int i=0; i < accessibleVertex.size(); i++) 
    { 
     if(accessibleVertex.get(i).equals(name)) 
      uniqueVertex = false; 
    } 

    if(uniqueVertex) 
     accessibleVertex.add(name); 
} 

Graph tested

Dank und sorry für mein Englisch.

+0

Mein erster Eindruck: O (n^3) – PseudoAj

+0

Verfahren namens 'addIfUnique' Einnahme eines 'ArrayList ' schlägt vor, dass Sie stattdessen 'Set ' verwenden sollten und nur 'add' aufrufen. –

+2

Ich denke, dass dieser Code möglicherweise endlos Schleife, wenn Zyklen in Ihrem Diagramm vorhanden sind. –

Antwort

2

ich denke, die Komplexität ist O (n^2), da Sie verwenden eine verschachtelte Schleife durch den Aufruf:

getChildren(graph.getVertex().get(i), graph.getVertex().get(i).getName(), accessibleVertex); 
+0

Also, die for-Schleife in 'verify' ruft' getChildren() 'auf, die eine for-Schleife enthält - das ist keine verschachtelte Schleife? –

+0

Denken Sie also, dass die asymptotische Komplexität O (n^2) wäre? –

+0

Nein, ich mache keinen Anspruch auf die richtige Komplexität; Ich frage nur "weil du keine verschachtelte Schleife benutzt hast". –