Misalkan Anda memiliki tas dengan ubin, masing-masing dengan huruf di atasnya. Ada ubin dengan huruf 'A', dengan 'B', dan seterusnya, dan 'wildcard' (kami memiliki ). Misalkan Anda memiliki kamus dengan jumlah kata yang terbatas. Anda memilih ubin dari kantong tanpa pengganti. Bagaimana Anda menghitung (atau memperkirakan) probabilitas bahwa Anda dapat membentuk nol kata dari kamus mengingat ubin dipilih?n A n B n ∗ n = n A + n B + … + n Z + n ∗ k k
Bagi mereka yang tidak terbiasa dengan Scrabble (TM), karakter wildcard dapat digunakan untuk mencocokkan huruf apa pun. Dengan demikian kata [ BOOT ] dapat 'dieja' dengan ubin 'B', '*', 'O', 'T'.
Untuk memberikan gambaran tentang skala masalah, bertubuh kecil, seperti 7, sekitar 100, dan kamus berisi sekitar 100.000 kata ukuran atau lebih kecil.n k
sunting: Dengan 'membentuk kata', maksud saya kata dengan panjang tidak lebih dari . Jadi, jika kata [ A ] ada di kamus, maka dengan menggambar bahkan satu 'A' dari tas, seseorang telah 'membentuk kata'. Masalah wildcard secara radikal disederhanakan jika seseorang dapat berasumsi ada kata-kata dengan panjang 1 dalam kamus. Karena jika ada, setiap undian wildcard secara otomatis dapat mencocokkan panjang 1 kata, dan dengan demikian seseorang dapat berkonsentrasi pada kasus di mana tidak ada wildcard. Jadi, bentuk masalah yang lebih licin tidak memiliki kata 1 huruf dalam kamus.
Juga, saya harus secara eksplisit menyatakan bahwa urutan surat-surat yang diambil dari tas tidak material. Orang tidak harus menggambar huruf dalam urutan kata yang 'benar'.
sumber
Jawaban:
Ini adalah komentar (panjang!) Pada karya bagus yang telah diposting @vqv di utas ini. Ini bertujuan untuk mendapatkan jawaban yang pasti. Dia telah melakukan kerja keras menyederhanakan kamus. Yang tersisa hanyalah mengeksploitasinya secara maksimal. Hasilnya menunjukkan bahwa solusi brute-force layak dilakukan . Lagipula, termasuk wildcard, paling banyak ada kata yang dapat dibuat dengan 7 karakter, dan sepertinya kurang dari 1/10000 di antaranya - katakanlah, sekitar satu juta - akan gagal memasukkan beberapa kata yang valid.277=10,460,353,203
Langkah pertama adalah menambah kamus minimal dengan karakter wildcard, "?". 22 huruf muncul dalam kata-kata dua huruf (semua kecuali c, q, v, z). Sesuaikan wildcard ke 22 huruf tersebut dan tambahkan ke kamus: {a ?, b?, D ?, ..., y?} Sekarang sudah masuk. Demikian pula kita dapat memeriksa kata-kata tiga huruf minimal, menyebabkan beberapa kata tambahan muncul di kamus. Akhirnya, kami menambahkan "??" ke kamus. Setelah menghapus pengulangan yang menghasilkan, itu berisi 342 kata-kata minimal.
Cara yang elegan untuk melanjutkan - yang menggunakan jumlah pengkodean yang sangat kecil - adalah untuk melihat masalah ini sebagai aljabar . Sebuah kata, yang dianggap sebagai seperangkat huruf yang tidak teratur, hanyalah sebuah monomial. Misalnya, "pertengkaran" adalah monomial . Kamus karena itu adalah kumpulan monomial. Sepertinyaaps2t
(di mana, untuk menghindari kebingungan, saya telah menulis untuk karakter wildcard).ψ
Rak berisi kata yang valid jika dan hanya jika kata itu membagi rak.
Cara yang lebih abstrak, tetapi sangat kuat, untuk mengatakan ini adalah bahwa kamus menghasilkan ideal dalam cincin polinomial R = Z [ a , b , … , z , ψ ] dan bahwa rak dengan kata-kata yang valid menjadi nol dalam hasil bagi dering R / I , sedangkan rak tanpa kata-kata yang valid tetap tidak nol dalam hasil bagi. Jika kita membentuk jumlah semua rak dalam R dan menghitungnya dalam cincin hasil bagi ini, maka jumlah rak tanpa kata sama dengan jumlah monomial yang berbeda dalam hasil bagi.I R=Z[a,b,…,z,ψ] R/I R
Selain itu, jumlah semua rak di mudah untuk diekspresikan. Biarkan α = a + b + ⋯ + z + ψ menjadi jumlah dari semua huruf dalam alfabet. α 7 berisi satu monomial untuk setiap rak. (Sebagai bonus tambahan, koefisiennya menghitung jumlah cara setiap rak dapat dibentuk, memungkinkan kita menghitung probabilitasnya jika kita mau.)R α=a+b+⋯+z+ψ α7
Sebagai contoh sederhana (untuk melihat bagaimana ini bekerja), misalkan (a) kita tidak menggunakan wildcard dan (b) semua huruf dari "a" hingga "x" dianggap sebagai kata. Maka satu-satunya rak yang memungkinkan dari mana kata-kata tidak dapat dibentuk harus seluruhnya terdiri dari y dan z. Kami menghitung modulo yang ideal dihasilkan oleh { a , b , c , … , x } satu langkah pada satu waktu, dengan demikian:α=(a+b+c+⋯+x+y+z)7 {a,b,c,…,x}
Kita dapat membaca peluang mendapatkan rak non-kata dari jawaban akhir, : masing-masing koefisien menghitung cara rak yang sesuai dapat ditarik. Misalnya, ada 21 (dari 26 ^ 7 kemungkinan) cara untuk menggambar 2 y dan 5 z karena koefisien yy7+7y6z+21y5z2+35y4z3+35y3z4+21y2z5+7yz6+z7 sama dengan 21.y2z5
Dari perhitungan dasar, jelas ini adalah jawaban yang benar. Intinya adalah bahwa prosedur ini berfungsi terlepas dari isi kamus.
Perhatikan bagaimana mengurangi daya modulo ideal pada setiap tahap mengurangi perhitungan: itulah cara pintas yang diungkapkan oleh pendekatan ini. (Akhir contoh.)
Sistem aljabar polinomial menerapkan perhitungan ini . Misalnya, ini adalah kode Mathematica :
(Kamus dapat dibangun secara langsung dari min.dict @ vqv; Saya meletakkan garis di sini yang menunjukkan bahwa itu cukup pendek untuk ditentukan secara langsung jika Anda suka.)
Output - yang memerlukan sepuluh menit perhitungan - adalah 577958. ( NB Dalam versi sebelumnya dari pesan ini saya telah membuat kesalahan kecil dalam mempersiapkan kamus dan memperoleh 577940. Saya telah mengedit teks untuk mencerminkan apa yang saya harap sekarang adalah hasil yang benar!) Sedikit kurang dari satu juta atau lebih yang saya harapkan, tetapi dengan urutan yang sama besarnya.
Untuk menghitung kemungkinan mendapatkan rak seperti itu, kita perlu memperhitungkan sejumlah cara di mana rak dapat ditarik. Seperti yang kita lihat dalam contoh, ini sama dengan koefisiennya di . Peluang menggambar beberapa rak tersebut adalah jumlah dari semua koefisien ini, mudah ditemukan dengan menyetel semua huruf sama dengan 1:α7
Jawabannya sama dengan 1066056120, memberikan peluang 10,1914% menggambar rak dari mana tidak ada kata yang valid dapat dibentuk (jika semua huruf sama-sama kemungkinan).
Ketika probabilitas surat berbeda-beda, ganti saja setiap huruf dengan kemungkinan ditarik:
Outputnya adalah 1,079877553303%, jawaban yang tepat (meskipun menggunakan model perkiraan, menggambar dengan penggantian). Melihat kembali, butuh empat baris untuk memasukkan data (alfabet, kamus, dan alfabet frekuensi) dan hanya tiga baris untuk melakukan pekerjaan: menjelaskan bagaimana untuk mengambil kekuatan berikutnya modulo saya , mengambil kekuasaan 7 rekursif, dan mengganti probabilitas untuk surat-surat itu.α I
sumber
Sangat sulit untuk menggambar rak yang tidak mengandung kata yang valid di Scrabble dan variannya. Di bawah ini adalah program R yang saya tulis untuk memperkirakan probabilitas bahwa rak 7-ubin awal tidak mengandung kata yang valid. Ini menggunakan pendekatan monte carlo dan leksikon Words With Friends (saya tidak dapat menemukan leksikon Scrabble resmi dalam format yang mudah). Setiap percobaan terdiri dari menggambar rak 7-ubin, dan kemudian memeriksa apakah rak berisi kata yang valid.
Kata-kata minimal
Anda tidak perlu memindai seluruh leksikon untuk memeriksa apakah rak berisi kata yang valid. Anda hanya perlu memindai leksikon minimal yang terdiri dari kata-kata minimal . Sebuah kata minimal jika tidak mengandung kata lain sebagai himpunan bagian. Misalnya 'em' adalah kata minimal; 'kosong' tidak. Intinya adalah bahwa jika sebuah rak berisi kata x maka itu juga harus mengandung subset dari x . Dengan kata lain: rak tidak mengandung kata-kata jika tidak mengandung kata-kata minimal. Untungnya, sebagian besar kata dalam leksikon tidak minimal, sehingga dapat dihilangkan. Anda juga dapat menggabungkan kata-kata yang setara permutasi. Saya dapat mengurangi leksikon Words With Friends dari 172.820 menjadi 201 kata minimal.
Wildcard dapat dengan mudah ditangani dengan memperlakukan rak dan kata-kata sebagai distribusi atas surat-surat. Kami memeriksa apakah rak berisi kata dengan mengurangi satu distribusi dari yang lain. Ini memberi kita jumlah setiap huruf yang hilang dari rak. Jika jumlah angka itu jumlah wildcard, maka kata itu ada di rak.≤
Satu-satunya masalah dengan pendekatan monte carlo adalah bahwa peristiwa yang kami minati sangat jarang terjadi. Jadi perlu banyak, banyak percobaan untuk mendapatkan perkiraan dengan kesalahan standar yang cukup kecil. Saya menjalankan program saya (disisipkan di bagian bawah) dengan percobaan dan mendapat probabilitas diperkirakan 0,004 bahwa rak awal tidak mengandung kata yang valid . Kesalahan standar estimasi estimasi itu adalah 0,0002. Hanya perlu beberapa menit untuk berjalan di Mac Pro saya, termasuk mengunduh leksikon.N=100,000
Saya akan tertarik melihat apakah seseorang dapat datang dengan algoritma tepat yang efisien. Pendekatan naif berdasarkan inklusi-eksklusi tampaknya bisa melibatkan ledakan kombinatorial.
Inklusi-pengecualian
Saya pikir ini adalah solusi yang buruk, tapi ini sketsa yang tidak lengkap. Pada prinsipnya Anda dapat menulis program untuk melakukan perhitungan, tetapi spesifikasinya akan berliku.
Probabilitas yang ingin kita hitung adalah Peristiwa di dalam probabilitas di sisi kanan adalah gabungan peristiwa: P ( k -tile rak mengandung kata ) = P ( ∪ x ∈ M { k -tile rak berisi x } ) , di mana M
Kemudian
Memindai semua kemungkinan rak
Program Monte Carlo R.
sumber
Srikant benar: belajar di Monte Carlo adalah jalan yang harus ditempuh. Ada dua alasan. Pertama, jawabannya sangat tergantung pada struktur kamus. Dua ekstrem adalah (1) kamus berisi setiap kata dengan satu huruf. Dalam hal ini, peluang untuk tidak membuat kata dalam undian1 atau lebih banyak huruf adalah nol. (2) Kamus hanya berisi kata-kata yang dibentuk dari satu huruf ( misalnya , "a", "aa", "aaa", dll .). Kesempatan untuk tidak membuat kata dalam undiank huruf mudah ditentukan dan jelas bukan nol. Setiap jawaban pasti bentuk tertutup harus menggabungkan seluruh struktur kamus dan akan menjadi formula yang benar-benar mengerikan dan panjang.
Alasan kedua adalah bahwa MC memang layak: Anda hanya harus melakukannya dengan benar. Paragraf sebelumnya memberikan petunjuk: jangan hanya menghasilkan kata-kata secara acak dan mencarinya; sebagai gantinya, menganalisis kamus terlebih dahulu dan memanfaatkan strukturnya.
Salah satu cara mewakili kata-kata dalam kamus sebagai pohon. Pohon itu berakar pada simbol dan ranting kosong pada setiap huruf sampai ke bawah; daunnya (tentu saja) adalah kata-kata itu sendiri. Namun, kami juga dapat memasukkan semua permutasi nontrivial dari setiap kata ke pohon, juga (hinggak ! - 1 dari mereka untuk setiap kata). Ini dapat dilakukan secara efisien karena seseorang tidak harus menyimpan semua permutasi tersebut; hanya ujung-ujung pohon perlu ditambahkan. Daunnya tetap sama. Bahkan, ini dapat disederhanakan lebih lanjut dengan menegaskan bahwa pohon tersebut harus diikuti dalam urutan abjad .
Dengan kata lain, untuk menentukan apakah multiset darik karakter ada di kamus, pertama mengatur elemen ke dalam urutan, lalu cari "kata" yang diurutkan ini di pohon yang dibangun dari perwakilan kata yang diurutkan di kamus asli. Ini sebenarnya akan lebih kecil dari pohon asli karena menggabungkan semua set kata yang setara, seperti {stop, post, pot, opts, spot}. Bahkan, dalam kamus bahasa Inggris, kelas kata ini tidak akan pernah tercapai karena "begitu" akan ditemukan terlebih dahulu. Mari kita lihat ini dalam aksi. Multiset yang diurutkan adalah "opst"; "o" akan bercabang ke semua kata yang hanya berisi huruf {o, p, ..., z}, "p" akan bercabang ke semua kata yang hanya berisi {o, p, ..., z} dan paling banyak satu "o", dan akhirnya "s" akan bercabang ke daun "begitu"!
Diperlukan modifikasi untuk menangani wildcard: Saya akan membiarkan tipe programmer di antara Anda memikirkannya. Itu tidak akan menambah ukuran kamus (sebenarnya akan menguranginya); itu akan sedikit memperlambat traversal pohon, tetapi tanpa mengubahnya dengan cara mendasar. Dalam kamus apa pun yang berisi kata satu huruf, seperti bahasa Inggris ("a", "i"), tidak ada kerumitan: kehadiran wildcard berarti Anda dapat membentuk sebuah kata! (Ini mengisyaratkan bahwa pertanyaan awal mungkin tidak semenarik kedengarannya.)
Hasilnya adalah bahwa pencarian kamus tunggal membutuhkan (a) pengurutan ak multiset-newsletter dan (b) melintasi tidak lebih dari k ujung-ujung pohon. Waktu berjalan adalahO ( k log( k ) ) . If you cleverly generate random multisets in sorted order (I can think of several efficient ways to do this), the running time reduces to O(k) . Multiply this by the number of iterations to get the total running time.
I bet you could conduct this study with a real Scrabble set and a million iterations in a matter of seconds.
sumber
Pendekatan Monte Carlo
Pendekatan cepat dan kotor adalah melakukan studi monte carlo. Serik ubin m waktu dan untuk setiap undian k tiles see if you can form a word. Denote the number of times you could form a word by mw . The desired probability would be:
Direct Approach
Let the number of words in the dictionary be given byS . Let ts be the number of ways in which we can form the sth word. Let the number of letters needed by the sth word be denoted by ma,mb,...,mz (i.e., the sth word needs ma number of 'a' letters etc). Denote the number of words we can form with all tiles by N .
and
(Including the impact of wildcard tiles is a bit trickier. I will defer that issue for now.)
Thus, the desired probability is:
sumber