这是另一种方法,它基于迭代查找不能出现的数字。调用一组对的过近似的,如果我们知道。类似地,如果我们知道,则是的。显然,越小,这种过度逼近就越有用,并且。我的方法基于迭代地细化这些过大的近似值,即迭代地减小这些集合的大小(因为我们排除了越来越多的值是不可能的)。{a1,…,a6}一个{ 一个1,... ,一个6 } ⊆ 甲乙b { b 1,... ,b 6 } ⊆ 乙甲乙Aa{a1,…,a6}⊆ABb{b1,…,b6}⊆BAB
该方法的核心是一种方法的改进:给定的过近似为的和过近似为的,找到一个新的过近似为的,使得。特别是,通常将小于,所以这让我们提炼过近似为的。一个乙b 甲*一个甲* ⊊ 甲甲*甲一个AaBbA∗aA∗⊊AA∗Aa
根据对称性,基本上是相同的把戏,让我们改善了近似为的:给过近似对的和过近似为的,它会产生一个新的过-近似为的。A a B b B ∗ bbAaBbB∗b
因此,让我告诉您如何进行优化,然后将所有内容放在一起以获得针对此问题的完整算法。在下文中,令表示差的多组,即;在给定,我们将专注于找到精炼的超逼近。d = { 一个我 - b Ĵ:1 ≤ 我,Ĵ ≤ 6 } 甲*甲,乙DD={ai−bj:1≤i,j≤6}A∗A,B
如何计算细化。 考虑一个单一的差别。考虑集合。基于我们的知识是的一个过度逼近,我们知道至少一个元素必须是的元素。因此,我们可以将中的每个元素都视为“建议”,以使数字可能包含在。因此,让我们浏览所有差异并为每个确定建议的数字。d + 乙= { d + ÿ :Ý ∈ 乙} 乙b d + 乙{ 一个1,... ,一个6 } d + 乙甲d ∈ d dd∈Dd+B={d+y:y∈B}Bbd+B{a1,…,a6}d+BAd∈Dd
现在,我将观察到在此过程中,建议至少建议使用数字 6次。为什么?因为差异在,并且当我们处理它时,将是它建议的数字之一(因为我们保证,肯定会包含)。同样,差异出现在中的某个位置,这将导致再次建议。这样,我们看到将建议的正确值至少6次。对于和同样适用一1 - b 1 d 一个1 b 1 ∈ 乙(一个1 - b 1)+ 乙一个1 一1 - b 2 d 一个1 一1 一2 一3a1a1−b1Da1b1∈B(a1−b1)+Ba1a1−b2Da1a1a2a3, 等等。
因此,让为至少建议6次的数字的集合。这肯定是对的过近似的,由上述意见。a * aA∗a∗a
作为一种优化,我们可以筛选出不存在于所有建议立即:换句话说,我们可以把该差为暗示所有的值。这将确保我们将有。我们希望严格小于 ; 没有保证,但是如果一切顺利,也许会的。d (d + 乙)∩ 甲甲* ⊆ 甲甲*甲Ad(d+B)∩AA∗⊆AA∗A
综上所述,将细化为的算法如下:A *A,BA∗
令。这是多套建议。S=∪d∈D(d+B)∩A
计算每个值在出现多少次。令为在中出现至少6次的值的集合。(这可以通过建立一个数组高效地实现 251最初,最初都是零,并且每个数时间建议,则递增 ;在结束你通过扫寻找元素其值为6或更大)A * S a s a [ s ] aSA∗Sasa[s]a
可以建立类似的方法来细化以获得。你基本上反向上面的事和倒装一些迹象:例如,而不是,你看。B ∗ d + B − d + AA,BB∗d+B−d+A
如何计算初始的超近似值。为了得到我们最初的近似值,一个想法是假设(wlog)。由此可见,每个值必须出现中某处,因此差异列表可以作为我们最初的过度近似为的。不幸的是,这并没有给我们一个非常有用的的过度逼近。a i D D a bb1=0aiDDab
更好的方法是另外猜测之一的值。换句话说,我们假设(wlog),该,并使用作为我们的初始过近似的。然后,我们猜测这36个值中的哪个确实是的值之一,例如。这然后使我们有过近似为的。我们使用此初始超逼近,然后对其进行迭代细化直至收敛,并测试结果是否正确。我们最多重复36次,在上进行36次不同的猜测(平均6次猜测就足够了),直到找到一个可行的为止。b 1 = 0 A = D a a a 1 B = a 1 - D b A ,B a 1ab1=0A=Daaa1B=a1−DbA,Ba1
完整的算法。 现在我们可以使用完整的算法来计算。基本上,我们得出和的初始过度逼近,然后进行迭代细化。 A Ba1,…,a6,b1,…,b6AB
猜一猜:对于每个,猜测。请执行下列操作:一个1 = žz∈Da1=z
初始过度逼近:定义和。B = z − DA=DB=z−D
迭代优化:重复应用以下内容,直到收敛为止:
- 瑞风获得一个新的超逼近中的的。B * bA,BB∗b
- 瑞风得到一个新的超逼近中的的。A ∗ aA,B∗A∗a
- 令和。 B := B ∗A:=A∗B:=B∗
检查是否成功:如果结果集大小均为6,则测试它们是否是该问题的有效解决方案。如果是,请停止。如果不是,请继续循环候选值。žA,Bz
分析。
这样行吗?它最终会收敛在和还是会在没有完全解决问题的情况下卡住?找出答案的最佳方法可能是对其进行测试。但是,对于您的参数,是的,我希望它会有效。B = { b 1,… ,b 6 }A={a1,…,a6}B={b1,…,b6}
如果我们使用方法#1,只要并不是太大,试探性地,我希望这些集合的大小能够单调地缩小。考虑从派生。每个差异表示价值观 其中一个正确,而另一个可以(启发式)视为随机数。如果是不与中出现了一些的,什么是概率,它生存的过滤,并且加入到?好了,我们期待被建议约A ∗ 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 甲* p|A|,|B|A∗A,Bd|B||B|−1xaA∗a(|B|−1)×36/251总计(平均,标准偏差大约是平方根)。如果,则错误的幸免于滤波的可能性应约为左右(使用二项式的法线近似,并进行连续性校正)。(如果较小,则概率较小;例如,对于,我期望。)我期望的大小约为,因为它严格小于,因此将严格改善过逼近度。例如,如果,那么基于这些启发式方法,我期望|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,比有很大的改进 。|A|
因此,我预计运行时间将非常快。我期望大约3-5次细化迭代足以实现收敛,并且在大约6次猜测可能就足够了。每个优化操作可能涉及数千次内存读/写,而我们执行的次数可能为20-30次。因此,对于您指定的参数,我希望它很快。但是,唯一能确定的方法就是尝试一下,看看它是否运行良好。z