Karıştırma algoritmasının doğruluğu nasıl kanıtlanır?


24

Rastgele bir sıraya göre bir öğe listesi üretmenin iki yolu var ve eşit derecede adil (tarafsız) olup olmadıklarını belirlemek istiyorum.

Kullandığım ilk yöntem, tüm öğelerin listesini oluşturmak ve ardından üzerinde bir karıştırmak (bir Fisher-Yates karıştırması demek). İkinci yöntem, listeyi her girişte karıştırılmış tutan bir yinelemeli yöntemdir. Sahte kodda ekleme işlevi:

insert( list, item )
    list.append( item )
    swap( list.random_item, list.last_item )

Birinin bu belirli karıştırmanın adilliğini gösterme şekliyle ilgileniyorum. Kullanıldığı bu algoritmanın avantajları, biraz adaletsiz olsa bile, tamam olması yeterlidir. Karar vermek için adaletini değerlendirmek için bir yola ihtiyacım var.

Benim ilk fikrim, bu şekilde mümkün olan toplam permütasyonları hesaplamam gerektiği ve nihai uzunluk için bir takım toplam permütasyonlar. Ancak bu algoritmadan kaynaklanan permütasyonları nasıl hesaplayacağımı bilemiyorum. Ayrıca bunun en iyi veya en kolay yaklaşım olduğundan emin olamıyorum.


Algoritmanızın çok sayıda çalıştırması üzerinde istatistiksel bir örnek yapabilir ve onu beklenen değerle karşılaştırabilir veya üzerinde bir tür rastgelelik testi yapabilirsiniz.
Dave Clarke

Dağıtımı test etmek istiyorsun. Düzgün dağılmış mı, yoksa eğri mi? Bununla birlikte, birçok kez çalıştırmanız gerekeceğinden şüpheliyim.
Dave Clarke

Bunu nasıl yapacağım konusunda net değilim. Peşinde olduğum içeriklerin rastgeleliği değil, sıralamanın rastgeleliği. Siparişin dağılımını hangi yaklaşım ölçebilir?
edA-qa mort-ora-y

Ah, aptal, sabit bir girdi kümesi kullanabilir ve her öğenin son konumunu bir dağılım elde etmek için kullanabilirim. Yine de, bir simülasyondan çok, mantıklı bir kanıtı tercih ederim.
edA-qa mort-ora-y

@ edA-qamort-ora-y: İsteğiniz benim için emirdir. ;)
Raphael

Yanıtlar:


22

İlk önce, iki tane açık, ancak önemli varsayımlarda bulunalım:

  1. _.random_item son pozisyonu seçebilirsiniz.
  2. _.random_itemher pozisyonu olasılıkla seçer .1n+1

Algoritmanızın doğruluğunu kanıtlamak için, burada kullanılana benzer bir endüktif argümana ihtiyacınız vardır :

  • Singleton listesi için sadece bir olasılık var, bu yüzden tek tip olarak seçildi.
  • elementli listenin tek tip olarak seçildiğini varsayalım (tüm permütasyonlardan itibaren), tekniğiniz tarafından elde edilen elementlerden birinin homojen olarak seçildiğini gösterin .n + 1nn+1

Bundan sonra ispat yanlış. Lütfen doğru bir kanıt için aşağıya bakın; Bunu burada bırakıyorum çünkü hem hata hem de sonraki adımlar (sesli olan) eğitici olabilir.

Tutulması gereken yerel (yani element-bilge) bir mülkün türetilmesi faydalıdır, çünkü tüm permütasyon hakkında acı vermek tartışmalıdır. Her elemanın her pozisyonda olma ihtimalinin eşit olması durumunda, bir permütasyonun eşit şekilde seçildiğini gözlemleyin, örn.

πPermnPr(L=π)=1n!i=1n j=1nPr(Li=j)=1n(1)

buradave listeye eklediğimiz notasyon basitliği adına varsayıyoruz .{ 1 , , n }n=|L|{1,,n}

Şimdi, 1'inci elemanı eklerken tekniğinin ne yaptığını görelim . Üç durumu göz önünde bulundurmalıyız (takastan sonra):n+1

  1. Listedeki öğelerden biri, takas edilmemiş, yani vei{1,,n}j{1,,n}
  2. Listedeki öğelerden biri değiştirildi, yani vei=n+1j{1,,n}
  3. Yeni eleman, yani vei{1,,n+1}j=n+1

