Aqui está uma abordagem diferente, baseada na localização iterativa de números que não podem aparecer entre . Chame um conjunto um excesso de aproximação da é se sabemos que . Da mesma forma, é um overapproximation da 's, se sabemos que . Obviamente, quanto menor é, o mais útil desta aproximação é sobre-, e o mesmo se passa com . Minha abordagem baseia-se em refinar iterativamente essas super-aproximações, ou seja, reduzir iterativamente o tamanho desses conjuntos (pois descartamos cada vez mais valores como impossíveis).{a1,…,a6}uma { a 1 , ... , um 6 } ⊆ A B b { b 1 , ... , b 6 } ⊆ B A BAa{a1,…,a6}⊆ABb{b1,…,b6}⊆BAB
O núcleo dessa abordagem é um método de refinamento : dada uma super-aproximação para os 's e uma super-aproximação para os ' s, encontre uma nova super-aproximação para os 's de modo que . Em particular, normalmente será menor que , então isso nos permite refinar a super-aproximação para os 's.AaBbA∗aA * A umA∗⊊AA∗Aa
Por simetria, essencialmente o mesmo truque nos permitirá refinar nossa super-aproximação para os 's: dada uma super-aproximação para os ' s e uma super-aproximação para os 's, produzirá um novo super-aproximação -proximação para os 's.ba B b B ∗ bAaBbB∗b
Então, deixe-me dizer como fazer o refinamento. Depois, reunirei tudo para obter um algoritmo completo para esse problema. A seguir, denota o multi-conjunto de diferenças, ou seja, ; vamos nos concentrar em encontrar um refinado excesso de aproximação , dado .D = { a i - b jDA ∗ A , BD={ai−bj:1≤i,j≤6}A∗A,B
Como calcular um refinamento. Considere-se uma única diferença . Considere o conjunto . Com base no nosso conhecimento de que é uma super aproximação dos , sabemos que pelo menos um elemento de deve ser um elemento de . Portanto, pode-se tratar cada um dos elementos em como uma "sugestão" para um número de, eventualmente, incluir em . Então, vamos varrer todas as diferenças e, para cada uma, identificar quais números são "sugeridos" por .d + B = { d + y : y ∈ B } B b d + B { a 1 , … ,d∈Dd+B={d+y:y∈B}Bbd+Bd + B A d ∈ D d{a1,…,a6}d+BAd∈Dd
Agora vou observar que o número certamente será sugerido pelo menos 6 vezes durante esse processo. Por quê? Como a diferença está em , e quando a processarmos, será um dos números sugeridos (desde que garantimos que , certamente incluirá ). Da mesma forma, a diferença aparece em algum lugar em e fará com que seja sugerido novamente. Dessa forma, vemos que o valor correto de será sugerido pelo menos seis vezes. O mesmo vale para ea 1 - b 1 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 3a1a1−b1Da1b1∈B(a1−b1)+Ba1a1−b2Da1a1a2a3, e assim por diante.
Portanto, seja o conjunto de números que foram sugeridos pelo menos 6 vezes. Esta é a certeza de ser um excesso de aproximação da 's, com os comentários acima.a ∗ aA∗a∗a
Como uma optimização, que pode filtrar todas as sugestões que não estão presentes em imediatamente: por outras palavras, pode-se tratar a diferença como sugerindo todos os valores . Isso garante que teremos . Esperamos que seja estritamente menor que ; sem garantias, mas se tudo correr bem, talvez seja.d ( d + B ) ∩ Uma Um * ⊆ Uma Um * UmAd(d+B)∩AA∗⊆AA∗A
Juntando isso, o algoritmo para refinar para produzir é o seguinte:A ∗A,BA∗
Deixe . Este é o conjunto múltiplo de sugestões.S=∪d∈D(d+B)∩A
Conte quantas vezes cada valor aparece em . Deixe ser o conjunto de valores que aparecem, pelo menos, 6 vezes em . (Isso pode ser implementado de forma eficiente através da construção de um array dos 251 inicialmente, inicialmente todos zero, e cada vez que o número de é sugerido, você incrementa ; no final você varrer procura de elementos cujo valor é 6 ou maior)A ∗ S a s a [ s ] aSA∗Sasa[s]a
Um método semelhante pode ser construído para refinar para obter . Você coisas basicamente reversa acima e virar alguns sinais: por exemplo, em vez de , você olha para .B ∗ d + B - d + AA,BB∗d+B−d+A
Como calcular uma super-aproximação inicial. Para obter nossa super-aproximação inicial, uma idéia é assumir (wlog) que . Segue-se que cada valor deve aparecer em algum lugar entre , portanto a lista de diferenças pode ser usada como nossa super-aproximação inicial para os 's. Infelizmente, isso não nos dá uma super-aproximação muito útil para os 's.a i D D a bb1=0aiDDab
Uma abordagem melhor é adivinhar, adicionalmente, o valor de um dos 's. Em outras palavras, assumimos (WLOG) que , e usar como o nosso excesso de aproximação inicial dos 's. Então, nós adivinhar qual desses 36 valores é de fato um dos 's, dizem . Isso então nos dá uma super-aproximação para os 's. Usamos essa super-aproximação inicial , depois a refinamos iterativamente até a convergência e testamos se o resultado está correto. Repetimos até 36 vezes, com 36 suposições diferentes em (em média, 6 suposições devem ser suficientes) até encontrarmos uma que funcione.b 1 = 0 A = D um um um um B = um 1 - D b A , B um 1ab1=0A=Daaa1B=a1−DbA,Ba1
Um algoritmo completo. Agora podemos ter um algoritmo completo para calcular . Basicamente, derivamos uma super-aproximação inicial para e , depois refinamos iterativamente. A Ba1,…,a6,b1,…,b6AB
Faça um palpite: para cada , que . Faça o seguinte:a 1 = zz∈Da1=z
-aproximação inicial: Defina e .B = z - DA=DB=z−D
Refinamento iterativo: Aplique repetidamente o seguinte até a convergência:
- Refine para obter uma nova super-aproximação dos 's.B ∗ bA,BB∗b
- Refine para obter um novo excesso de aproximação das 's.A ∗ aA,B∗A∗a
- Seja e . B : = B ∗A:=A∗B:=B∗
Verifique o sucesso: se os conjuntos resultantes tiverem tamanho 6, teste se são uma solução válida para o problema. Se estiverem, pare. Caso contrário, continue com o loop sobre os valores candidatos de .zA,Bz
Análise.
Isso vai funcionar? Eventualmente, convergirá para e ou ficará bloqueado sem resolver completamente o problema? A melhor maneira de descobrir é provavelmente testá-lo. No entanto, para seus parâmetros, sim, espero que seja eficaz.A={a1,…,a6}B={b1,…,b6}
Se usarmos o método # 1, desde quenão são muito grandes, heuristicamente, espero que os tamanhos dos conjuntos diminuam monotonicamente. Considere derivando de . Cada diferença sugerevalores; um deles está correto e o outro pode ser tratado (heuristicamente) como números aleatórios. Se é um número que não aparece entre os 's, qual é a probabilidade de que ele sobreviva à filtragem e seja adicionado a ? Bem, esperamos que ser sugerido sobreA ∗ A , B d | B ||A|,|B|A∗A,Bd|B||B|−1xaA∗a(|B|−1)×36/251vezes no total (em média, com desvio padrão sobre a raiz quadrada disso). Se , a probabilidade de um errado sobreviver à filtragem deve ser de cerca de ou mais (usando a aproximação normal para o binômio, com correção de continuidade). (A probabilidade é menor se for menor; por exemplo, para , espero .) Espero que o tamanho de seja aproximadamente , que melhorará estritamente a super aproximação, uma vez que é estritamente menor que. Por exemplo, se , com base nessas heurísticas, espero|B|≤36xp=0.4|B||B|=30p≈0.25A∗| A * | ≈ 18 | Um |p(|A|−6)+6| Um | = | B | = 36 ||A||A|=|B|=36|A∗|≈18 , que é uma grande melhoria em relação a.|A|
Portanto, prevejo que o tempo de execução será muito rápido. Espero que cerca de 3-5 iterações de refinamento sejam suficientes para convergência, normalmente, e cerca de 6 suposições em provavelmente sejam suficientes. Cada operação de refinamento envolve talvez alguns milhares de leituras / gravações de memória, e fazemos isso talvez 20 a 30 vezes. Então, espero que seja muito rápido, para os parâmetros que você especificou. No entanto, a única maneira de descobrir com certeza é experimentá-lo e ver se funciona bem ou não.z