Floyd's Cycle Detection Algorithmus | Bestimmung des Startpunktes des Zyklus


32

Ich suche Hilfe beim Verständnis von Floyds Algorithmus zur Zykluserkennung. Ich habe die Erklärung auf Wikipedia durchgearbeitet ( http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare )

Ich kann sehen, wie der Algorithmus den Zyklus in O (n) -Zeit erkennt. Ich kann mir jedoch nicht vorstellen, dass der Beginn des Zyklus bestimmt werden kann, wenn sich die Schildkröten- und Hasenzeiger zum ersten Mal treffen, indem der Schildkrötenzeiger zum Start zurückbewegt wird und dann Schildkröte und Hase schrittweise nacheinander bewegt werden. Der Punkt, an dem sie sich zum ersten Mal treffen, ist der Beginn des Zyklus.

Kann jemand mit einer Erklärung helfen, die sich hoffentlich von der auf Wikipedia unterscheidet, da ich sie nicht verstehen / visualisieren kann?


3
Ich habe die Antwort auf stackoverflow gefunden. Vielen Dank, wenn jemand nach mir gesucht hat. Und für diejenigen, die wie ich eine Erklärung wollten, lesen Sie bitte: stackoverflow.com/questions/3952805/… Die gewählte Antwort auf die Frage erklärt es!
Anurag Kapur

Hi @Anurag. Nur zu Ihrer Information, ich habe einen Blog - Post auf der „Schildkröte und der Hase“ getan Algorithmus hier
Kyle

Wissen Sie, warum sich die fastVariable oder der "Hase" doppelt so schnell bewegen muss wie die Schildkröte und nicht nur eine?
devdropper87

Antworten:


47

Sie können sich auf "Erkennen des Starts einer Schleife in einer einfach verknüpften Liste" beziehen. Hier ist ein Auszug:

Bildbeschreibung hier eingeben

Zurückgelegte Strecke slowPointervor dem Treffen =x+y

fastPointer =(x+y+z)+y

Da fastPointerreist man mit doppelter Geschwindigkeit slowPointer, und die Zeit ist für beide konstant, wenn sie den Treffpunkt erreichen. Also mit einfachen Verhältnissen von Geschwindigkeit, Zeit und Entfernung ( slowPointerzurückgelegte halbe Strecke):

2dist(slowPointer)=dist(fastPointer)2(x+y)=x+2y+z2x+2y=x+2y+zx=z

Daher durch Bewegen slowPointerder verketteten Liste zu beginnen, und beide zu machen slowPointerund fastPointereinen Knoten zu einer Zeit zu bewegen, sie haben beide dieselbe Strecke zurücklegen .

Sie erreichen den Punkt, an dem die Schleife in der verknüpften Liste beginnt.


2
Hier haben Sie die Annahme getroffen, dass sie sich nach einer Umdrehung treffen werden. Es kann Fälle geben (bei denen der Zyklus klein ist), in denen sie sich nach einem bestimmten Nein treffen. von Drehungen.
Navjot Waraich

1
@JotWaraich das Bild ist nicht repräsentativ für alle Fälle; Die Logik bleibt jedoch bestehen
denis631

3
Dies ist die direkteste Antwort zu diesem Algorithmus im gesamten Internet
Marshall X

7

Ich habe die akzeptierte Antwort auch an anderer Stelle als Beweis gesehen. Es ist zwar leicht zu fassen, aber falsch. Was es beweist, ist

x=z

Was Sie wirklich beweisen möchten, ist (unter Verwendung der gleichen Variablen wie im Diagramm in der akzeptierten Antwort oben beschrieben):

z=x mOd (y+z)

(y+z)L

Was wir also beweisen wollen, ist:

z=x mOd L

Oder dass z kongruent zu x ist (Modulo L)

Der folgende Beweis macht für mich mehr Sinn:

M=x+y

2(x+y)=M+kLkx+yL

x+y=kL

x=kL-y

xLyMx+y


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.