Ми можемо усунути всі вершини, крім однієї, перевіривши наявність ребер оскільки ми можемо усунути одну можливість для кожного ребра, який ми перевіряємо. Зокрема, якщо є край, що йде від до , ми усуваємо і переходимо до (оскільки з нього можна дістати іншу вершину); якщо ні, то ми усуваємо (оскільки це не може бути досягнуто з ). Як тільки ми дістаємося до останньої вершини, будь-яку вершину не буде усунено, слід порівнювати один з одним вершину (переконайтеся, що дотримується умова суперзірки: є край, що входить, але не виходить), поки він не буде усунутий або підтверджений як суперзірка. Деякі псевдокоди:x y x y y xn - 1хухуух
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
Розглянемо приклад, щоб проілюструвати метод. Візьміть цей масив із вихідною вершиною вгорі та пунктом призначення збоку. 1 позначає край:
12341-11121-11300-04111-
Я вичлену вершини, які ми виключили як потенційних суперзірок. Я використовую зелений і червоний, щоб позначити краї, які ми дивимось, коли вони роблять, і не містять краю, який ми шукаємо, і синім, щоб вказати, де ми вже шукали.
Почнемо з перегляду вершин 1 і 2.
12341-11121-11300-04111-
Зелене число показує, що є край від 2 до 1, тому ми усуваємо 2 і шукаємо край від 3 до 1:
12341-11121-11300-04111-
Ми бачимо, що немає такого краю, тому ми усуваємо 1 і беремо 3 як нашу поточну вершину. Нагадаємо, що ми вже ліквідували 2, тож подивіться, чи є край від 4 до 3:
12341-11121-11300-04111-
Існує ребро від 4 до 3, тому ми усуваємо 4. На цьому етапі ми усунули всі вершини, крім однієї (3), тому перевірте його краї та подивіться, чи відповідає він:
12341-11121-11300-04111-
Є край від 1 до 3, але не зворотний, тому 3 все ще є кандидатом.
12341-11121-11300-04111-
Також є край від 2 до 3, але не зворотний, тому 3 все ще є кандидатом.
12341-11121-11300-04111-
Є край від 4 до 3, але не 3 до 4; що завершує нашу перевірку 3-х країв, і ми виявили, що це насправді суперзірка.
Оскільки ми усуваємо одну вершину як можливу суперзірку на кожній з перших
перевірок ребра , найкращим випадком є те, що а перевірка усуває кінцеву вершину на складність . У гіршому випадку (остання або друга-остання вершина - це суперзірка, або остаточна перевірка дискваліфікує її), після першого порівняння ми порівнюємо кандидата з більшою кількістю вершин на , для найгірша складність ( ). Отже, цей алгоритм
.n n n - 1 2 × ( n - 1 ) 3 n - 3 O ( n ) Θ ( n )n - 1ннn - 12 × ( n - 1 )3 п - 3O ( n )Θ ( n )