Misalkan anda memiliki sebuah fungsi f: S → S dan nilai awal apapun x0 ∈ S
(dalam visualisasi ini, kita terbatas ke f(x) = (A*x^2 + B*x + C) % M dan x0 % M maka fungsi f memiliki domain dan range ∈ [0..M-1]).
Barisan dari nilai-nilai fungsi iterasi:
{x0, x1 = f(x0), x2 = f(x1), ..., xi = f(xi-1), ...}
harus pada akhirnya menggunakan nilai yang sama dua kali (siklus), yaitu a ≠ b dimana xa = xb.
Sejak saat itu, barisan tersebut akan berlanjut dengan mengulang nilai-nilai siklus dari xa ke xb-1.
Biarkan mu (μ) menjadi indeks terkecil dan biarkan lambda (λ) (panjang siklus) menjadi bilangan bulat positif terkecil dimana xμ = xμ+λ.
Masalah pencarian-siklus: Temukan μ dan λ, diberikan f dan x0.
Anda dapat membuat fungsi sendiri f(x) = (A*x2 + B*x + C) % M di sini.
Anda juga dapat mengeset nilai x0 anda sendiri, yang harus berada dalam ∈ [0..M-1].
Pencarian-Siklus Penyu-Kelinci oleh Floyd adalah salah satu algoritma yang dapat menyelesaikan masalah ini secara efisien baik dari segi kompleksitas waktu dan ruang.
Algoritma ini hanya membutuhkan waktu O(μ+λ) dan ruang O(1) untuk melakukan tugasnya.
Ini adalah visualisasi dari algoritma Pencarian-Siklus Penyu-Kelinci oleh Floyd.
Bentuk dari rho (ρ) dari barisan nilai-nilai fungsi iterasi yang didefinisikan oleh f(x) dan x0 secara jelas memvisualisasikan μ dan λ.
VisuAlgo menggunakan simpul-simpul hijau untuk merepresentasikan penyu (t) dan simpul-simpul oranye untuk merepresentasikan kelinci (h).
Kita mulai dari x0.
Ketika penunjuk penyu != penunjuk kelinci, kita memajukan penyu/kelinci sebesar satu langkah/dua langkah ke nilai-nilai mereka yang berikutnya dengan memanggil f(penyu)/f(f(kelinci)).
Kita mengembalikan kelinci kembali ke x0 dan membiarkan penyu berada di posisinya yang sekarang.
Lalu, kita secara iteratif memajukan kedua penunjuk ke nilai-nilai mereka yang berikutnya sebesar satu langkah karena ini menjaga gap dari penyu dan kelinci sebesar kλ.
Pertama kalinya kedua penujuk sama memberitahukan kita nilai dari μ.
Sekali lagi, kita biarkan penyu berada tetap pada posisinya dan set kelinci tepat disebelahnya.
Lalu, kita secara iteratif memindahkan kelinci ke nilai berikutnya sebesar satu langkah.
Pertama kalinya kedua penunjuk sama memberitahukan kita nilai dari λ.
Anda dapat menggunakan/memodifikasi kode implementasi algoritma Floyd Cycle-Finding kami:
UVa00350.cpp
UVa00350.java
UVa00350.py
UVa00350.ml