Erläutern, wie der Suchzyklus-Startknoten in der Zyklus-verknüpften Liste funktioniert?
Verstehe ich, dass die Schildkröte und der Hase - Begegnung schließt die Existenz der Schleife, aber wie wirkt sich eine Bewegung der Schildkröte zu Anfang der verknüpften Liste, während der Hase am Treffpunkt, gefolgt, indem Sie einen Schritt zu einer Zeit zu machen, Sie treffen sich am Ausgangspunkt des Zyklus?
InformationsquelleAutor der Frage Passionate programmer | 2010-05-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist Floyd ' s Algorithmus für die Zyklus-Erkennung. Du fragst nach der zweiten phase des Algorithmus -- sobald Sie haben gefunden ein Knoten Teil eines Zyklus, wie findet man die start des Zyklus?
Im ersten Teil des Floyd-Algorithmus, der Hase bewegt sich zwei Schritte für jeden Schritt der Schildkröte. Wenn die Schildkröte und der Hase immer treffen, es ist ein Zyklus, und der Treffpunkt ist Teil des Zyklus, aber nicht unbedingt der erste Knoten des Zyklus.
Wenn die Schildkröte und der Hase treffen, die wir gefunden haben, die kleinsten die ich (die Anzahl der Schritte, die der Schildkröte), so dass Xi = X2i. Lassen mu stehen für die Anzahl der Schritte, um von X0um den Anfang des Zyklus, und lassen Sie lambda-stellen Sie die Länge des Zyklus. Dann i = mu + alambda, und 2i = mu + blambda, wobei a und b ganze zahlen bezeichnen, wie oft die Schildkröte und der Hase ging um den Zyklus. Subtrahieren
die erste Gleichung von der zweiten liefert i = (b-a)*lambda, also ich ist ein ganzzahliges Vielfaches
der lambda. Daher, Xi + mu = X - mu. Xi stellt den Treffpunkt von der Schildkröte und der Hase. Wenn Sie die Position der Schildkröte zurück zum Startknoten X0, und lassen Sie die Schildkröte und der Hase weiterhin mit der gleichen Geschwindigkeit, nach mu zusätzlichen Schritte der Schildkröte erreicht hat, X - mu, und der Hase wird erreicht haben, Xi + mu = X - mu, so dass der zweite Treffpunkt, kennzeichnet den Anfang des Zyklus.
InformationsquelleAutor der Antwort Jim Lewis
Lassen Sie mich versuchen zu klären, die Zyklus-Erkennung-Algorithmus, ist im http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare in meinen eigenen Worten.
Verweise ich auf die Abbildung in meiner Erklärung.
Wie es funktioniert
Wir haben eine Schildkröte und ein Hase (name der Zeiger) zeigt auf den Anfang der Liste mit einem Zyklus.
Lassen vermuten, dass, wenn wir uns bewegen Schildkröte 1 Schritt zu einer Zeit, und Hase 2 Schritte auf ein mal, Sie werden schließlich treffen sich an einem Punkt. Wir werden zeigen, dass zunächst diese Hypothese wahr ist.
Die Abbildung zeigt eine Liste mit einem Zyklus. Der Zyklus hat eine Länge von
n
und wir sind zunächstm
Schritte Weg von den Zyklus. Auch lassen Sie uns sagen, dass der Treffpunkt istk
Schritte entfernt von der Zyklus-Anfang und die Schildkröte und der Hase trifft nach insgesamti
Schritte.Den folgenden 2 Bedingungen halten muss:
Die erste sagt, dass die Schildkröte bewegt sich
i
Schritte und in dieseni
Schritte, es ruft zuerst an den Zyklus. Dann geht es durch den Zyklusp
Zeit für eine positive Zahlp
. Schließlich geht es überk
mehr Knoten, bis es erfüllt Hasen.Einer ähnliches gilt für Hasen. Es bewegt sich
2i
Schritte und in diesen2i
Schritte, es ruft zuerst an den Zyklus. Dann geht es durch den Zyklusq
Zeit für eine positive Zahlq
. Schließlich geht es überk
mehr Knoten, bis Sie auf die Schildkröte.Als Hase reist mit der doppelten Geschwindigkeit der Schildkröte, und die Zeit ist konstant für beide, wenn Sie erreichen den Treffpunkt.
So, mit einer einfachen Geschwindigkeit, Zeit und Distanz-relation,
Unter den m, n, k, p, q, die ersten beiden sind die Eigenschaften der gegebenen Liste. Wenn wir zeigen können, dass es mindestens ein Satz von Werten für k, q, p, macht diese Gleichung wahr ist, wir zeigen, dass die Hypothese korrekt ist.
Einer solchen Lösung ist wie folgt:
Wir können bestätigen, dass diese Werte wie folgt:
Für diesen Satz,
i
istNatürlich, Sie sollten sehen, dass dies nicht unbedingt die kleinste, die ich möglich. In anderen Worten, Schildkröte und Hase haben könnte, trafen sich bereits vor vielen Zeiten. Da wir allerdings zeigen, dass Sie treffen sich irgendwann mindestens einmal können wir sagen, dass die Hypothese korrekt ist. Also müssten Sie zu treffen, wenn wir bewegen Sie Schritt 1, und die anderen 2 Schritte auf einmal.
Wir können jetzt gehen Sie zum zweiten Teil des Algorithmus ist, wie zu finden, die Anfang des Zyklus.
Zyklus Anfang
Einmal die Schildkröte und der Hase treffen, lassen wir die Schildkröte zurück an den Anfang der Liste und halten Hasen, wo Sie sich trafen (die k Schritte von der Zyklus-Anfang).
Die Hypothese ist, dass, wenn wir uns von Ihnen bewegen sich mit der gleichen Geschwindigkeit (Schritt 1), das erste mal, dass Sie jemals wieder treffen wird der Zyklus Anfang.
Lasst uns beweisen, dass diese Hypothese.
Lasst uns zunächst annehmen, einige oracle-sagt uns, was m ist.
Dann, wenn wir uns von Ihnen bewegen sich die m + k Schritte, Schildkröte hätte, um an den Punkt gelangen, trafen Sie ursprünglich (k Schritte entfernt von der Zyklus-Anfang - in der Abbildung zu sehen).
Zuvor haben wir gezeigt, dass
m + k = (q - 2p) n
.Da m + k Schritte ist ein Vielfaches des Zyklus der Länge n, der Hase, in der Zwischenzeit gehen würde, durch die Schleife (q-2p) Zeit und würden kommen wieder an den gleichen Punkt (k Schritte von der Zyklus-Anfang).
Nun, anstatt Sie verschieben m + k Schritte, wenn wir Sie lassen sich nur bewegen, m-Schritte, Schildkröte ankommen würde, auf der Zyklus-Anfang. Hasen gehen würden, werden k Schritte kurz vor dem Abschluss (q-2p) Rotationen. Da begann es k Schritte vor der Zyklus-Anfang, Hase müsste, kommen am Zyklus-Anfang.
Als Ergebnis dieser erklärt Ihnen, Sie hätten ein treffen am Zyklus-Anfang nach einigen Anzahl der Schritte für die erste Zeit (erste Zeit, weil die Schildkröte gerade angekommen auf der Zyklus nach m Schritten und konnte es nie sehen Hasen, die bereits im Zyklus).
Nun wissen wir, dass die Anzahl der Schritte, die wir brauchen, um Sie zu bewegen, bis Sie sich treffen stellt sich heraus, dass der Abstand vom Anfang der Liste der Zyklus-Anfang, m. Natürlich, der Algorithmus braucht nicht zu wissen, was m ist. Es wird nur bewegen Sie beide die Schildkröte und der Hase einen Schritt zu einer Zeit, bis Sie sich treffen. Der Treffpunkt ist um den Zyklus zu starten und die Anzahl der Schritte, muss der Abstand (m) nach der Zyklus-Anfang. Angenommen, wir kennen die Länge der Liste, können wir auch, berechnen Sie die Länge des Zyklus der Subtraktion von m aus der Liste Länge aus.
InformationsquelleAutor der Antwort CEGRD
Siehe dieses Bild:
Zurückgelegten Strecke slowPointer vor der Sitzung = x + y
Zurückgelegten Strecke fastPointer vor der Sitzung = (x + y + z) + y
= x + 2y + z
Seit fastPointer Reisen mit Doppel - die Geschwindigkeit der slowPointer, und Zeit konstant für beide, wenn das erreichen der meeting-point.
So, mit einer einfachen Geschwindigkeit, Zeit und Distanz Verhältnis
2(x+y)= x+2y+z
=> x+2y+z = 2x+2y
=> x=z
Daher durch verschieben slowPointer auf den Anfang der verknüpften Liste, und macht sowohl slowPointer und fastPointer zum verschieben eines Knotens in einer Zeit, Sie haben beide den gleichen Abstand zu decken, .
Erreichen Sie an der Stelle, wo die Schleife beginnt in der verknüpften Liste.
InformationsquelleAutor der Antwort Old Monk
Old Monk ist einfach und unter-Antwort von Ihnen positiv bewertet werden erklärt finden, der Zyklus, wenn die schnellen Läufer vervollständigt nur einzigen vollständigen Zyklus. In dieser Antwort, die ich erklären der Fall, wenn der schnelle Läufer hat ausgeführt, die Schleife mehrere Male, bevor die langsam-Läufer betritt die Schleife.
Dasselbe Bild:
Sagen wir, der schnelle Läufer hat ausgeführt, die Schleife m mal, bevor Sie langsam und schnell erfüllen. Dies bedeutet, dass:
Da schnelle Läufe mit zweimal die Geschwindigkeit langsam ist, und dass Sie schon laufen zur gleichen Zeit, es bedeutet, dass, wenn wir die doppelte Distanz lief langsam bekommen wir die Strecke verlief durch schnell. So,
Lösung für x gibt,
Im real-Szenario würde es bedeuten, x = (m - 1) komplette Schleife läuft + eine zusätzliche Entfernung z.
Daher, wenn wir setzen einen pointer auf den Anfang der Liste und lassen Sie die anderen am Treffpunkt, dann verschieben Sie von der gleichen Geschwindigkeit führt in der in-Schleife Zeiger Abschluss m - 1, läuft der loop und dann treffen die anderen Zeiger direkt an den loop-Anfang.
InformationsquelleAutor der Antwort displayName
Zeitpunkt der ersten Kollision, Schildkröte bewegt m+k Schritte wie oben zeigen. Hase bewegt sich doppelt so schnell wie die Schildkröte, Bedeutung Hase bewegt 2(m+k) Schritte. Aus diesen einfachen Tatsachen ergeben sich die folgenden Graphen.
An diesem Punkt, verschieben wir die Schildkröte zurück an den start und erklären, dass sowohl Hase und die Schildkröte muss sich bewegen einen Schritt zu einer Zeit. Durch die definition, nach m Schritte, die Schildkröte wird am Anfang des Zyklus. Wo soll der Hase sein?
Hase wird auch am Anfang des Zyklus. Dies verdeutlicht die zweite Grafik: Wenn die Schildkröte bewegt wurde, zurück an den start, der Hase war k Schritte in Ihrem letzten Zyklus. Nach m Schritte, Hasen haben, wurde ein weiterer Zyklus und kollidierte mit Schildkröte.
InformationsquelleAutor der Antwort skedastik
Okay, so vermuten lässt der Hase und die Schildkröte treffen sich an einem Punkt, der k Schritte vom Beginn des Zyklus, die Anzahl der Schritte, bevor der Zyklus beginnt, wird mu und die Länge des Zyklus ist L.
Also nun an der Treffpunkt ->
Zurückgelegte Strecke Schildkröte = mu + a*L + k - Gleichung 1
(Schritte, die zum erreichen der zu Beginn des Zyklus + Schritte, die für die Abdeckung 'a' Iterationen des Zyklus + k Schritte vom start des Zyklus)
(wobei a eine positive Konstante)
Zurückgelegte Strecke der Hase = mu + b*L + k - Gleichung 2
(Schritte, die zum erreichen der zu Beginn des Zyklus + Schritte, die für die Abdeckung 'b' Iterationen des Zyklus + k Schritte vom start des Zyklus)
(wobei b eine positive Konstante und b>=a)
So dass die zusätzliche Distanz durch die Hase ist = Gleichung 2 - Gleichung 1 = (b-a)*L
Bitte beachten Sie, dass dieser Abstand auch gleich der Entfernung von der Schildkröte, von dem Ausgangspunkt, da der Hase bewegt sich 2-mal schneller als die Schildkröte. Dies kann gleichgesetzt werden 'mu+k', die auch die Entfernung der Treffpunkt vom Anfang, wenn wir nicht gehören mehrere Durchquerung des Zyklus.
So,
mu + k = (b-a)*L
So mu nur wenige Schritte von diesem Punkt führen würde, zurück an den Anfang des Zyklus (da k Schritte vom Anfang des Zyklus wurden bereits ergriffen, um zu erreichen den Treffpunkt). Dies könnte geschehen, in dem gleichen Zyklus oder nachfolgende Zyklen.
So, jetzt verschieben wir die Schildkröte zu Anfang der verknüpften Liste, wird es dauern, mu Schritten erreichen Sie den Ausgangspunkt des Zyklus und der Hase würde nehmen mu Schritten zu erreichen auch am Anfang des Zyklus und damit würden Sie beide treffen Sie auf den Ausgangspunkt des Zyklus.
P. S. Ehrlich gesagt, ich hatte die gleiche Frage wie der ursprüngliche poster in meinem Kopf, und ich lese die erste Antwort, Sie habe klar ein paar Sachen konnte ich aber nicht bekommen, um das endgültige Ergebnis klar und so versuchte ich, es zu tun, meinen eigenen Weg und finden es leichter zu verstehen.
InformationsquelleAutor der Antwort Prateek Jassal
Es ist sehr, sehr einfach. Sie können denken, in Bezug auf die Geschwindigkeit. Wenn der Hase, der zwei Knoten, und die Schildkröte bewegt sich ein Knoten, relativ zu Schildkröte Kaninchen bewegt sich ein Knoten(vorausgesetzt, die Schildkröte in Ruhe). Also, wenn wir uns bewegen, einen Knoten in die kreisförmig verlinkte Liste, die wir sind sicher gehen, treffen sich an diesem Punkt wieder.
Finden, nachdem das angeschlossene Punkt innerhalb des kreisförmig verlinkte Liste, das problem ist nun reduziert auf die Suche nach dem Schnittpunkt von zwei verkettete Liste problem.
InformationsquelleAutor der Antwort murali krish
Ansatz:
Gibt es zwei Zeiger:
Wenn die beiden Zeiger aufeinander treffen, beweist, dass es eine Schleife. Sobald Sie getroffen haben, einen der Knoten auf den Kopf und dann haben beide gehen von einem Knoten zu einem Zeitpunkt. Sie treffen sich am Anfang der Schleife.
Begründung:
Wenn sich zwei Menschen Spaziergang entlang einer Kreisbahn, einer von Ihnen mit zweimal der Geschwindigkeit der anderen, wo Sie sich treffen? Genau wo Sie gestartet.
Nehmen wir nun an, der schnelle Läufer hat einen Vorsprung von
k
Schritte in einen
Schritt Schoß. wo werden Sie sich treffen? Genau ann-k
Schritte. Bei dem langsamen Läufer gedeckt hat(n-k)
Schritte, die schneller Läufer würde abgedeckt habenk+2(n-k)
Schritte.(dh
k+2n-2k
Schritte ie2n-k
Schritte). also(n-k)
Schritte (Der Pfad ist kreisförmig, und wir sind nicht besorgt über die Anzahl der Runden, nach denen Sie sich treffen; Wir sind nur daran interessiert, die position wo Sie sich treffen).Nun, wie konnte der schnelle Läufer Holen den Vorsprung von
k
Schritte in den ersten Platz? Da nahm es die langsamen Läufer, die viele Stufen zum erreichen der Anfang der Schleife. So der Anfang der Schleife ist k Schritte von dem head-Knoten.Hinweis: dem Knoten, auf Dem beide Zeiger erfüllt ist
k
Schritte vom Beginn der Schleife (in der Schleife) und dem head-Knoten ist auchk
Schritte entfernt vom Anfang der Schleife. Wenn wir also Zeiger voran bei gleichem Tempo der 1 Schritt von bot diese Knoten, Sie treffen sich am Anfang der Schleife.Ich glaube, es ist einfach. Bitte lassen Sie mich wissen, wenn ein Teil mehrdeutig ist.
InformationsquelleAutor der Antwort Aadith
Reduzieren das problem auf ein-loop-problem, dann gehen Sie zurück zu das ursprüngliche problem
Finde ich folgende Erklärung intuitiver.
Nehmen Sie zwei Zeiger (1 = Schildkröte und 2 = Hase), die aus dem Kopf (O), 1 hat eine Schrittlänge von 12 hat eine Schrittlänge von 2. Denke über den moment, wenn 1 erreicht die start-Knoten des Zyklus (Eine).
Wollen wir die Antwort auf folgende Frage "Wo ist 2, wenn 1 ist in Einer?".
So,
OA = a
ist eine Natürliche Zahl (a >= 0
). Aber es kann geschrieben werden in der folgenden Weise:a = k*n + b
woa, k, n, b are natural numbers
:n
= die cycle-Längek >= 0
= konstant0 <= b <= n-1
Bedeutet es, dass
b = a % n
.E. g.: wenn
a = 20
undn = 8
=>k = 2
undb = 4
weil20 = 2*8 + 4
.Distanz von 1 ist
d = OA = a = k*n + b
. Aber in der gleichen Zeit, 2 decktD = 2*d = d + d = OA + d = OA + k*n + b
. Dies bedeutet, dass, wenn 2 ist in Eine es auf eink*n + b
. Wie Sie sehen können,k
ist die Anzahl der Runden, aber nach diesen Runden, 2 werden b weit von A. wir haben Also gefunden, wo 2 ist, wenn 1 ist in A. wir nennen diesen PunktB
woAB = b
.Nun, wir reduzieren das problem auf einen Kreis. Die Frage ist "Wo ist der Treffpunkt?". Wo ist das C?
In jedem Schritt, 2 verringert die Distanz von 1 mit
1
(sagen wir m), weil 1 immer weiter von 2 mit1
aber zur gleichen Zeit 2 geht näher 1 von2
.So, die Schnittmenge sein wird, wenn der Abstand zwischen 1 und 2 wird gleich null sein. Dies bedeutet, dass 2 reduziert die
n - b
Entfernung. Um dies zu erreichen, 1 machenn - b
Schritte, während 2 machen2*(n - b)
Schritte.So, der Schnittpunkt wird
n - b
weit von Eine (im Uhrzeigersinn), denn hier ist die Distanz durch 1bis es erfüllt 2. => der Abstand zwischen C und Eine istCA = b
weilAC = AB + BC = n - b
undCA = n - AC
. Glaube nicht, dassAC = CA
weil dieAC
Entfernung ist nicht eine triviale mathematische Distanz, es ist die Anzahl der Schritte zwischen Eine und C (wo Eine ist der Ausgangspunkt und C ist der Endpunkt).Nun, gehen wir zurück zu dem ursprünglichen schema.
Wissen wir, dass
a = k*n + b
undCA = b
.Können wir 2 neue Zeiger 1' und 1"wo 1' beginnt vom Kopf (O) und 1" beginnt ab dem Schnittpunkt (C).
Während 1' geht aus O zu Eine1" geht aus C zu Eine und weiterhin zu beenden
k
Runden. So, der Schnittpunkt ist Eine.InformationsquelleAutor der Antwort ROMANIA_engineer
Es ist eigentlich leicht zu beweisen, dass Sie beide treffen sich auf den Ausgangspunkt, wenn man die Mathematik hinter der Treffpunkt.
Zunächst lassen Sie m bezeichnen den Ausgangspunkt des Zyklus, in der verknüpften Liste , und n bezeichnen die Länge des Zyklus . Dann der Hase und die Schildkröte zu treffen , haben wir :
Besagt das mehr mathematisch :
also Sie treffen sich zur Zeit t die sollte ein Vielfaches der Länge des Zyklus . Dies bedeutet, dass Sie treffen an einem Ort, der
(t-m) modulo n = (0-m) modulo n = (-m) modulo n
.So, jetzt kommen wir zurück zu der Frage , ob Sie einen Zeiger vom Anfang der verketteten Liste , und zum anderen aus dem Schnittpunkt , nach m Schritten haben wir die Hasen (die sich innerhalb des Zyklus) kommen zu einem Punkt die
((-m) + m) modulo n = 0 modulo n
das ist nichts anderes als der Ausgangspunkt des Zyklus.So können wir sehen, dass nach m Schritten kommt es zu Beginn des Zyklus und die Schildkröte treffen, es gibt, wie es durchziehen wird m Schritte vom Anfang der verketteten Liste.Als Seite beachten ,können wir auch die Zeit berechnen, die von Ihrem Schnittpunkt auf diese Weise : Der Zustand
t = 0 modulo n
sagt uns, dass das treffen in einer Zeit, die einem vielfachen der Zyklus-Länge , und auch t sollte größer sein als mwie Sie entsprechen würde in den Zyklus . So dass die Zeit genommen wird, wird gleich die erste von mehreren ndie größer ist als m .InformationsquelleAutor der Antwort user1011
Alle der oben genannten Analyse, wenn Sie ein learn-by-example person, habe ich versucht zu schreiben, eine kurze Analyse und ein Beispiel, die helfen, erklärt die Mathematik-alle anderen versucht zu erklären. Hier gehen wir!
Analyse:
Wenn wir zwei Zeiger, der eine schneller als der andere, und verschieben Sie Sie zusammen zusammen, Sie werden schließlich wieder zu treffen, um anzuzeigen, ein Zyklus oder null, um anzugeben, kein Zyklus.
Finden den Startpunkt des Zyklus, lassen Sie ...
m
auch der Abstand von Kopf-zu Beginn des Zyklus;d
werden die Anzahl der Knoten im Zyklus;p1
werden, die Geschwindigkeit des langsameren Zeiger;p2
werden die Geschwindigkeit, der schnellere Zeiger, zB. 2 bedeutet, dass die Schritte, die durch zwei Knoten zu einem Zeitpunkt.Beachten Sie die folgenden Iterationen:
Aus der oben genannten Beispiel-Daten, können wir leicht entdecken, dass, Wann immer die schnellere und die langsamere Zeiger treffen, Sie sind
m
Schritte vom Anfang des Zyklus. Um dieses Problem zu lösen, setzen Sie den Zeiger schneller wieder auf den Kopf und legen Sie seine Geschwindigkeit auf die Geschwindigkeit des langsameren Zeiger. Wenn Sie treffen sich wieder, der Knoten ist der Beginn des Zyklus.InformationsquelleAutor der Antwort Steve
können sagen,
wir haben 2 Zeiger A und B, A läuft mit 1x Geschwindigkeit, B auf 2x Geschwindigkeit, sowohl am Anfang beginnen.
beim Einen erreicht N[0], B sollte bereits in N[m].
(Hinweis: Ein m Schritte, um zu erreichen, N[0], und B sollte m Schritte weiter)
Dann läuft k-weitere Schritte zu kollidieren, B,
d.h. A ist bei N[k], B N[m+2k]
(Hinweis: B sollte läuft für 2k-Schritten ausgehend von N[m])
Einem prallen B-N[k] und N[m+2k] beziehungsweise, es bedeutet
k=m+2k, also k = -m
So, um den Zyklus wieder auf N[0] N[k], müssen wir m mehr Schritte.
Einfach zu sagen, wir müssen Sie nur ausführen, m mehr Schritte nach fanden wir den Kollision-node. Wir können einen Zeiger zu laufen von Anfang an und ein Zeiger läuft aus der Kollision Knoten, Sie treffen sich zu N[0] nach m Schritten.
Daher der pseudo-code ist wie folgt:
InformationsquelleAutor der Antwort phdfong - Kenneth Fong
Denke ich nicht so es ist wahr, dass, wenn Sie sich treffen, ist der Ausgangspunkt. Aber ja, wenn der andere Zeiger(F) wurde auf dem meeting-point vor , als dass Zeiger wird am Ende der Schleife statt den Anfang der Schleife und den Zeiger(S) die zunächst von der Anfang der Liste wird es am Ende an den Anfang der Schleife. für zB:
InformationsquelleAutor der Antwort MrA
Eine einfache Erklärung mit der Idee der relative Geschwindigkeit lehrte in der high school - Physik 101 /Kinematik Vorträge.
Nehmen wir Abstand vom Anfang der verknüpften Liste zu starten, der Kreis ist
x
Hopfen. Nennen wir den start der Kreis als PunktX
(in caps - siehe Abbildung oben). Auch wir übernehmen die volle Größe des Kreises ist N Hopfen.Geschwindigkeit von Hase = 2 * Geschwindigkeit der Schildkröte. So, dass ist
1 hops/sec
und2 hops/sec
bzw.Wenn die Schildkröte erreicht das starten des Kreises
X
die Hasen müssen weiterx
hops entfernt am PunktY
in der Abbildung. (Weil Hase reiste zweimal in die Ferne, wie die Schildkröte).So, die Länge der übrigen Bogen im Uhrzeigersinn von X nach Y wäre
N-x
. Tseine zufällig auch die relative Distanz abgedeckt werden, die zwischen der Hase und die Schildkröte für Sie erfüllen zu können. Lassen Sie uns sagen, diese relative Distanz in der Zeitt_m
D. H. die Zeit, zu treffen. Die Relative Geschwindigkeit ist(2 hops/sec - 1 hops/sec)
d.h.1 hops/sec
. Also mit, relativer Abstand = relative Geschwindigkeit X Zeit, die wir erhalten,t
=N-x
Sek. So dauert esN-x
zu erreichen ist der Treffpunkt für die Schildkröte und der Hase.Nun in
N-x
Sek Zeit und bei1 hops/sec
speed, die Schildkröte, die war früher bei PunktX
wird die N-x-hops zum erreichen des meeting pointM
. Also, das heißt, der TreffpunktM
ist beiN-x
Hopfen gegen den Uhrzeigersinn vonX
= (was weiter impliziert) => dass esx
Verbleibende Entfernung vom PunktM
zuX
im Uhrzeigersinn.Aber
x
ist auch der Abstand zu erreichen, zeigenX
vom Anfang der verketteten Liste.Nun, wir kümmern uns nicht, was die Anzahl der hops
x
entspricht. Wenn wir eine Schildkröte am Anfang der LinkedList und eine Schildkröte am TreffpunktM
und lassen Sie Sie hüpfen/gehen, dann werden Sie treffen sich an PunktX
die den Punkt (oder Knoten), die wir brauchen.InformationsquelleAutor der Antwort Pranjal Mittal
Arbeiten mit einem Diagramm helfen würde. Ich versuche zu erklären, das problem ohne Gleichungen.
InformationsquelleAutor der Antwort shiva kumar
Es ist ein Fehler in die meisten Lösungen für dieses problem. Was ist, wenn der Letzte Knoten war mit dem ersten verbunden, und es war einfach eine Schleife? Was, wenn langsam und schnell trafen sich am Kopf der Schleife das erste mal?
Sie wäre nicht die richtige Antwort zu finden mit dieser Lösung.
Es gibt eine richtige Antwort auf die Frage, wie Sie diese situation vermeiden, aber angesichts der glücklichen Pfad, mit einer Anzahl an Knoten k vor der Schleife, hier ist eine einfache Erklärung:
(wenn Sie mehr wissen möchten über die real, verallgemeinerte Lösung, ping me)
-es gibt k Schritte vor dem loop. Wir wissen nicht, was k ist, und nicht brauchen, um das herauszufinden. Wir arbeiten Abstrakt mit nur k.
--Nach k Schritten
----- T ist bei Zyklus-Anfang
----- H k Schritte in Zyklus (er ging insgesamt 2k und somit k in der Schleife)
** Sie sind nun loopsize - k neben
(beachten Sie, dass k == K == mod(loopsize, k) --z.B. wenn ein Knoten ist 2 Schritte in eine 5 Knoten Zyklus ist auch 7, 12 oder 392 Schritte, also wie groß ist der Zyklus w.r.t k nicht Faktor bei der.
Da Sie zu fangen, zu einander in der Höhe von 1 Schritt pro Einheit von Zeit, weil man sich doppelt so schnell wie die anderen, Sie treffen sich auf loopsize - k.
Dies bedeutet, dass es dauern wird, k Knoten zu erreichen, der Anfang des Zyklus und damit der Abstand von Kopf bis cyclestart und Kollision cyclestart sind die gleichen.
So, jetzt nach der ersten Kollision bewegen T zurück zum Kopf. T und H treffen an der cyclestart, wenn Sie sich bewegen bei der rate von 1 pro. (in k Schritten)
Dies bedeutet, dass der Algorithmus:
//kümmern sich um den Fall, wenn k=0 oder T und H trafen sich am Kopf der Schleife durch
die Berechnung der Länge der Schleife
--count die Länge des Zyklus durch verschieben von T oder H, um es mit einem Zähler
--der Mauszeiger T2 auf den Kopf der Liste
--bewegen Sie den Zeiger Länge des Zyklus Schritte
--bewegen Sie einen anderen Zeiger H2-an-Kopf -
--verschieben von T2 und H2 im tandem, bis Sie sich treffen, am Anfang des Zyklus
das ist es!
InformationsquelleAutor der Antwort Droid Teahouse
Ich weiß, es ist bereits eine akzeptierte Antwort für dieses problem, aber ich werde trotzdem versuchen, zu beantworten in einer flüssigen Art und Weise.
Übernehmen :
Nun, lassen Sie den Hasen und die Schildkröte treffen sich nach der Zeit " t " von Anfang an.
Beobachtungen:
Wenn, Strecke durch die Schildkröte = v*t = x + (b-k) (sagen)
Dann Strecke durch die Hase = 2*v*t = x + (b - k) + b (da der Hase durchquert hat den geloopten Teil schon einmal)
Nun, dort treffen die Zeiten sind gleich.
=> x + 2*b - k = 2* (x + b - k)
=> x = k
Das bedeutet natürlich, dass die Länge des Pfads, der nicht geloopt ist der gleiche wie der Abstand von dem Ausgangspunkt der Schleife von dem Punkt, wo beide sich treffen.
InformationsquelleAutor der Antwort n0nChun