Apakah ada algoritma waktu riffle shuffle linear waktu? Ini adalah algoritma yang mampu dilakukan oleh beberapa tangan yang sangat tangkas: membagi array input berukuran rata, dan kemudian menyatukan elemen dari dua bagian.
Mathworld memiliki halaman singkat tentang riffle shuffle . Secara khusus, saya tertarik pada variasi out-shuffle yang mengubah array input 1 2 3 4 5 6 menjadi 1 4 2 5 3 6. Perhatikan bahwa dalam definisi mereka, panjang input adalah .
Ini mudah untuk melakukan ini dalam waktu linier jika kita punya array kedua ukuran atau lebih berguna. Pertama-tama salin elemen terakhir ke array. Kemudian, dengan asumsi pengindeksan berbasis 0, salin elemen pertama dari indeks ke . Kemudian salin elemen dari array kedua kembali ke array input, pemetaan indeks ke . (Kita dapat melakukan pekerjaan sedikit lebih sedikit dari itu, karena elemen pertama dan terakhir dalam input tidak bergerak.)n n [ 0 , 1 , 2 , . . . , N - 1 ] [ 0 , 2 , 4 , . . . , 2 n - 2 ] n [ 0 , 1 , 2 , . . . , N - 1 ] [ 1 , 3 , 5 , . . . ,
Salah satu cara untuk melakukan hal ini di tempat melibatkan dekomposisi permutasi menjadi siklus terpisah, dan kemudian mengatur ulang elemen sesuai dengan setiap siklus. Sekali lagi, dengan asumsi pengindeksan berbasis 0, permutasi yang terlibat dalam kasus 6 elemen adalah
Seperti yang diharapkan, elemen pertama dan terakhir adalah poin tetap, dan jika kita mengubah 4 elemen tengah kita mendapatkan hasil yang diharapkan.
Sayangnya, pemahaman saya tentang matematika permutasi (dan L mereka ) sebagian besar didasarkan pada wikipedia, dan saya tidak tahu apakah ini dapat dilakukan dalam waktu linier. Mungkin permutasi yang terlibat dalam pengocokan ini dapat dengan cepat terurai? Juga, kita bahkan tidak perlu dekomposisi lengkap. Cukup menentukan satu elemen saja dari masing-masing siklus disjoint akan cukup, karena kita dapat merekonstruksi siklus dari salah satu elemennya. Mungkin diperlukan pendekatan yang sangat berbeda.
Sumber daya yang baik pada matematika terkait sama berharganya dengan algoritma. Terima kasih!