Bagaimana cara membuktikan kebenaran algoritma shuffle?

24

Saya memiliki dua cara untuk menghasilkan daftar item dalam urutan acak dan ingin menentukan apakah mereka sama adil (tidak bias).

Metode pertama yang saya gunakan adalah untuk membangun seluruh daftar elemen dan kemudian melakukan pengocokan (katakanlah Fisher-Yates shuffle). Metode kedua lebih merupakan metode berulang yang membuat daftar terseret di setiap penyisipan. Dalam pseudo-code, fungsi penyisipan adalah:

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

Saya tertarik pada bagaimana seseorang menunjukkan keadilan dari pengocokan khusus ini. Kelebihan dari algoritma ini, di mana digunakan, cukup bahwa meskipun sedikit tidak adil itu akan baik-baik saja. Untuk memutuskan saya perlu cara untuk mengevaluasi keadilannya.

Gagasan pertama saya adalah bahwa saya perlu menghitung permutasi total yang mungkin dengan cara ini versus total permutasi yang mungkin untuk satu set panjang akhir. Namun saya sedikit bingung bagaimana cara menghitung permutasi yang dihasilkan dari algoritma ini. Saya juga tidak dapat memastikan ini adalah pendekatan terbaik, atau termudah.

edA-qa mort-ora-y
sumber
Anda bisa melakukan sampel statistik pada sejumlah besar algoritme Anda dan membandingkannya dengan nilai yang diharapkan, atau melakukan semacam tes keacakan.
Dave Clarke
Anda ingin menguji distribusi. Apakah didistribusikan secara merata, atau miring. Saya curiga, bagaimanapun, bahwa Anda perlu menjalankannya berkali-kali.
Dave Clarke
Saya tidak jelas bagaimana saya akan melakukan itu. Ini bukan keacakan dari konten yang saya cari, tetapi keacakan dari pemesanan. Pendekatan mana yang dapat mengukur distribusi pemesanan?
edA-qa mort-ora-y
Ah, konyol saya, saya bisa menggunakan set input tetap dan menggunakan posisi akhir dari setiap elemen untuk mendapatkan distribusi. Namun, saya sebenarnya lebih suka bukti logis daripada simulasi.
edA-qa mort-ora-y
@ edA-qamort-ora-y: Keinginan Anda adalah perintah saya. ;)
Raphael

Jawaban:

22

Pertama, mari kita buat dua asumsi yang jelas, tetapi penting:

  1. _.random_item dapat memilih posisi terakhir.
  2. _.random_itemmemilih setiap posisi dengan probabilitas .1n+1

Untuk membuktikan kebenaran algoritme Anda, Anda memerlukan argumen induktif yang mirip dengan yang digunakan di sini :

  • Untuk daftar tunggal hanya ada satu kemungkinan, jadi itu dipilih secara seragam.
  • Dengan asumsi bahwa daftar dengan elemen dipilih secara seragam (dari semua permutasi), tunjukkan bahwa daftar dengan elemen yang diperoleh dengan teknik Anda dipilih secara seragam.n + 1nn+1

Dari sini, buktinya salah. Silakan lihat di bawah untuk bukti yang benar; Saya meninggalkan ini di sini karena kesalahan dan langkah-langkah berikut (yang masuk akal) mungkin mendidik.

Berguna untuk mendapatkan properti lokal (yaitu elemen-bijaksana) yang harus dimiliki, karena memperdebatkan seluruh permutasi adalah menyakitkan. Perhatikan bahwa permutasi dipilih secara seragam jika setiap elemen memiliki probabilitas yang sama untuk berada di setiap posisi, yaitu

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

dimana dan kami mengasumsikan demi kesederhanaan notasi yang kami masukkan { 1 , ... , n } ke dalam daftar.n=|L|{1,,n}

Sekarang, mari kita lihat apa teknik Anda lakukan ketika memasukkan st elemen. Kami harus mempertimbangkan tiga kasus (setelah swap):n+1

  1. Salah satu elemen dalam daftar, tidak bertukar, yaitu dan j { 1 , ... , n }i{1,,n}j{1,,n}
  2. Salah satu elemen dalam daftar, bertukar, yaitu dan j { 1 , , n }i=n+1j{1,,n}
  3. Elemen baru, yaitu dan j = n + 1i{1,,n+1}j=n+1

Untuk setiap kasus, kami menghitung probabilitas elemen berada pada posisi i ; semua harus berubah menjadi 1ji (yang cukup karena(1)). Misalkanpn=11n+1(1) adalah probabilitas dari salah satu yang pertamanelemen berada di posisi dalam daftar tua (hipotesis induksi), danps=1pn=1nn kemungkinan posisi apapun yang dipilih oleh(asumsi 1, 2). Perhatikan bahwa kutipan daftar dengannelemen dan memilih posisi swap adalahperistiwa independen, sehingga probabilitas faktor peristiwa gabungan, misalnyaps=1n+1random_itemn

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

untuk . Sekarang untuk perhitungan.i,j{1,,n}

  1. Kami hanya mempertimbangkan elemen lama . Elemen j tersebut berada pada posisi i jika dan hanya jika ada sebelum penyisipan terakhir dan saya tidak dipilih sebagai posisi swap, yaitu njii

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

  2. Di sini kami menganggap bahwa salah satu elemen lama ditukar ke posisi terakhir. Elemen bisa berada di salah satu posisi lama, jadi kami menjumlahkan semua probabilitas bahwa j berada di posisi i dan saya dipilih sebagai posisi swap, yaitujjii

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

  3. Elemen baru berakhir di posisi jika dan hanya jika saya dipilih sebagai posisi swap, yaituii

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

Semua ternyata baik-baik saja, strategi penyisipan Anda memang mempertahankan keseragaman. Dengan kekuatan induksi, itu membuktikan bahwa algoritma Anda menciptakan permutasi yang terdistribusi secara merata.

Sebuah kata peringatan: bukti ini rusak jika elemen yang dimasukkan tidak berbeda secara berpasangan. dapat dibedakan, karena persamaan pertama tidak lagi valid. Tetapi algoritma Anda masih valid; setiap permutasi dengan duplikat dihasilkan oleh jumlah eksekusi acak yang sama. Anda dapat membuktikan ini dengan menandai duplikat (yaitu membuatnya dapat dibedakan), melakukan bukti di atas dan menghapus tanda (secara virtual); langkah terakhir runtuh set permutasi berukuran sama dengan yang sama.


Seperti yang dikatakan Steven dengan benar dalam komentar, bukti di atas secara mendasar cacat karena tidak berlaku; Anda dapat membangun distribusi pada set permutasi yang memenuhi tangan kanan, tetapi tidak pada sisi kiri¹.(1)

random_itemL(k){1,,k}

πPermn+1{1,,n+1}

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

π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)!

yang harus kami tunjukkan. Dengan kekuatan induksi, itu membuktikan bahwa algoritma Anda menciptakan permutasi yang terdistribusi secara merata.


  1. {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)}140
Raphael
sumber
4
'Amati bahwa permutasi dipilih secara seragam jika setiap elemen memiliki probabilitas yang sama untuk berada di setiap posisi' - ini tidak benar. Misalnya, himpunan empat permutasi pada empat elemen {(1, 2, 3, 4), (2, 3, 4, 1), (3, 4, 1, 2), (4, 1, 2, 3 )} memenuhi kendala Anda, tetapi jelas bukan himpunan semua permutasi. Sayangnya Anda harus menggunakan properti global permutasi Anda karena tidak ada kondisi lokal yang cukup untuk menentukan keseragaman.
Steven Stadnicki