Я ищу помощь в понимании алгоритма обнаружения цикла Флойда. Я прошел объяснение в Википедии ( http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare )
Я могу видеть, как алгоритм обнаруживает цикл в O (N) времени. Однако я не могу представить себе тот факт, что как только указатели черепахи и зайца встречаются в первый раз, начало цикла можно определить, переместив указатель черепахи обратно, чтобы запустить, а затем переместив черепаху и зайца по одному шагу за раз. Точка, где они впервые встречаются, является началом цикла.
Может ли кто-нибудь помочь, предоставив объяснение, которое, я надеюсь, отличается от того, которое есть в Википедии, поскольку я не могу понять / представить его?
algorithms
linked-lists
Анураг Капур
источник
источник
fast
переменная, или «заяц», должна двигаться вдвое быстрее, чем черепаха, а не впереди?Ответы:
Вы можете обратиться к «Обнаружение начала цикла в односвязном списке» , вот выдержка:
Расстояние, пройденное= х + у
slowPointer
до встречиfastPointer
Так как
fastPointer
путешествует с удвоенной скоростьюslowPointer
, и время постоянно для обоих, когда достигают места встречи. Итак, используя простое соотношение скорости, времени и расстояния (slowPointer
пройденное на половину расстояния):Следовательно, перемещаясь
slowPointer
к началу связанного списка, делая обаslowPointer
иfastPointer
перемещая один узел за раз, они оба имеют одинаковое расстояние для покрытия .Они достигнут точки, где цикл начинается в связанном списке.
источник
Я видел принятый ответ как доказательство и в других местах. Однако, хотя его легко уловить, это неверно. Что это доказывает
То, что вы действительно хотите доказать, это (используя те же переменные, которые описаны в диаграмме в принятом ответе выше):
Итак, что мы хотим доказать:
Или что z конгруэнтно х (по модулю L)
Следующее доказательство имеет больше смысла для меня:
источник
Я нашел ответ на stackoverflow. Спасибо, если кто-то изучал это для меня. А для тех, кто, как я хотел получить объяснение, пожалуйста, обратитесь к: https://stackoverflow.com/questions/3952805/proof-of-detecting-the-start-of-cycle-in-linked-list Выбранный ответ на вопрос, это объясняет!
источник