Inilah jawaban yang menguraikan algoritma dari makalah yang dihubungkan oleh Joe: http://arxiv.org/abs/0805.1598
Pertama mari kita perhatikan algoritma yang menggunakan divide dan conquer.Θ(nlogn)
1) Membagi dan Taklukkan
Kita diberikan
a1,a2,…,b1,b2,…bn
Sekarang untuk menggunakan membagi dan menaklukkan, untuk beberapa , kami mencoba untuk mendapatkan arraym=Θ(n)
[a1,a2,…,am,b1,b2,…,bm],[am+1,…,an,bm+1,…bn]
dan berulang.
Perhatikan bahwa bagian adalah perubahan siklik darib1,b2,…bm,am+1,…an
am+1,…an,b1,…bm
oleh tempat.m
Ini klasik dan dapat dilakukan di tempat dengan tiga pembalikan dan dalam waktu .O(n)
Dengan demikian membagi dan menaklukkan memberi Anda algoritma , dengan rekursi yang mirip dengan .Θ(nlogn)T(n)=2T(n/2)+Θ(n)
2) Siklus Permutasi
Sekarang, pendekatan lain untuk masalah ini adalah mempertimbangkan permutasi sebagai satu set siklus terpisah.
Permutasi diberikan oleh (dengan asumsi mulai dari )1
j↦2jmod2n+1
Jika kita entah bagaimana tahu persis siklusnya, dengan menggunakan ruang ekstra konstan, kita dapat mewujudkan permutasi dengan memilih elemen , menentukan ke mana elemen itu pergi (menggunakan rumus di atas), meletakkan elemen di lokasi target ke dalam ruang sementara, menempatkan elemen ke lokasi target itu dan melanjutkan sepanjang siklus. Setelah kita selesai dengan satu siklus kita pindah ke elemen siklus berikutnya dan ikuti siklus itu dan seterusnya.AA
Ini akan memberi kita algoritme waktu , tetapi mengasumsikan bahwa kita "entah bagaimana tahu siklus pastinya" dan mencoba melakukan pembukuan dalam batasan ruang Inilah yang membuat masalah ini sulit.O(n)O(1)
Di sinilah makalah ini menggunakan teori bilangan.
Dapat ditunjukkan bahwa, dalam kasus ketika , elemen-elemen pada posisi , berada dalam siklus yang berbeda dan setiap siklus mengandung elemen pada posisi .2n+1=3k13,32,…,3k−13m,m≥0
Ini menggunakan fakta bahwa adalah penghasil .2(Z/3k)∗
Jadi ketika , ikuti pendekatan siklus memberi kita algoritma waktu , seperti untuk setiap siklus, kita tahu persis di mana untuk memulai: kekuatan (termasuk ) (yang dapat dihitung dalam spasi).2n+1=3kO(n)31O(1)
3) Algoritma Terakhir
Sekarang kita menggabungkan dua di atas: Membagi dan Menaklukkan + Siklus Permutasi.
Kami membagi dan menaklukkan, tetapi pilih sehingga adalah kekuatan dan .m2m+13m=Θ(n)
Jadi alih-alih pada pengulangan pada kedua "bagian", kita hanya mengulang pada satu dan melakukan kerja ekstra.Θ(n)
Ini memberi kita pengulangan (untuk beberapa ) dan dengan demikian memberi kita waktu , algoritma ruang!T(n)=T(cn)+Θ(n)0<c<1O(n)O(1)