Her bir durum için, biz elemanı olasılığını hesaplamak konumunda olmak ; hepsinin olduğu anlaşılmalıdır ( nedeniyle yeterlidir ). Let , ilk bir olasılık olarak , eski liste (indüksiyon hipotezi) içerisinde herhangi bir pozisyonda olmak elemanlar ve olasılığı seçilen herhangi bir pozisyon (varsayımlar 1, 2). öğeli listenin başının ve değiş tokuş pozisyonunun seçilmesinin bağımsız olaylar olduğuna dikkat edin , bu nedenle ortak olaylar faktörü olasılıkları;ji1n+1(1)pn=1nnps=1n+1random_itemn

Pr(Li=j,i swapped)=Pr(Li=j)Pr(i swapped)=pnps

için . Şimdi hesaplamalar için.i,j{1,,n}

  1. Sadece eski unsurlarını dikkate alırız. Bu tür bir elemanın konumunda ve son sokulmadan önce oldu, ancak ve ancak değiştirilebilir pozisyon olarak seçilmemiş olan njii

    Pr(Li=j)=pn(1ps)=1nnn+1=1n+1 .

  2. Burada eski unsurlardan birinin son konuma geçtiğini düşünüyoruz. Eleman biz tüm olasılıkları üzerinde toplamak, böylece eski pozisyonlarda en olabilirdi konumunda idi ve takas pozisyonu olarak seçilmiştir, yanijjii

    Pr(Ln+1=j)=i=1npnps=i=1n1n1n+1=1n+1 .

  3. Yeni eleman konumunda biter ancak ve ancak yani takas pozisyonu olarak seçilirii

    Pr(Li=j)=ps=1n+1 .

Her şey yolunda gitti, yerleştirme stratejiniz gerçekten tek biçimliliği koruyor. İndüksiyonun gücü sayesinde, algoritmanızın düzgün dağılmış permütasyonlar oluşturduğunu kanıtlar.

Bir uyarı kelimesi: eklenen elemanlar ikili olarak farklı değilse, bu kanıt kırılır. ayırt edilebilir, çünkü ilk denklem artık geçerli değil. Fakat algoritmanız hala geçerli; kopyalarla yapılan her permütasyon aynı sayıda rastgele uygulama tarafından üretilir. Bunu, kopyaları işaretleyerek (yani ayırt edilebilir hale getirerek), yukarıdaki kanıtı gerçekleştirerek ve işaretleri kaldırarak (hemen hemen) ispatlayabilirsiniz; Son adım, eşit büyüklükteki permütasyon kümelerini aynı şekilde daraltır.


As Steven yorumların doğru söylediği gibi, yukarıdaki ispat temelde kusurlu olduğunu tutmaz; Sağ eli yerine getiren, ancak sol tarafı değil, bir dizi permütasyon üzerine dağılımlar kurabilirsiniz.(1)

Bu nedenle, sonuçta o kadar da kötü olmadığı ortaya çıkan permütasyon olasılıklarıyla çalışmak zorunda kalacağız. Görev random_itemyerinin başında belirtilen varsayımlar ve endüktif yapı yerinde kalır, oradan devam ediyoruz. Let sonra listesini göstermek içine monte edilmiştir.L(k){1,,k}

Let keyfi bir permütasyon . Benzersiz olarak yazılabilirπPermn+1{1,,n+1}

π=(π(1),π(2),,π(i1),n+1,π(i+1),,π(n),π(i))

bazı ve . İndüksiyon hipotezi ile, . Bundan başka, pozisyon alır olasılığı ile varsayımı. ve rastgele seçimleri (stokastik) bağımsız olduğundan,πPermni{1,,n+1}Pr(L(n)=π)=1n!random_itemi1n+1πi

Pr(L(n+1)=π)=Pr(L(n)=π)Pr(i swapped)=1(n+1)!

göstermek zorunda olduğumuz. İndüksiyonun gücü sayesinde, algoritmanızın düzgün dağılmış permütasyonlar oluşturduğunu kanıtlar.


  1. Örneğin, her tüm izinleri atayın olasılık ve diğerleri . Her permütasyona sıfır olmayan bir olasılık veren örnekler de vardır.1{(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)} 0140

4
'Her elemanın her pozisyonda olma olasılığı eşitse, bir permütasyonun eşit şekilde seçildiğini gözlemleyin' - bu doğru değil. Örneğin, dört element üzerindeki dört permütasyon grubu {(1, 2, 3, 4), (2, 3, 4, 1), (3, 4, 1, 2), (4, 1, 2, 3) )} kısıtlamanızı yerine getirir, ancak açıkça tüm izinlerin seti değildir. Maalesef, permütasyonunuzun global özelliklerini kullanmak zorundasınız çünkü tekdüzeliği belirlemek için hiçbir yerel koşul yeterli değil.
Steven Stadnicki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.