Wir können alle Eckpunkte bis auf einen beseitigen, indem wir prüfen, ob Kanten vorhanden sind, da wir für jede von uns überprüfte Kante eine Möglichkeit beseitigen können. Insbesondere wenn es eine Kante gibt, die von x nach y geht , eliminieren wir x und bewegen uns weiter nach y (da von dort aus ein anderer Scheitelpunkt erreicht werden kann); wenn nicht, eliminieren wir y (da es von x aus nicht erreichbar ist ). Sobald wir den letzten Scheitelpunkt erreicht haben, sollte jeder Scheitelpunkt, der nicht beseitigt ist, miteinander verglichen werden (stellen Sie sicher, dass die Superstar-Bedingung eingehalten wird: Es gibt eine Kante, die ankommt, aber nicht abgeht), bis er beseitigt oder als Superstar bestätigt wird. Ein Pseudocode:n−1xyxyyx
vertex superstar(graph g)
current vertex = first
# Go through each vertex
for each subsequent vertex in g ("next")
# If there's an edge from this to the next, we eliminate this one [move to the new one].
# If not, we just stay here.
if edge exists from current to next
candidate = next
end if
end for
# Now we are on the final remaining candidate, check whether it satisfies the requirements.
# just a rename for clarity
candidate = current
for each other vertex in g
if edge from current to other exists
return null
else if no edge from other to current
return null
end if
end for
return candidate
end superstar
Lassen Sie uns ein Beispiel durchgehen, um die Methode zu veranschaulichen. Nehmen Sie dieses Array mit dem Quellscheitelpunkt oben und dem Ziel an der Seite. 1 zeigt eine Kante an:
12341−11121−11300−04111−
Ich werde die Eckpunkte, die wir als potenzielle Superstars ausgeschlossen haben, grau machen. Ich werde grün und rot verwenden, um die Kanten anzuzeigen, auf die wir schauen, wenn sie die gesuchte Kante enthalten, und blau, um anzuzeigen, wo wir bereits gesucht haben.
Zunächst betrachten wir die Eckpunkte 1 und 2.
Die grüne Zahl zeigt an, dass es eine Kante von 2 bis 1 gibt, also eliminieren wir 2 und suchen nach einer Kante von 3 bis 1 :
12341−11121−11300−04111−
12341−11121−11300−04111−
Wir sehen, dass es keine solche Kante gibt, also eliminieren wir 1 und nehmen 3 als unseren aktuellen Scheitelpunkt. Denken Sie daran, dass wir 2 bereits eliminiert haben, und prüfen Sie, ob es eine Kante von 4 nach 3 gibt:
12341−11121−11300−04111−
Da es eine Kante von 4 bis 3 gibt, eliminieren wir 4. An diesem Punkt haben wir alle Ecken bis auf einen (3) eliminiert. Sehen Sie sich also die Kanten an und prüfen Sie, ob sie qualifiziert sind:
12341−11121−11300−04111−
Es gibt eine Kante von 1 bis 3, aber nicht die Umkehrung, so dass 3 immer noch ein Kandidat ist.
12341−11121−11300−04111−
There is also an edge from 2 to 3 but not the reverse, so 3 is still a candidate.
12341−11121−11300−04111−
There is an edge from 4 to 3 but not 3 to 4; that completes our check of 3's edges and we have found that it is, in fact, a superstar.
Since we eliminate one vertex as a possible superstar on each of the first
n−1 edge checks, the best case is that the nth check eliminates the
final vertex for a complexity of n. In the worst case (the last or
second-to-last vertex is a superstar, or the final check disqualifies it), after the first n−1 comparisons we compare the candidate
with 2×(n−1) more vertices, for a worst case complexity of 3n−3 (O(n)). So, this algorithm is
Θ(n).