Вот попытка неофициального доказательства.
Форма цикла не имеет значения. Он может иметь длинный хвост и петлю к концу или просто петлю от начала до конца без хвоста. Независимо от формы цикла ясно одно - указатель черепахи не может догнать указателя зайца. Если они когда-либо встретятся, указатель зайца должен догнать указатель черепахи сзади.
Установив это, рассмотрим две возможности:
- указатель зайца - один шаг позади указателя черепахи.
- указатель зайца находится в двух шагах от указателя черепахи.
Все большие расстояния со временем сократятся до одного или двух.
Если предположить, что указатель черепахи всегда перемещается первым (может быть и наоборот), то в первом случае указатель черепахи делает один шаг вперед. Теперь расстояние между ними равно 2. Когда указатель зайца делает 2 шага, они приземляются на одном узле. Вот то же самое, проиллюстрированное для облегчения понимания. Слишком много текста может помешать.
♛ = hare
♙ = tortoise
X = both meet
..♛♙... #1 - Initially, the hare is one step behind the tortoise.
..♛.♙.. #2 - Now the tortoise takes one step. now hare is two steps behind.
....X.. #3 - Next, the hare takes two steps and they meet!
Теперь давайте рассмотрим второй случай, когда расстояние между ними равно 2. Медленный указатель перемещается на один шаг вперед, а расстояние между ними становится равным 3. Затем быстрый указатель перемещается вперед на два шага, а расстояние между ними уменьшается до 1, что идентичен первому случаю, в котором мы уже доказали, что они встретятся еще на одном этапе. Опять же, проиллюстрировано для облегчения понимания.
.♛.♙... #1 - Initially, the hare is two steps behind the tortoise.
.♛..♙.. #2 - Now the tortoise takes one step and they become three steps apart.
...♛♙.. #3 - Next, the hare takes two steps which is identical to previous case.
Теперь, что касается того, почему этот алгоритм гарантированно находится в O (n), используйте то, что мы уже установили, что заяц встретит черепаху, прежде чем он продвинется вперед. Это означает, что как только оба окажутся внутри петли, прежде чем черепаха завершит еще один раунд, она встретит зайца, поскольку заяц движется в два раза быстрее. В худшем случае цикл будет кругом с n узлами. В то время как черепаха может завершить только один раунд за n шагов, заяц может пройти два раунда за это время. Даже если заяц пропустил черепаху в первом раунде (что он и сделает), он наверняка догонит черепаху во втором раунде.