İşte Joe ile bağlantılı makaleden algoritmayı ayrıntılandıran cevap: http://arxiv.org/abs/0805.1598
Öncelikle , böl ve yönet işlevini kullanan bir Θ ( n günlüğün ) algoritmasını düşünelim .
1) Böl ve Yönet
Biz verilir
bir1, bir2, … , B1, b2, … Bn
Şimdi böl ve kullan fethetmek için, bazı m = Θ ( n ) için diziyi elde etmeye çalışıyoruz
[ a1, bir2, … , Am, b1, b2, … , Bm] , [ am + 1, … , An, bm + 1, … Bn]
ve tekrarla.
Kısım dikkat edin b1, b2, … Bm, birm + 1, … An
bir çevrimsel kaydırma olan
birm + 1, … An, b1, … Bm
m yerler tarafından .
Bu bir klasiktir ve yerinde üç tersine ve O ( n ) zamanında yapılabilir.
Böylelikle bölme ve fethetme, size T ( n ) = 2 T ( n / 2 ) + Θ ( n ) 'e benzer bir özyinelemeyle bir Θ ( n günlüğün ) algoritması verir .T( n ) = 2 T( n / 2 ) + Θ ( n )
2) Permütasyon Çevrimleri
Şimdi, soruna başka bir yaklaşım, permütasyonu bir ayrık döngü seti olarak düşünmektir.
Permütasyon (başlangıç varsayılarak verilmiştir 1 )
j ↦ 2 jşık2 n + 1
Bir şekilde döngülerin tam olarak ne olduğunu biliyorsak, sabit fazladan boşluk kullanarak, bir element bir seçerek bu elementin nereye gittiğini (yukarıdaki formülü kullanarak) belirleyerek elementi hedef konuma geçici uzaya koyabiliriz. Bu hedef konuma bir elemanı ve döngü boyunca devam edin. Bir döngü bittikten sonra bir sonraki döngünün bir öğesinin üzerine gideriz ve bu döngüyü izleriz.
Bu bize bir O ( n ) zaman algoritması verirdi , ancak bizim “bir şekilde tam döngülerin ne olduğunu bildiğimizi” ve bu kitap tutma işlemini 0 ( 1 ) alan sınırlandırması içinde yapmaya çalıştığımızı ve bu problemi zorlaştıran şeyin olduğunu varsayıyor .
Makalenin sayı teorisini kullandığı yer burasıdır.
Bu durumda, bu gösterilebilir zaman 2 n + 1 = 3k , pozisyonlarda elemanları 1 , 3 , 32, … , 3k - 1 farklı döngülerinde ve her çevrim pozisyonunda bir eleman içerir 3m, m ≥ 0 .
Bu, 2( Z / 3k)* bir jeneratör olduğu gerçeğini kullanır .
Bu nedenle, 2 n + 1 = 3k olduğunda, takip döngüsü yaklaşımı bize her döngü için olduğu gibi tam olarak nerede başlayacağımızı biliyoruz: O ( n ) zaman algoritmasını verir : 3 gücü ( 1 dahil ) (bunlar hesaplanabilir) 0 ( 1 ) boşluk).
3) Son Algoritma
Şimdi yukarıdaki ikisini birleştiriyoruz: Divide and Conquer + Permütasyon Çevrimleri.
Bir bölme yapmak ve ele ancak çekme m , böylece 2 m + 1 arasında bir güç 3 ve m = Θ ( n ) .
Bu yüzden, her iki "yarıya" da tekrarlamak yerine, sadece bir tanesine yineleniyoruz ve Θ ( n ) fazladan iş yapıyoruz .
Bu bize tekrarlama T( n ) = T( C n ) + Θ ( n ) (bazı 0 < c < 1 ) verir ve böylece bize O ( n ) zamanı, 0 ( 1 ) uzay algoritması verir!