Canımın aşırı sıkılması sonucunda cevabını bildiğim bir şeyin doğruluğunu test etmek için kolları sıvadım.
Bugünkü algoritmamız bir diziyi yerınde shuffle ettiğini iddaa ediyor. Diziyi sondan başa gezerken bulunduğunuz index ile gittiğiniz yöndeki kalan elemanlardan rastgele birisini swap ediyoruz. Döngü sonucunda shuffle edilmiş array elde ediyoruz. Literatür de fisher-yates veya knuth shuffle olarak geçiyor.
Her bir konfigurasyonun eşit olasılıklı olduğunu görmek istiyoruz. Dizideki her bir elemanı seçme ihtimalimiz 1/kalanlisteboyutu ise
ilk elemanı seçmek 1/n
ikinci eleman 1/n-1
.
.
.
1
Tüm bunları çarpalım.
$$P(Konfigurasyon) = \frac{1}{n} * \frac{1}{n-1} * \frac{1}{n-2} * \cdots * \frac{1}{2}* 1 = \frac{1}{n!} $$
Demekki her bir konfigurasyonun gelme ihtimali 1/n! imiş. Şunu yapmamız da mümkün, bir sürü deney yapıp her bir konfigurasyondan kaç tane geldiğini sayarız. Bunun uniform dağılmış olmasını bekliyoruz.
Şimdi de bir elemanın hangi ihtimalle kaçıncı indexte olacağını hesaplamaya geldi.
$$P(index) = \frac{n-1}{n} * \frac{n-2}{n-1} * \frac{n-3}{n-2} * \cdots * \frac{1}{2}* 1 = \frac{1}{n} $$
Her bir elemanın 0. indexte olması ihtimali 1/n miş. Sonraki elemanın İsterseniz görsel ispatına da bakabilirsiniz.
İspat kısmımız bittiğine göre gelelim grafiklere. 3, 4, 5 elemanlı diziler için python ın builtin ve fisher yates algoritması ile karıştırılmış varyasyonlar ı görselleştirelim.
Her bir diziyi medyana göre normalize etmeden standart sapma hesapladığım için büyük bir değer çıkması normal. Kıyaslamayı pythonın builtin shuffle fonksiyonuna göre yaptığımız için çok önemli değil.
Fisher yates algoritmasının özellikleri
- Unbiased
- İmplement etmesi basit
- Her bir konfigurasyon eşit olasılıklı
- In place çalışıyor
Daha ne olsun.
Böyle bir analiz yapmak durumunda kalırsınız diye kodları paylaşıyorum.
|
|