Http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare adresinde sağlanan döngü algılama algoritmasını kendi kelimelerimle açıklığa kavuşturmaya çalışayım .
Nasıl çalışır
Yukarıdaki diyagramda olduğu gibi, bir döngü ile listenin başına işaret eden bir kaplumbağa ve bir tavşan (işaretçilerin adı) alalım.
Kaplumbağayı bir seferde 1 adım hareket ettirirsek ve her seferinde 2 adım tavşan yaparsak, sonunda bir noktada buluşacaklarını varsayalım. Öncelikle bu hipotezin doğru olduğunu gösterelim.
Şekilde, döngülü bir liste gösterilmektedir. Döngünün uzunluğu vardır n
ve başlangıçta m
döngüden birkaç adım ötedeyiz. Ayrıca, buluşma noktasının k
döngü başlangıcından birkaç adım uzakta olduğunu ve kaplumbağa i
toplam adım attığında kaplumbağa ve tavşanın bir araya geldiğini varsayalım . (Hare 2i
o zamana kadar toplam adım atardı .).
Aşağıdaki 2 koşul geçerli olmalıdır:
1) i = m + p * n + k
2) 2i = m + q * n + k
Birincisi, kaplumbağanın i
basamakları hareket ettirdiğini ve bu i
adımlarda önce döngüye girdiğini söylüyor . Daha sonra p
pozitif bir sayı için döngü sürelerinden geçer p
. Sonunda k
tavşanla karşılaşana kadar daha fazla düğümün üzerinden geçer .
Benzer bir şey tavşan için de geçerlidir. 2i
Adımları taşır ve bu 2i
adımlarda önce döngüye girer. Daha sonra q
pozitif bir sayı için döngü sürelerinden geçer q
. Sonunda k
kaplumbağa ile tanışana kadar daha fazla düğümün üzerinden geçer .
Tavşan iki kat daha fazla seyahat ederken kaplumbağa hızı ve buluşma noktasına ulaştıklarında zaman sabit kalır.
Yani basit hız, zaman ve mesafe ilişkisi kullanarak,
2 ( m + p * n + k ) = m + q * n + k
=> 2m + 2pn + 2k = m + nq + k
=> m + k = ( q - 2p ) n
M, n, k, p, q arasında ilk ikisi verilen listenin özellikleridir. Bu denklemi doğru yapan k, q, p için en az bir değer kümesi olduğunu gösterebilirsek hipotezin doğru olduğunu gösteririz.
Böyle bir çözüm kümesi aşağıdaki gibidir:
p = 0
q = m
k = m n - m
Bu değerlerin aşağıdaki gibi çalıştığını doğrulayabiliriz:
m + k = ( q - 2p ) n
=> m + mn - m = ( m - 2*0) n
=> mn = mn.
Bu set için, i
olduğu
i = m + p n + k
=> m + 0 * n + mn - m = mn.
Tabii ki, bunun mutlaka mümkün olan en küçük şey olmadığını görmelisiniz. Başka bir deyişle, kaplumbağa ve tavşan daha önce birçok kez tanışmış olabilir. Ancak, bir noktada buluştuklarını en azından bir kez hipotezin doğru olduğunu söyleyebiliriz. Bu yüzden, birini bir adım diğerini 2 adım hareket ettirirsek buluşmaları gerekir.
Şimdi algoritmanın, döngünün başlangıcını nasıl bulacağımız ikinci kısmına gidebiliriz.
Döngü Başlangıcı
Kaplumbağa ve tavşan bir araya geldiğinde, kaplumbağayı listenin başına geri koyalım ve tavşanı tanıştıkları yerde tutalım (bu, döngü başlangıcından k adım uzakta).
Hipotez, aynı hızda hareket etmelerine izin verirsek (her ikisi için 1 adım), ilk kez tekrar buluştuklarında döngü başlangıcı olacaktır.
Bu hipotezi ispatlayalım.
İlk önce bazı kehanetlerin m'nin ne olduğunu söylediğini varsayalım.
Daha sonra, m + k adımlarını hareket ettirmelerine izin verirsek, kaplumbağa orijinal olarak tanıştıkları noktaya gelmelidir (k döngü başlangıcından uzaklaşır - şekle bakın).
Daha önce bunu göstermiştik m + k = (q - 2p) n
.
M + k adımları n döngü uzunluğunun bir katı olduğundan, tavşan, bu arada, döngü (q-2p) sürelerinden geçer ve aynı noktaya geri döner (k döngü başlangıcından uzaklaşır).
Şimdi, m + k adımlarını hareket ettirmelerine izin vermek yerine, sadece m adımlarını hareket ettirmelerine izin verirsek, kaplumbağa döngü başlangıcına ulaşacaktır. Tavşan, (q-2p) rotasyonlarını tamamlamadan k adım kısa olur. Döngü başlangıcından önce k adımları başladığından, tavşan döngü başlangıcına varmak zorunda kalacaktı.
Sonuç olarak, bu, ilk kez bir dizi adımdan sonra başlayan döngüde buluşmaları gerektiğini açıklar (çünkü ilk kez kaplumbağa m adımlarından sonra döngüye yeni geldi ve zaten içinde olan tavşanı göremedi. devir).
Artık bildiğimiz kadar onları hareket ettirmemiz gereken adım sayısının listenin başlangıcından döngü başlangıcına kadar olan uzaklık olduğunu biliyoruz, m. Tabii ki, algoritma m'nin ne olduğunu bilmek zorunda değildir. Sadece kaplumbağaları ve tavşanları buluşana kadar her seferinde bir adım hareket ettirecektir. Buluşma noktası döngü başlangıcı olmalı ve adım sayısı döngü başlangıcına olan mesafe (m) olmalıdır. Listenin uzunluğunu bildiğimizi varsayarsak, m'yi liste uzunluğundan çıkarma döngüsünün uzunluğunu da hesaplayabiliriz.