Dado um conjunto múltiplo de números naturais X, considere o conjunto de todas as somas possíveis:
Por exemplo, enquanto .
Qual é o algoritmo mais eficiente para calcular a operação inversa (medida em termos do tamanho do conjunto de somas de entrada)? Especificamente, é possível calcular com eficiência qualquer um dos seguintes itens:
- Se um determinado conjunto é um conjunto válido de somas. (Por exemplo, é válido, mas não é.)
- Um multiset que soma ao conjunto fornecido.
- O menor conjunto múltiplo que soma ao conjunto especificado. (Por exemplo, e ambos somam mas o primeiro é menor.)
algorithms
optimization
combinatorics
integers
Uri Granta
fonte
fonte
Respostas:
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.am P
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 }am am Seu 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 .umas Seu j Seu j umas Seu j umap umap+ as Seu 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 j umas umas+ ap umap+ as Seu j umap umas Seu 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 j Seu j P
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 j Seu 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. )P P P
(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:
Represente 15 de todas as maneiras possíveis como uma soma de dois números do conjunto de somas.
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 está repetindo em todos os grupos, portanto, extraímos . Extraímos 5 apenas uma vez de cada grupo.P= { 5 }
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
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 }
Agora tentamos com 3 e temos 5 = 3 + 2. Adicione-o ao grupo.
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 j P
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7
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.)
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.
Se qualquer representação binária corresponder à soma que não puder ser encontrada, relate que não há solução.
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.
Partes do algoritmo assumem que podemos encontrar o par de somas em tempo linear e isso requer classificação.
Início incorreto
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.
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.
fonte
NOTA: Isso não funciona muito bem em geral, veja o contra-exemplo de Uri abaixo.
fonte