นี่เป็นวิธีการที่แตกต่างกันขึ้นอยู่กับการหาตัวเลขซ้ำที่ไม่สามารถปรากฏในหมู่{ 1 , ... , 6 } สอบถามชุดมากกว่าประมาณของ's ถ้าเรารู้ว่า{ 1 , ... , 6 } ⊆ ในทำนองเดียวกันBเป็น overapproximation ของข 's ถ้าเรารู้ว่า{ ข1 , ... , ข6 } ⊆ B เห็นได้ชัดว่าA ที่เล็กกว่า{a1,…,a6}Aa{a1,…,a6}⊆ABb{b1,…,b6}⊆BAมีประโยชน์มากขึ้นนี้มากกว่าประมาณเป็นและเดียวกันจะไปสำหรับB แนวทางของฉันขึ้นอยู่กับการปรับแต่งการประมาณค่าเหล่านี้ซ้ำ ๆ นั่นคือการลดขนาดของเซตเหล่านี้ซ้ำ ๆB
หลักของวิธีนี้คือการใช้วิธีการสำหรับการปรับแต่ง : รับมากกว่าประมาณสำหรับ's และมากกว่าประมาณBสำหรับข ' s หาใหม่มากกว่าประมาณ*สำหรับ's เช่นว่า* ⊊ โดยเฉพาะอย่างยิ่งตามปกติ*จะมีขนาดเล็กกว่าดังนั้นนี้จะช่วยให้เราปรับแต่งมากกว่าประมาณสำหรับ'sAaBbA∗aA∗⊊AA∗Aa
โดยสมมาตรโดยพื้นฐานแล้วกลอุบายแบบเดียวกันจะทำให้เราปรับแต่งการประมาณค่าเกินของb : s โดยให้การประมาณค่าAเกินกว่าค่าAสำหรับค่าaและค่าประมาณBสำหรับค่าbนั้น - การประมาณค่าB ∗สำหรับb 'sbAaBbB∗b
ดังนั้นฉันจะบอกคุณว่าการปรับแต่งแล้วฉันจะรวบรวมทุกอย่างเพื่อรับอัลกอริทึมเต็มสำหรับปัญหานี้ ในสิ่งต่อไปนี้ให้Dแทนความแตกต่างหลายชุดเช่นD = { a i - b j : 1 ≤ i , j ≤ 6 } ; เราจะมุ่งเน้นไปที่การหากลั่นมากกว่าประมาณ*ให้, BDD={ai−bj:1≤i,j≤6}A∗A,B
วิธีคำนวณการปรับแต่ง พิจารณาความแตกต่างเดียวd ∈ D พิจารณาชุดD + B = { d + Y : Y ∈ B } บนพื้นฐานความรู้ของเราที่Bเป็นมากกว่าประมาณของขของเรารู้ว่าอย่างน้อยหนึ่งองค์ประกอบของd + Bจะต้องมีองค์ประกอบของ{ 1 , ... , 6 } ดังนั้นเราสามารถปฏิบัติต่อองค์ประกอบแต่ละอย่างในd + Bd∈Dd+B={d+y:y∈B}Bbd+B{a1,…,a6}d+Bเป็น "ข้อเสนอแนะ" สำหรับจำนวนที่จะอาจจะรวมอยู่ใน งั้นลองกวาดความแตกต่างทั้งหมดd ∈ Dและสำหรับแต่ละอันให้ระบุว่าตัวเลขไหนที่"แนะนำ" โดยdAd∈Dd
ตอนนี้ฉันจะสังเกตเห็นว่าหมายเลขa 1ควรได้รับการแนะนำอย่างน้อย 6 ครั้งในระหว่างกระบวนการนี้ ทำไม? เพราะความแตกต่าง1 - ข1อยู่ในDและเมื่อเราดำเนินการมัน1จะเป็นหนึ่งในตัวเลขที่มันแสดงให้เห็น (ตั้งแต่เรารับประกันได้ว่าข1 ∈ B , ( 1 - ข1 ) + Bประสงค์ แน่นอนรวมถึง1 ) ในทำนองเดียวกันที่แตกต่าง1 - ข2ปรากฏที่ไหนสักแห่งในa1a1−b1Da1b1∈B(a1−b1)+Ba1a1−b2Dและมันจะทำให้เกิด 1ที่จะชี้ให้เห็นอีกครั้ง ด้วยวิธีนี้เราจะเห็นว่าค่าที่ถูกต้องของ 1จะได้รับการแนะนำอย่างน้อย 6 ครั้ง เดียวกันถือสำหรับ 2และ 3และอื่น ๆDa1a1a2a3
ดังนั้นให้A ∗เป็นเซตของตัวเลขa ∗ที่ได้รับการแนะนำอย่างน้อย 6 ครั้ง นี่คือการประมาณโดยประมาณของa 'โดยความคิดเห็นข้างต้นA∗a∗a
การเพิ่มประสิทธิภาพของเราสามารถกรองข้อเสนอแนะทั้งหมดที่ไม่ได้อยู่ในทันที: ในคำอื่น ๆ ที่เราสามารถรักษาความแตกต่างdเป็นบอกค่าทั้งหมด( D + B ) ∩ เพื่อให้แน่ใจว่าเราจะมี* ⊆ เรามีความหวังว่า*เป็นอย่างเคร่งครัดมีขนาดเล็กกว่า; ไม่มีการรับประกัน แต่ถ้าทุกอย่างไปได้ด้วยดีบางทีมันอาจจะเป็นAd(d+B)∩AA∗⊆AA∗A
ร่วมกันวางนี้ขั้นตอนวิธีการปรับแต่ง, Bให้ผลผลิต*มีดังนี้A,BA∗
ให้S = ∪ d ∈ D ( D + B ) ∩ นี่คือข้อเสนอแนะหลายชุดS=∪d∈D(d+B)∩A
นับจำนวนครั้งที่แต่ละค่าที่ปรากฏในS ให้*เป็นชุดของค่าที่ปรากฏอย่างน้อย 6 ครั้งในS (ซึ่งสามารถดำเนินการได้อย่างมีประสิทธิภาพโดยการสร้างอาร์เรย์251 แรกแรกศูนย์ทั้งหมดและในแต่ละครั้งจำนวนsแนะนำคุณเพิ่ม[ s ] ; ในตอนท้ายคุณกวาดผ่านมองหาองค์ประกอบที่มีค่าเป็น 6 หรือ ขนาดใหญ่)SA∗Sasa[s]a
วิธีการที่คล้ายกันสามารถสร้างขึ้นมาเพื่อปรับแต่ง, Bจะได้รับB * คุณสิ่งที่พื้นข้างต้นย้อนกลับและพลิกสัญญาณบางอย่าง: เช่นแทนที่จะd + B , คุณมองไปที่- d +A,BB∗d+B−d+A
วิธีคำนวณการประมาณค่าเริ่มต้นโดยประมาณ ที่จะได้รับครั้งแรกของเรามากกว่าประมาณหนึ่งความคิดคือการสมมติ (WLOG) ที่ข1 = 0 มันตามที่แต่ละค่าฉันจะต้องปรากฏอยู่ที่ไหนสักแห่งในหมู่Dจึงรายการของความแตกต่างDสามารถนำมาใช้เป็นครั้งแรกของเรามากกว่าประมาณสำหรับ's แต่น่าเสียดายที่นี้ไม่ได้ทำให้เรามีประโยชน์มากเกินประมาณสำหรับข 'sb1=0aiDDab
วิธีที่ดีคือการเพิ่มมูลค่าของเดาหนึ่งใน's ในคำอื่น ๆ เราสมมติ (WLOG) ที่ข1 = 0และใช้= Dเป็นครั้งแรกของเรามากกว่าประมาณของ's จากนั้นเราจะคาดเดาซึ่งหนึ่งในจำนวนนี้ 36 ค่าแน่นอนหนึ่งใน's พูด1 นั้นทำให้เรามีมากกว่าประมาณB = 1 - Dสำหรับข 's เราใช้การประมาณค่าเริ่มต้นที่ประมาณA , Bab1=0A=Daaa1B=a1−DbA,Bจากนั้นปรับแต่งซ้ำ ๆ จนกว่าจะบรรจบกันและทดสอบว่าผลลัพธ์นั้นถูกต้องหรือไม่ เราทำซ้ำถึง 36 ครั้ง 36 คาดเดาที่แตกต่างกัน1 (โดยเฉลี่ย 6 คาดเดาควรจะเพียงพอ) จนกว่าเราจะหาคนที่ผลงานa1
อัลกอริทึมเต็ม ตอนนี้เราสามารถมีขั้นตอนวิธีการเต็มรูปแบบในการคำนวณ1 , ... , 6 , บี1 , ... , ข 6 โดยทั่วไปเราได้รับการประมาณค่าเริ่มต้นสำหรับAและBจากนั้นทำการปรับปรุงซ้ำ ๆa1,…,a6,b1,…,b6AB
Make a guess: For each z∈D, guess that a1=z. Do the following:
Initial over-approximation: Define A=D and B=z−D.
Iterative refinement: Repeatedly apply the following until convergence:
- Refine A,B to get a new over-approximation B∗ of the b's.
- Refine A,B∗ to get a new over-approximation A∗ of the a's.
- Let A:=A∗ and B:=B∗.
Check for success: If the resulting sets A,B each have size 6, test whether they are a valid solution to the problem. If they are, stop. If not, continue with the loop over candidate values of z.
Analysis.
Will this work? Will it eventually converge on A={a1,…,a6} and B={b1,…,b6}, or will it get stuck without completely solving the problem? The best way to find out is probably to test it. However, for your parameters, yes, I expect it will be effective.
If we use method #1, as long as |A|,|B| are not too large, heuristically I expect the sizes of the sets to monotonically shrink. Consider deriving A∗ from A,B. Each difference d suggests |B| values; one of them correct, and the other |B|−1 can be treated (heuristically) as random numbers. If x is a number that does not appear among the a's, what is the probability that it survives the filtering and is added to A∗? Well, we expect a to be suggested about (|B|−1)×36/251 times in total (on average, with standard deviation about the square root of that). If |B|≤36, the probability that a wrong x survives the filtering should be about p=0.4 or so (using the normal approximation for the binomial, with continuity correction). (The probability is smaller if |B| is smaller; e.g., for |B|=30, I expect p≈0.25.) I expect the size of A∗ to be about p(|A|−6)+6, which will strictly improve the over-approximation since it is strictly smaller than |A|. For instance, if |A|=|B|=36, then based upon these heuristics I expect |A∗|≈18, which is a big improvement over |A|.
Therefore, I predict that the running time will be very fast. I expect about 3-5 iterations of refinement to be enough for convergence, typically, and about 6 guesses at z should probably be enough. Each refinement operation involves maybe a few thousand memory reads/writes, and we do that maybe 20-30 times. So, I expect this to be very fast, for the parameters you specified. However, the only way to find out for sure is to try it and see if it works well or not.