Какой лучший (по временной сложности) алгоритм для нахождения цикла в ориентированном графе? - PullRequest
0 голосов
/ 14 ноября 2010

Также есть какие-то рандомизированные алгоритмы для этого.Мне нужно найти один цикл как можно быстрее, а не все циклы.

Ответы [ 3 ]

3 голосов
/ 14 ноября 2010

самым быстрым будет только обход глубины в первую очередь. это потому, что вы не указываете какую-либо конкретную топологию, и поэтому любой другой подход может столкнуться с худшим наихудшим случаем. Асимптотически O (| E |). то, что вы делаете, это помечаете каждый узел уникальным временем, когда вы вводите его, когда выполняете повторную процедуру, и как только вы находите узел, у которого уже есть метка времени, происходит ваш цикл и вы останавливаетесь.

2 голосов
/ 14 ноября 2010

Я не знаю, что это возможно сделать в общем случае, но если вы знаете определенные свойства графика (такие как «расстояние от цикла-свободности», как описано в статье ниже), существуют рандомизированныеалгоритмы, которые с высокой вероятностью быстро найдут цикл.В частности, см. Первый алгоритм в разделе 3 связанной статьи с соответствующим анализом, объясняющим, как извлечь цикл.

Что касается детерминированных алгоритмов, ответ г-на Саурава является правильным.В худшем случае вам, по крайней мере, придется сканировать весь ввод, чтобы правильно определить, существует ли цикл, для которого уже требуется время O (| V | + | E |).

[1] http://arxiv.org/abs/1007.4230

2 голосов
/ 14 ноября 2010

Какой лучший (по временной сложности) алгоритм поиска цикла в ориентированном графе?

Алгоритм сильносвязанных компонент Тарьяна . Временная сложность, если O (| V | + | E |).

...