Doğrusal bir zaman yerinde tüfek shuffle algoritması var mı? Bu, özellikle titiz ellerin gerçekleştirebileceği algoritmadır: çift boyutlu bir giriş dizisinin eşit olarak bölünmesi ve daha sonra iki yarıya ait elemanların serpiştirilmesi.
MathWorld üzerinde kısa bir sayfası vardır şıraynır shuffle . Özellikle, giriş dizisini 1 2 3 4 5 6'yı 1 4 2 5 3 6'ya dönüştüren karışıklık çeşitliliği ile ilgileniyorum. Tanımlarında giriş uzunluğunun .
İkinci bir boyut veya daha kullanışlı dizimiz varsa bunu doğrusal zamanda gerçekleştirmek kolaydır . İlk olarak son öğeyi diziye kopyalayın . Ardından, 0 tabanlı indeksleme varsayalım, ilk öğeyi indekslerden kopyalayın . . . , N - 1 ] için . Sonra n'yi kopyalayınendeksleri haritalama giriş dizisine ikinci dizi arka elemanlar, için [ 1 , 3 , 5 , . . . , 2 n - 1 ] . (Bundan biraz daha az iş yapabiliriz, çünkü girişteki ilk ve son elemanlar hareket etmez.)
Bunu yerinde yapmanın bir yolu, permütasyonun ayrık döngülere ayrışmasını ve daha sonra elementlerin her döngüye göre yeniden düzenlenmesini içerir. Yine, 0 tabanlı indeksleme varsayıldığında, 6 element durumunda yer alan permütasyon
Beklendiği gibi, ilk ve son elemanlar sabit noktalardır ve ortadaki 4 unsura izin verirsek beklenen sonucu elde ederiz.
Ne yazık ki, permütasyonların matematiğini (ve onların ) çoğunlukla wikipedia'ya dayanır ve bunun doğrusal zamanda yapılabileceğini bilmiyorum. Belki de bu karıştırmaya karışan permütasyonlar çabucak ayrıştırılabilir? Ayrıca, tam bir ayrışmaya bile ihtiyacımız yok. Ayrık döngülerin her birinin tek bir öğesini belirlemek yeterli olacaktır, çünkü döngüyü öğelerinden birinden yeniden yapılandırabiliriz. Belki tamamen farklı bir yaklaşım gerekir.
İlgili matematikteki iyi kaynaklar bir algoritma kadar değerlidir. Teşekkürler!