Solução
A solução tem duas partes. Primeiro descobrimos o conjunto mínimo e depois provamos que ele pode representar o conjunto da soma de potência. A solução é ajustada para implementação de programação.
Algoritmo de conjunto mínimo
Encontre o elemento máximo do conjunto da soma (multi). P , o conjunto mínimo potencial (multi) está inicialmente vazio.amP
A menos que haja apenas um grupo, representam de todas as maneiras possíveis como um par de montantes que se somam a um m , S i j = { ( um i , um j ) | a i + a j = a m }amamSeu j= { ( aEu, umj) | umaEu+ aj= am}
Verifique se todos os elementos do conjunto de somas estão incluídos.
Encontre o elemento máximo de todos os S i j (ou seja, juntos) com a seguinte propriedade: para cada S i j , a s está em S i j , ou podemos encontrar um p do conjunto de somas para que um p + a s está em S i j .umasSeu jSeu jumasSeu jumapumap+ asSeu j
Se não contiver a s , apenas a soma a s + a p , remova a p + a s de S i j (ou marque apenas uma marca para ignorá-la) e insira a p e a s em S i j .Seu jumasumas+ apumap+ asSeu jumapumasSeu j
Se um elemento está presente em cada removê-lo de todo S i j uma vez (ou apenas definir uma marca de ignorá-lo e não tocá-lo por mais tempo) e adicioná-lo à lista de elementos de potencial mínimo set P .Seu jSeu jP
Repita até que todos os estejam vaziosSeu j
Se parte de permanecer vazia e não pudermos continuar, tente novamente com o valor máximo de todas as S i j .Seu jSeu j
Recriar os passos recursiva sem remoções e continuar com o algoritmo de cobertura set poder sobre . (Antes disso, você pode fazer uma verificação segura de que P inclui todos os elementos que não podem ser representados como uma soma de dois elementos, portanto, eles devem estar no conjunto subjacente, com certeza. Por exemplo, o elemento mínimo deve estar em P. )PPP
(10. Observe que uma solução de conjunto mínima, que é o objetivo do algoritmo, não pode conter mais de uma repetição do mesmo número.)
Exemplo:
{ 2 , 3 , 5 , 7 , 8 , 10 , 12 , 13 , 15 }
Represente 15 de todas as maneiras possíveis como uma soma de dois números do conjunto de somas.
( 13 , 2 ) , ( 12 , 3 ) , ( 10 , 5 ) , ( 8 , 7 )
Tente encontrar o número máximo que está em todos os grupos ou que pode ser representado como uma soma. Obviamente, podemos começar a procurá-lo a partir das 8, não faz sentido ir além.
13 do primeiro grupo é 13 = 8 + 5, então 13 é bom, mas 12 do segundo grupo não é bom, pois não há 4 para fazer 12 = 8 + 4 no conjunto de somas. Em seguida, tentamos com 7. Mas imediatamente 13 não podem ser cobertos, não há 6.
Em seguida, tentamos 5. 13 = 5 + 8, 12 = 5 + 7, 10 = 5 + 5, e nos últimos 8 = 5 + 3 ou 7 = 5 + 2, mas não ambos. Os grupos são agora:
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7 )
5 está repetindo em todos os grupos, portanto, extraímos . Extraímos 5 apenas uma vez de cada grupo.P= { 5 }
( 8 , 2 ) , ( 7 , 3 ) , ( 5 , 5 ) , ( 3 , 7 )
Obviamente, não há sentido em ir além de 5, então tentamos 5 novamente. 8 = 5 + 3, 7 = 5 + 2, então está tudo bem
( ( 5 , 3 ) , 2 ) , ( ( 5 , 2 ) , 3 ) , ( 5 , 5 ) , ( 3 , ( 5 , 2 ) )
Extraia um 5 novamente de todos os grupos, pois está repetindo. (Isso não é comum, mas nosso caso é deliberadamente criado para mostrar o que fazer caso tenhamos repetições.) P= { 5 , 5 }
( 3 , 2 ) , ( 2 , 3 ) , ( 5 ) , ( 3 , 2 )
Agora tentamos com 3 e temos 5 = 3 + 2. Adicione-o ao grupo.
( 3 , 2 ) , ( 2 , 3 ) , ( 3 , 2 ) , ( 3 , 2 )
Agora extraia 3 e 2, pois eles estão repetindo em todos os lugares e estamos bem e os grupos estão vazios.P= { 5 , 5 , 3 , 2 }
( ) , ( ) , ( ) , ( )
Agora, precisamos recriar passos recursiva sem remoções, isto significa simplesmente fazer o acima sem realmente remover os elementos de apenas colocando-os em P e marcação não para alterá-lo por mais tempo.Seu jP
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7
( 13 , 2 ) , ( 12 , 3 ) , ( 10 , 5 ) , ( 8 , 7 )
( ( 5 , ( 5 , 3 ) ) , 2 ) , ( ( 5 , ( 5 , 2 ) )) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7 )
( ( 5 , ( 5 , 3 ) ) , 2 ) , ( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )
Cobertura do conjunto de potência
O objetivo desta parte é verificar se o conjunto mínimo encontrado é capaz de cobrir o conjunto de soma de potência. É possível que uma solução encontrada possa cobrir todas as somas fornecidas, mas elas não são somas de conjunto de potência. (Tecnicamente, você pode simplesmente criar um conjunto de soma de potência a partir do conjunto mínimo encontrado e verificar se cada soma, como dita o conjunto de potência, está no conjunto de soma inicial. Isso é tudo que acabou de ser mesclado com o que já temos, para que nada seja desperdiçado. Você pode fazer esta parte enquanto rebobina a recursão.)
- Codifique todos os elementos do conjunto mínimo usando potências sucessivas de 2. A ordem não é importante. Codifique o mesmo elemento com um novo valor quantas vezes estiver repetindo. Comece com C = 1, cada elemento seguinte tem C = 2C.
( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] )
- Substitua os elementos na lista de recursão restaurada,
( ( 5 , ( 5 , 3 ) ) , 2 ) , ( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )
com a codificação: 2 com 1, 3 com 2, 5 com 4 e outro 5 com 8. Observe que cada elemento tem codificação diferente, mesmo que sejam repetidos.
( ( 4 , ( 8 , 2 ) ) , 1 ) , ( ( 4 , ( 8 , 1 )) ) , 2 ) , ( ( 4 , ( 2 , 1 ) ) , 8 ) , ( ( 8 , 2 ) , ( 4 , 1 ) )
- Colete todas as somas intermediárias, no momento em que temos (1,2,4,8)
( ( 4 , ( 10 ) ) , 1 ) , ( ( 4 , ( 9 ) ) , 2 ) , ( ( 4 , ( 3 ) ) , 8 ) , ( ( 10 ) , ( 5 ) )
( 1 , 2 , 3 , 4 , 5 , 8 , 9 , 10 )
( ( 14 ) , 1 ) , ( ( 13 ) , 2 ) , ( ( 7 ) , 8 ) , ( 15 )
( 1 , 2 , 3 , 4 , 5 , 8 , 9 , 10 , 13 , 14 , 15 )
{ ( 15 ) , ( 15 ) , ( 15 ) , ( 15 ) }
2m- 1mm = 4
12m- 1
( 6 , 7 , 11 , 12 )
- Justifique sua ausência da seguinte maneira: represente cada número em forma binária
( 6 = 01102)
( 7 = 01112)
( 11 = 10112)
( 12 = 10102)
601102( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] ){ 2 , 3 , 5 , 7 , 8 , 10 , 12 , 13 , 15 }, então está tudo bem.
701112( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] )
1112
Se qualquer representação binária corresponder à soma que não puder ser encontrada, relate que não há solução.
( 2 , 3 , 5 , 5 )
Discussão
Era necessário fornecer o algoritmo que verifica se as somas cobrem a conclusão do conjunto de potência, que é o que está oculto na expansão binária. Por exemplo, se excluirmos 8 e 7 do exemplo inicial, a primeira parte ainda forneceria a solução, apenas a segunda parte relataria combinações ausentes de somas.
m n l o g( M )m log2( M )mnregistro( M )
mregistromm log2( M )
m log3( M )
Partes do algoritmo assumem que podemos encontrar o par de somas em tempo linear e isso requer classificação.
Início incorreto
2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 152 , 3 , 4 , 6Seu j
5 , 4 , 3 , 3
2 , 2 , 3 , 4 , 42 , 3 , 4 , 6
O objetivo deste algoritmo é fornecer uma solução depois de iniciar tudo corretamente.
Melhorias
O passo 4. é aquele que pode ser atualizado dessa maneira: em vez de máximo, poderíamos experimentar todos os elementos em ordem decrescente que satisfaçam a condição especificada. Criamos um ramo separado para cada um. Se algum ramo não der uma solução, cancele-o.
2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 157 , 6 , 5 , 4de maneiras separadas, pois todos eles estão passando no primeiro teste. (Não há razão para usar 2 ou 3, pois sabemos que eles precisam estar no conjunto subjacente.) E simplesmente continue assim até coletarmos todas as versões que podem chegar ao fim. Isso criaria uma solução de cobertura total que descobriria mais de um conjunto subjacente.
Outra coisa, como sabemos que não podemos ter mais de uma repetição se o caso for mínimo, podemos incorporar isso em nosso algoritmo.
No geral, a condição na etapa 4. de que um número deve se repetir em todos os grupos ou ter capacidade de criar uma soma é forte o suficiente para nos tirar das águas exponenciais diretas, o que seria um algoritmo de simplesmente experimentar todas as combinações e criar o poder definido sobre cada um até encontrarmos uma correspondência.