Berikut adalah pendekatan yang berbeda, berdasarkan pada iteratif menemukan angka yang tidak dapat muncul di antara . Sebut satu set over-perkiraan dari 's jika kita tahu bahwa . Demikian pula, adalah overapproximation dari 's jika kita tahu bahwa . Jelas, lebih kecil , semakin berguna ini lebih-pendekatan adalah, dan yang sama berlaku untuk . Pendekatan saya didasarkan pada iteratif memperbaiki perkiraan berlebihan ini, yaitu, secara iteratif mengurangi ukuran set ini (karena kami mengesampingkan semakin banyak nilai yang tidak mungkin).A a { a 1 , ... , a 6 } ⊆ A B b { b 1 , ... , b 6 } ⊆ B A B{a1,…,a6}Aa{a1,…,a6}⊆ABb{b1,…,b6}⊆BAB
Inti dari pendekatan ini adalah metode untuk penyempurnaan : diberikan over-aproksimasi untuk 's dan over-aproksimasi untuk 's, temukan over-aproksimasi baru untuk sehingga . Secara khusus, biasanya akan lebih kecil dari , jadi ini memungkinkan kita untuk memperbaiki perkiraan-lebih untuk .a B b A ∗ a A ∗ ⊊ AAaBbA∗aA∗⊊A A aA∗Aa
Dengan simetri, pada dasarnya trik yang sama akan memungkinkan kita memperbaiki perkiraan-over kita untuk 's: diberi over-aproksimasi untuk 's dan over-aproksimasi untuk 's, ia akan menghasilkan over baru -approximation untuk 's.A a B b B ∗ bbAaBbB∗b
Jadi, izinkan saya memberi tahu Anda cara melakukan penyempurnaan, maka saya akan menggabungkan semuanya untuk mendapatkan algoritme lengkap untuk masalah ini. Dalam apa yang berikut, biarkan menunjukkan multi-set perbedaan, yaitu, ; kita akan fokus pada menemukan disempurnakan selama-pendekatan , diberikan .D = { a i - b j : 1 ≤ i , j ≤ 6 } A ∗ A , BDD={ai−bj:1≤i,j≤6}A∗A,B
Cara menghitung penyempurnaan. Pertimbangkan satu perbedaan . Pertimbangkan set . Berdasarkan pengetahuan kami bahwa adalah perkiraan yang berlebihan dari , kami tahu bahwa setidaknya satu elemen harus merupakan elemen dari . Oleh karena itu, kita dapat memperlakukan setiap elemen di sebagai "saran" untuk nomor untuk mungkin termasuk di . Jadi, mari kita sapu semua perbedaan dan, untuk masing-masing, identifikasi nomor mana yang "disarankan" oleh .d + B = { d + y : y ∈ B } B b d + B { a 1 , … , a 6 } d + B A d ∈ D dd∈Dd+B={d+y:y∈B}Bbd+B{a1,…,a6}d+BAd∈Dd
Sekarang saya akan mengamati bahwa angka pasti akan disarankan setidaknya 6 kali selama proses ini. Mengapa? Karena perbedaan dalam , dan ketika kami memprosesnya, akan menjadi salah satu angka yang disarankan (karena kami dijamin bahwa , pasti akan menyertakan ). Demikian pula, perbedaan muncul di suatu tempat di , dan itu akan menyebabkan disarankan lagi. Dengan cara ini, kita melihat bahwa nilai akan disarankan setidaknya 6 kali. Hal yang sama berlaku untuk , danaa1 D a 1 b 1 ∈ B ( a 1 - b 1 ) + B a 1 a 1 - b 2 D a 1 a 1 a 2 a 3a1−b1Da1b1∈B(a1−b1)+Ba1a1−b2Da1a1a2a3, dan seterusnya.
Jadi, mari menjadi himpunan angka yang telah disarankan setidaknya 6 kali. Ini pastinya merupakan perkiraan yang berlebihan dari , oleh komentar di atas.a ∗ aA∗a∗a
Sebagai optimasi, kita bisa menyaring semua saran yang tidak hadir dalam segera: dengan kata lain, kita bisa memperlakukan perbedaan sebagai menyarankan semua nilai-nilai . Memastikan bahwa kita akan memiliki . Kami berharap lebih kecil dari ; tidak ada jaminan, tetapi jika semuanya berjalan dengan baik, mungkin itu akan terjadi.d ( d + B ) ∩ A A ∗ ⊆ A A ∗ AAd(d+B)∩AA∗⊆AA∗A
Menyatukan ini, algoritma untuk memperbaiki untuk menghasilkan adalah sebagai berikut:A ∗A,BA∗
Biarkan . Ini adalah serangkaian saran.S=∪d∈D(d+B)∩A
Menghitung berapa kali setiap nilai muncul dalam . Mari menjadi seperangkat nilai-nilai yang muncul setidaknya 6 kali di . (Ini dapat diimplementasikan secara efisien dengan membangun sebuah array dari 251 awalnya, awalnya semua nol, dan setiap kali jumlah disarankan, Anda selisih ; pada akhirnya Anda menyapu melalui mencari elemen yang nilainya 6 atau lebih besar)A ∗ S a s a [ s ] aSA∗Sasa[s]a
Metode serupa dapat dibangun untuk memperbaiki untuk mendapatkan . Anda hal-hal pada dasarnya terbalik di atas dan flip beberapa tanda-tanda: misalnya, bukannya , Anda melihat .B ∗ d + B - d + AA,BB∗d+B−d+A
Cara menghitung perkiraan awal yang berlebihan. Untuk mendapatkan perkiraan awal berlebihan kami, satu ide adalah mengasumsikan (wlog) bahwa . Oleh karena itu, setiap nilai harus muncul di suatu tempat di antara , sehingga daftar perbedaan dapat digunakan sebagai perkiraan awal awal kami untuk . Sayangnya, ini tidak memberi kami perkiraan yang terlalu berguna untuk 's.a i D D a bb1=0aiDDab
Pendekatan yang lebih baik adalah dengan menebak nilai salah satu nilai . Dengan kata lain, kami menganggap (wlog) bahwa , dan menggunakan sebagai perkiraan awal kami atas . Lalu, kami menebak mana dari 36 nilai ini yang memang salah satu dari nilai , katakan . Itu kemudian memberi kita perkiraan yang berlebihan untuk 's. Kami menggunakan perkiraan awal A yang berlebihan ini , kemudian secara iteratif memperbaikinya sampai konvergensi, dan menguji apakah hasilnya benar. Kami mengulangi hingga 36 kali, dengan 36 tebakan berbeda pada (rata-rata 6 tebakan seharusnya cukup) sampai kami menemukan satu yang berfungsi.b 1 = 0 A = D a a a 1 B = a 1 - D b A , B a 1ab1=0A=Daaa1B=a1−DbA,Ba1
Algoritma penuh. Sekarang kita dapat memiliki algoritma lengkap untuk menghitung . Pada dasarnya, kami menurunkan perkiraan awal untuk dan , lalu memperbaiki secara iteratif. A Ba1,…,a6,b1,…,b6AB
Buat tebakan: Untuk setiap , tebak . Lakukan hal berikut:a 1 = zz∈Da1=z
Perkiraan awal yang berlebihan: Tentukan dan .B = z - DA=DB=z−D
Perbaikan berulang : Terapkan berulang-ulang berikut ini sampai konvergensi:
- Perbaiki untuk mendapatkan over-pendekatan baru dari 's.B ∗ bA,BB∗b
- Perbaiki untuk mendapatkan over-pendekatan baru dari 's.A ∗ aA,B∗A∗a
- Biarkan dan .A:=A∗B:=B∗
Periksa keberhasilan: Jika set yang dihasilkan masing-masing memiliki ukuran 6, uji apakah solusi tersebut valid untuk masalah tersebut. Jika ya, berhenti. Jika tidak, lanjutkan dengan perulangan nilai kandidat .zA,Bz
Analisis.
Akankah ini berhasil? Apakah pada akhirnya konvergen pada dan , atau akankah ia macet tanpa menyelesaikan masalah sepenuhnya? Cara terbaik untuk mengetahuinya mungkin dengan mengujinya. Namun, untuk parameter Anda, ya, saya berharap ini akan efektif.B = { b 1 , ... , b 6 }A={a1,…,a6}B={b1,…,b6}
Jika kita menggunakan metode # 1, selamatidak terlalu besar, heuristik saya berharap ukuran set menyusut secara monoton. Pertimbangkan berasal dari . Setiap perbedaan menyarankannilai-nilai; salah satunya benar, dan yang lain dapat diperlakukan (secara heuristik) sebagai angka acak. Jika adalah angka yang tidak muncul di antara , berapakah probabilitas bahwa angka tersebut bertahan dari pemfilteran dan ditambahkan ke ? Nah, kami berharap akan menyarankan tentangA ∗ A , B d | B | | B | - 1 x a A * a ( | B | - 1 ) × 36 / 251 | B | ≤ 36 x p = 0,4 | B | | B | = 30 p ≈ 0,25 A ∗ p|A|,|B|A∗A,Bd|B||B|−1xaA∗a(|B|−1)×36/251kali total (rata-rata, dengan standar deviasi tentang akar kuadrat itu). Jika , probabilitas bahwa salah bertahan dari penyaringan harus sekitar atau lebih (menggunakan perkiraan normal untuk binomial, dengan koreksi kontinuitas). (Peluangnya lebih kecil jika lebih kecil; misalnya, untuk , saya perkirakan .) Saya berharap ukuran sekitar , yang akan benar-benar meningkatkan pendekatan yang berlebihan karena ini benar-benar lebih kecil dari. Misalnya, jika , maka berdasarkan heuristik ini saya harapkan|B|≤36xp=0.4|B||B|=30p≈0.25A∗| A | | A | = | B | = 36 | A ∗ | ≈ 18 | A |p(|A|−6)+6|A||A|=|B|=36|A∗|≈18 , yang merupakan peningkatan besar atas.|A|
Oleh karena itu, saya memperkirakan bahwa waktu berjalan akan sangat cepat. Saya berharap sekitar 3-5 iterasi perbaikan sudah cukup untuk konvergensi, biasanya, dan sekitar 6 tebakan pada mungkin sudah cukup. Setiap operasi penyempurnaan melibatkan mungkin beberapa ribu memori membaca / menulis, dan kami melakukannya mungkin 20-30 kali. Jadi, saya berharap ini sangat cepat, untuk parameter yang Anda tentukan. Namun, satu-satunya cara untuk mengetahui dengan pasti adalah mencobanya dan melihat apakah itu berfungsi dengan baik atau tidak.z