1 / 21

Subset Sum Algoritmos e Estruturas de Dados – IF672

Subset Sum Algoritmos e Estruturas de Dados – IF672. [ibfs@cin.ufpe.br]. Soma de subconjuntos. Dado um conjunto de inteiros, existe algum subconjunto dele tal que a soma dos seus elementos seja um valor v’ ?. Soma de subconjuntos.

kert
Download Presentation

Subset Sum Algoritmos e Estruturas de Dados – IF672

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Subset SumAlgoritmos e Estruturas de Dados – IF672 [ibfs@cin.ufpe.br]

  2. Soma de subconjuntos Dado um conjunto de inteiros, existe algum subconjunto dele tal que a soma dos seus elementos seja um valor v’ ?

  3. Soma de subconjuntos • Dado um conjunto de inteiros, existe algum subconjunto dele tal que a soma dos seus elementos seja um valor v’ ? • Exemplo: Dado o seguinte conjunto de inteiros, pergunta-se se existe algum subconjunto tal que sua soma seja 15. • { 1, 3, 7, 6, 8}

  4. Soma de subconjuntos • Dado um conjunto de inteiros, existe algum subconjunto dele tal que a soma dos seus elementos seja um valor v’ ? • Exemplo: Dado o seguinte conjunto de inteiros, pergunta-se se existe algum subconjunto tal que sua soma seja 15. • { 1, 3, 7, 6, 8} • Sim, o subconjunto {1, 6, 8} :)

  5. Solução • Mas como fazer isto ? • Poderíamos montar todos os subconjuntos possíveis do conjunto e testar se sua soma é o valor esperado. Mas essa solução tem complexidade O(2N), já que precisamos gerar todos os subconjuntos possíveis. • :(

  6. Solução • Mas como fazer isto ? • Poderíamos montar todos os subconjuntos possíveis do conjunto e testar se sua soma é o valor esperado. Mas essa solução tem complexidade O(2N), já que precisamos gerar todos os subconjuntos possíveis. • :( • Ou poderíamos usar programação dinâmica para resolver este problema. • :)

  7. Programação Dinâmica • Partindo do princípio que resolver o problema para um conjunto de tamanho N-1 é mais fácil do que para um de tamanho N e de que resolver o problema para um valor v’-1 é mais fácil do que resolver para um valor v’ (Subproblemas), então podemos usar a idéia de: • Resolver a versão mais simples do problema. • Expandir até resolver o problema inicial • :P

  8. Programação Dinâmica • Conjunto { 1, 3, 7, 2, 6} e valor procurado 5. • Vamos criar um array bidimensional sum, tal que: • sum[i][j] me diz se eu posso gerar o valor j usando os i primeiros elementos do conjunto. • Inicialmente, vamos usar os 0 primeiros elementos do conjunto para gerar o valor 0. • sum[0][0] = true; //Já que usando 0 elementos, a soma deles é 0. [trivial] • Agora, vamos usar os 0 primeiros elementos para gerar o valor 1. • sum[0][1] = false; //Já que a soma de 0 elementos é 0. • Para todos os outros valores, sum[0][i] será false.

  9. Programação Dinâmica • Tabela para os 0 primeiros elementos • Note que não precisamos representar “valores” maiores que o nosso “valor objetivo”. Valores Quantidade de elementos

  10. Programação Dinâmica • Conjunto { 1, 3, 7, 2, 6} e valor procurado 5. • Agora, vamos fazer o mesmo processo feito antes, mas agora para os 1-primeiros caras: • Para todo valor v’’ do array, faremos: • Se eu já conseguia gerar este valor usando os 0 primeiros elementos, então eu ainda posso gerar este valor com os 1 primeiros elementos.E como eu já conseguia gerar este valor v’’, então, agora eu posso gerar este valor v’’ somado ao valor do primeiro elemento do conjunto. • Ou seja, usando os 1 primeiros elementos, eu poderei gerar o 0 e o 1. • * Usar não significa necessariamente que eu estou somando ele. Significa que eu já analisei a possibilidade de usá-lo e não usá-lo.

  11. Programação Dinâmica • Tabela para os 1 primeiros elementos Valores Quantidade de elementos

  12. Programação Dinâmica • Conjunto { 1, 3, 7, 2, 6} e valor procurado 5. • Semelhantemente, faremos para todos os k primeiros caras, até usarmos todos os elementos do conjunto. • Para todo valor v’’ do array, faremos: • Se eu já conseguia gerar este valor usando os k-1 primeiros elementos, então eu ainda posso gerar este valor com os k primeiros elementos.E como eu já conseguia gerar este valor v’’, então, agora eu posso gerar este valor v’’ somado ao valor do k-ésimo elemento do conjunto.

  13. Programação Dinâmica • Tabela para os 2 primeiros elementos Valores Quantidade de elementos

  14. Programação Dinâmica • Tabela para os 3 primeiros elementos Valores Quantidade de elementos

  15. Programação Dinâmica • Tabela para os 4 primeiros elementos Valores Quantidade de elementos

  16. Programação Dinâmica • Tabela para os 5 primeiros elementos Valores Quantidade de elementos

  17. Programação Dinâmica • Pela resultado final da tabela, podemos ver que há um subconjunto do conjunto inicial, tal que, sua soma é igual ao valor procurado 5.

  18. Programação Dinâmica • Pela resultado final da tabela, podemos ver que há um subconjunto do conjunto inicial, tal que, sua soma é igual ao valor procurado 5. • Analisando um pouco mais a tabela, podemos ver que o valor 5 já poderia ser gerado usando os 4 primeiros elementos da tabela. • :)

  19. Programação Dinâmica • Qual seria a complexidade deste algoritmo? • N elementos • Valor procurado V • O ( N*V) => O (N) ?

  20. Programação Dinâmica • Qual seria a complexidade deste algoritmo? • N elementos • Valor procurado V • O ( N*V) => O (N) ? • Não exatamente. • Pois V não é uma constante, pois mudando a entrada o seu valor muda. • Mas V está atrelado ao valor então dizemos que o algoritmo é pseudo-polinomial.

  21. Subset SumAlgoritmos e Estruturas de Dados – IF672 [ibfs@cin.ufpe.br]

More Related