Aquí hay un enfoque diferente, basado en encontrar iterativamente números que no pueden aparecer entre { a 1 , ... , a 6 } . Llame a un conjunto A un exceso de aproximación de la una 's si sabemos que { a 1 , ... , un 6 } ⊆ A . Del mismo modo, B es un overapproximation de la b 's si sabemos que { b 1 , ... , b 6 } ⊆ B . Obviamente, la A más pequeña{a1,…,a6}Aa{a1,…,a6}⊆ABb{b1,…,b6}⊆BAes, más útil este exceso de aproximación es, y lo mismo pasa con B . Mi enfoque se basa en refinar iterativamente estas sobre aproximaciones, es decir, reducir de forma iterativa el tamaño de estos conjuntos (a medida que descartamos que cada vez más valores sean imposibles)B
El núcleo de este enfoque es un método de refinamiento : dada una sobre-aproximación A para las a 's y una sobre-aproximación B para las b ' s, encuentre una nueva sobre-aproximación A ∗ para las a 's tal que A * ⊊ A . En particular, normalmente A ∗ será más pequeño que A , por lo que esto nos permite refinar la sobre-aproximación para las a 's.AaBbA∗aA∗⊊AA∗Aa
Por simetría, esencialmente el mismo truco nos permitirá refinar nuestra sobre-aproximación para las b 's: dada una sobre-aproximación A para las a ' sy una sobre-aproximación B para las b 's, producirá un nuevo sobre -aproximación B ∗ para los b 's.bAaBbB∗b
Entonces, déjame decirte cómo hacer el refinamiento, luego armaré todo para obtener un algoritmo completo para este problema. En lo que sigue, supongamos que D denota el conjunto múltiple de diferencias, es decir, D = { a i - b j : 1 ≤ i , j ≤ 6 } ; nos centraremos en la búsqueda de un refinado exceso de aproximación A * , dada A , B .DD={ai−bj:1≤i,j≤6}A∗A,B
Cómo calcular un refinamiento. Considere una sola diferencia d ∈ D . Considere el conjunto d + B = { d + y : y ∈ B } . Según nuestro conocimiento de que B es una sobre-aproximación de las b 's, sabemos que al menos un elemento de d + B debe ser un elemento de { a 1 , ... , a 6 } . Por lo tanto, podemos tratar cada uno de los elementos en d + Bd∈Dd+B={d+y:y∈B}Bbd+B{a1,…,a6}d+Bcomo una "sugerencia" para un número de, posiblemente, incluir en una . Entonces, recorramos todas las diferencias d ∈ D y, para cada una, identifiquemos qué números son "sugeridos" por d .Ad∈Dd
Ahora voy a observar que el número a 1 seguramente se sugerirá al menos 6 veces durante este proceso. ¿Por qué? Debido a que la diferencia a 1 - b 1 está en D , y cuando la procesamos, a 1 será uno de los números que sugiere (ya que estamos garantizados que b 1 ∈ B , ( a 1 - b 1 ) + B lo hará seguramente incluye un 1 ). Del mismo modo, la diferencia a 1 - b 2 aparece en algún lugar dea1a1−b1Da1b1∈B(a1−b1)+Ba1a1−b2D , y haráque se vuelva a sugerir un 1 . De esta manera, vemos que el valor correcto de un 1 se sugerirá al menos 6 veces. Lo mismo vale para un 2 y un 3 , y así sucesivamente.Da1a1a2a3
Entonces, sea A ∗ el conjunto de números a ∗ que se han sugerido al menos 6 veces. Esto seguramente será una sobre-aproximación de las a 's, según los comentarios anteriores.A∗a∗a
Como una optimización, podemos filtrar todas las sugerencias que no están presentes en un inmediato: en otras palabras, podemos tratar la diferencia d como una sugerencia de todos los valores ( d + B ) ∩ A . Esto asegura que tendrán un * ⊆ A . Esperamos que A ∗ sea estrictamente más pequeño que A ; sin garantías, pero si todo va bien, tal vez lo sea.Ad(d+B)∩AA∗⊆AA∗A
En conjunto, el algoritmo para refinar A , B para producir A ∗ es el siguiente:A,BA∗
Deje que S = ∪ d ∈ D ( d + B ) ∩ A . Este es el conjunto múltiple de sugerencias.S=∪d∈D(d+B)∩A
Cuente cuántas veces cada valor aparece en S . Deje A * el conjunto de valores que aparecen por lo menos 6 veces en S . (Esto se puede implementar de manera eficiente mediante la construcción de una matriz de una de 251 inicialmente, inicialmente todos cero, y cada vez el número s se sugiere, se incrementa un [ s ] ; al final se barre a través de un busca de elementos cuyo valor es 6 o más grande)SA∗Sasa[s]a
Se puede construir un método similar para refinar A , B para obtener B ∗ . You cosas básicamente inversa arriba y voltear algunas señales: por ejemplo, en lugar de d + B , se mire - d + A .A,BB∗d+B−d+A
Cómo calcular una sobre-aproximación inicial. Para obtener nuestra sobre-aproximación inicial, una idea es suponer (wlog) que b 1 = 0 . De ello se deduce que cada valor a i debe aparecer en algún lugar entre D , por lo tanto, la lista de diferencias D se puede utilizar como nuestra sobre-aproximación inicial para las a 's. Desafortunadamente, esto no nos da una sobre-aproximación muy útil para los b 's.b1=0aiDDab
Un mejor enfoque es adivinar adicionalmente el valor de una de las a 's. En otras palabras, suponemos (wlog) que b 1 = 0 , y usamos A = D como nuestra sobre-aproximación inicial de las a 's. Entonces, adivinamos cuál de estos 36 valores es de hecho una de las a 's, digamos un 1 . Eso nos da una sobre-aproximación B = a 1 - D para las b 's. Utilizamos esta sobre-aproximación inicial A , Bab1=0A=Daaa1B=a1−DbA,B, luego refínalo iterativamente hasta la convergencia y prueba si el resultado es correcto. Repetimos hasta 36 veces, con 36 diferentes conjeturas en un 1 (en promedio 6 conjeturas debería ser suficiente) hasta que encuentre uno que funcione.a1
Un algoritmo completo. Ahora podemos tener un algoritmo completo para calcular a 1 , ... , a 6 , b 1 , ... , b 6 . Básicamente, derivamos una sobre-aproximación inicial para A y B , luego la refinamos iterativamente.a1,…,a6,b1,…,b6AB
Adivina: para cada z ∈ D , adivina que a 1 = z . Haz lo siguiente:z∈Da1=z
Inicial sobre-aproximación: Definir A = D y B = z - D .A=DB=z−D
Refinamiento iterativo: aplique repetidamente lo siguiente hasta la convergencia:
- Refine A , B para obtener una nueva sobre-aproximación B ∗ de las b 's.A,BB∗b
- Refine A , B ∗ para obtener una nueva sobre-aproximación A ∗ de las a 's.A,B∗A∗a
- Deje A : = A ∗ y B : = B ∗ .A:=A∗B:=B∗
Compruebe el éxito: si los conjuntos resultantes A , B tienen cada uno un tamaño 6, pruebe si son una solución válida para el problema. Si lo son, deténgase. Si no, continúe con el ciclo sobre los valores candidatos de z .A,Bz
Análisis.
esto funcionara? ¿Eventualmente convergerá en A = { a 1 , ... , a 6 } y B = { b 1 , ... , b 6 } , o se atascará sin resolver completamente el problema? La mejor manera de averiguarlo es probablemente probarlo. Sin embargo, para sus parámetros, sí, espero que sea efectivo.A={a1,…,a6}B={b1,…,b6}
Si usamos el método # 1, siempre que | A | , | B | no son demasiado grandes, heurísticamente espero que los tamaños de los conjuntos se reduzcan monotónicamente. Considere derivar Una * de A , B . Cada diferencia d sugiere | B | valores; uno de ellos correcto, y el otro | B | - 1 puede ser tratado (heurísticamente) como números aleatorios. Si x es un número que no aparece entre las a 's, ¿cuál es la probabilidad de que sobreviva al filtrado y se agregue a A|A|,|B|A∗A,Bd|B||B|−1xa∗ ? Bueno, esperamos una a sugerirse sobre ( | B | - 1 ) × 36 / 251 veces en total (en promedio, con una desviación estándar sobre la raíz cuadrada de eso). Si | B | ≤ 36 , la probabilidad de que una x incorrectasobreviva al filtrado debe ser aproximadamente p = 0.4 o menos (usando la aproximación normal para el binomio, con corrección de continuidad). (La probabilidad es menor si | B | es menor; por ejemplo, para | B | =A∗a(|B|−1)×36/251|B|≤36xp=0.4|B|30 , espero p ≈ 0.25 .) Espero que el tamaño de A ∗ sea aproximadamente p ( | A | - 6 ) + 6 , lo que mejorará estrictamente la sobre-aproximación ya que es estrictamente más pequeño que | A | . Por ejemplo, si | A | = | B | = 36 , luego basado en estas heurísticas que espero | A ∗ | ≈ 18 , que es una gran mejora sobre | A ||B|=30p≈0.25A∗p(|A|−6)+6|A||A|=|B|=36|A∗|≈18|A|.
Por lo tanto, predigo que el tiempo de ejecución será muy rápido. Espero que aproximadamente 3-5 iteraciones de refinamiento sean suficientes para la convergencia, por lo general, y aproximadamente 6 conjeturas en z probablemente deberían ser suficientes. Cada operación de refinamiento involucra quizás unos pocos miles de lecturas / escrituras de memoria, y lo hacemos tal vez 20-30 veces. Entonces, espero que esto sea muy rápido, para los parámetros que especificó. Sin embargo, la única forma de averiguarlo con certeza es probarlo y ver si funciona bien o no.z