SlideShare uma empresa Scribd logo
1 de 29
Backtracking
Curso de Maratona de Programação
ICT-Unifesp
Backtracking
• De acordo com o Wikipédia:
• Backtracking é um tipo de algoritmo que representa um refinamento da busca
por força bruta, em que múltiplas soluções podem ser eliminadas sem serem
explicitamente examinadas.
2
Backtracking
• A recursividade pode ser usada para resolver problemas cuja solução
é do tipo tentar todas as alternativas possíveis.
• O backtracking executa podas quando não é possível encontrar uma
solução pelo caminho escolhido.
3
Backtracking
• NULL quer encontrar a saída do labirinto...
4
Vou tentar
por aqui...
?
Backtracking
• NULL quer encontrar a saída do labirinto...
5
Opa, consegui,
vou continuar...
?
Backtracking
• NULL quer encontrar a saída do labirinto...
6
Sem saída, vou
fazer o
backtracking!!
?
Backtracking
• NULL quer encontrar a saída do labirinto...
7
Vou tentar por
outro caminho...
?
Sem saída
Backtracking
• NULL quer encontrar a saída do labirinto...
8
TRIVIAL!!
?
Sem saída
Backtracking
• Imagine um problema com as seguintes características:
• Você tem que fazer uma série de decisões...
• Você não tem informações suficientes para saber o que escolher...
• Cada decisão leva a um novo conjunto de escolhas...
• Alguma sequência de escolhas pode ser uma solução para o seu problema...
• Backtracking pode ser uma boa forma de experimentar várias sequências de
decisões até encontrar uma que funciona!
9
Backtracking
• A busca em profundidade (DFS) explora tanto quanto possível um
ramo antes de retroceder. É o que acontece no backtracking!
10
Gerando todos os subconjuntos
• Problema: gerando todos os subconjuntos
• Temos um conjunto S = {1 ... N}
• Objetivo: imprimir todos os subconjuntos a partir de N elementos.
• Para S = {1, 2} (N = 2) temos os subconjuntos: {1,2}, {1}, {2}, {}
• {1, 2} é o mesmo que {2, 1}
• O número de possíveis subconjuntos é 2^N
11
Gerando todos os subconjuntos
• Ideia: ou o elemento faz parte do subconjunto ou não faz parte.
• Pode-se construir um vetor de bool de tamanho N.
• Para S = {1, 2}, teríamos um vetor inicialmente com {0, 0}.
• Para S = {1, 2, 3}, teríamos um vetor inicialmente com {0, 0, 0}.
• Esse vetor irá nos ajudar a construir todos os subconjuntos.
• Se vet é o vetor de bool, vet[i] indica se o i-ésimo elemento está ou
não está no subconjunto.
12
Gerando todos os subconjuntos
• Uma variável K indicará qual elemento será colocado ou removido do
subconjunto.
• S(K) = (true, false)
• Seja F nossa função para gerar todos os subconjuntos, ela pode ser
definida como F(K, N).
• Inicialmente F é chamada da seguinte forma:
• F(1, N) // indexando a partir do 1
13
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
14
1 pertence a S
2 pertence a S
K
vet = [1, 0]
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
15
1 pertence a S
2 pertence a S
K == N, imprime {1, 2}
vet = [1, 0]
vet = [1, 1]
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
16
1 pertence a S
2 pertence a S
imprime {1, 2} Backtracking, o vet até então era [1, 1],
quando retrocede, fazemos vet[K] = 0,
se K = 2, teremos que vet = [1, 0]
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
17
1 pertence a S
2 pertence a S
imprime {1, 2}
vet = [1, 0]
K == N, imprime {1}
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
18
1 pertence a S
2 pertence a S
imprime {1, 2}
imprime {1}
ramo processado
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
19
1 pertence a S
2 pertence a S
imprime {1, 2}
imprime {1}
backtracking vet era [1, 0],
como K = 1, fazemos vet[K] = 0,
portanto, vet = [0, 0]
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
20
1 pertence a S
2 pertence a S
imprime {1, 2}
imprime {1}
vet = [0, 0]
2 pertence a S
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
21
1 pertence a S
2 pertence a S
imprime {1, 2}
imprime {1}
2 pertence a S
K == N, imprime {2}
vet = [0, 1]
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
22
1 pertence a S
2 pertence a S
imprime {1, 2}
imprime {1}
2 pertence a S
imprime {2}
backtracking...
vet = [0, 0]
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
23
1 pertence a S
2 pertence a S
imprime {1, 2}
imprime {1}
2 pertence a S
imprime {2}
K == N, imprime {}
vet = [0, 0]
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
24
1 pertence a S
2 pertence a S
imprime {1, 2}
imprime {1}
2 pertence a S
imprime {2}
K == N, imprime {}
ramo processado
Gerando todos os subconjuntos
• Construindo a árvore para S = {1, 2}, N = 2
25
1 pertence a S
2 pertence a S
imprime {1, 2}
imprime {1}
2 pertence a S
imprime {2}
imprime {}
Todos os subconjuntos
foram gerados
Gerando todos os subconjuntos
• Construindo a função F (indexando a partir do 0)...
26
Gerando todos os subconjuntos
• Construindo a função F ...
27
Gerando todos os subconjuntos
• Código em C++
• https://goo.gl/9J7Zhi
28
Dúvidas?
mcastrosouza@live.com
twitter.com/mcastrosouza
29

Mais conteúdo relacionado

Mais procurados

Processamento digital de sinais
Processamento digital de sinaisProcessamento digital de sinais
Processamento digital de sinais
Luiz Henrique
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説
AtCoder Inc.
 
Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)
Ricardo Terra
 
Matemática Discreta - Parte V relações
Matemática Discreta - Parte V relaçõesMatemática Discreta - Parte V relações
Matemática Discreta - Parte V relações
Ulrich Schiel
 

Mais procurados (20)

AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説
 
Lógica de Programação - Estruturas de Seleção
Lógica de Programação - Estruturas de SeleçãoLógica de Programação - Estruturas de Seleção
Lógica de Programação - Estruturas de Seleção
 
Aula 2 - Processos de Software
Aula 2 - Processos de SoftwareAula 2 - Processos de Software
Aula 2 - Processos de Software
 
Longest Common Subsequence
Longest Common SubsequenceLongest Common Subsequence
Longest Common Subsequence
 
Sistemas de controle de versão
Sistemas de controle de versãoSistemas de controle de versão
Sistemas de controle de versão
 
Algoritmos 05 - Estruturas de repetição
Algoritmos 05 - Estruturas de repetiçãoAlgoritmos 05 - Estruturas de repetição
Algoritmos 05 - Estruturas de repetição
 
アルゴリズムとデータ構造13
アルゴリズムとデータ構造13アルゴリズムとデータ構造13
アルゴリズムとデータ構造13
 
Bubble Sort
Bubble SortBubble Sort
Bubble Sort
 
Processamento digital de sinais
Processamento digital de sinaisProcessamento digital de sinais
Processamento digital de sinais
 
Computacao Numérica
Computacao NuméricaComputacao Numérica
Computacao Numérica
 
Algoritmos de ordenação - heapsort
Algoritmos de ordenação - heapsortAlgoritmos de ordenação - heapsort
Algoritmos de ordenação - heapsort
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説
 
Bellman Ford Algorithm
Bellman Ford AlgorithmBellman Ford Algorithm
Bellman Ford Algorithm
 
Análise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenaçãoAnálise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenação
 
Algoritmo Shell Sort
Algoritmo Shell SortAlgoritmo Shell Sort
Algoritmo Shell Sort
 
Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)
 
Estatística Aplicada à Administração - Aula 09: Tipos de Escalas
Estatística Aplicada à Administração - Aula 09: Tipos de EscalasEstatística Aplicada à Administração - Aula 09: Tipos de Escalas
Estatística Aplicada à Administração - Aula 09: Tipos de Escalas
 
Lista Encadeada Simples: Inserção no Final
Lista Encadeada Simples: Inserção no FinalLista Encadeada Simples: Inserção no Final
Lista Encadeada Simples: Inserção no Final
 
Matemática Discreta - Parte V relações
Matemática Discreta - Parte V relaçõesMatemática Discreta - Parte V relações
Matemática Discreta - Parte V relações
 

Destaque

Destaque (20)

Agrupamento (clustering) - K-Means
Agrupamento (clustering) - K-MeansAgrupamento (clustering) - K-Means
Agrupamento (clustering) - K-Means
 
Algoritmo de Kosaraju
Algoritmo de KosarajuAlgoritmo de Kosaraju
Algoritmo de Kosaraju
 
Listas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionáriosListas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionários
 
Agrupamento com K-Means
Agrupamento com K-MeansAgrupamento com K-Means
Agrupamento com K-Means
 
Expressões Regulares com Python 3
Expressões Regulares com Python 3Expressões Regulares com Python 3
Expressões Regulares com Python 3
 
Python - Dicionários
Python - DicionáriosPython - Dicionários
Python - Dicionários
 
Busca em largura - BFS
Busca em largura - BFSBusca em largura - BFS
Busca em largura - BFS
 
Programação dinâmica
Programação dinâmicaProgramação dinâmica
Programação dinâmica
 
Análise Assintótica
Análise AssintóticaAnálise Assintótica
Análise Assintótica
 
Algoritmos gulosos
Algoritmos gulososAlgoritmos gulosos
Algoritmos gulosos
 
Problema do Caixeiro Viajante
Problema do Caixeiro ViajanteProblema do Caixeiro Viajante
Problema do Caixeiro Viajante
 
Problema da Mochila 0-1 (Knapsack problem)
Problema da Mochila 0-1 (Knapsack problem)Problema da Mochila 0-1 (Knapsack problem)
Problema da Mochila 0-1 (Knapsack problem)
 
Maratona de Programação com STL
Maratona de Programação com STLMaratona de Programação com STL
Maratona de Programação com STL
 
Metaheurística Simulated Annealing
Metaheurística Simulated AnnealingMetaheurística Simulated Annealing
Metaheurística Simulated Annealing
 
Estruturas de dados com C++ e STL
Estruturas de dados com C++ e STLEstruturas de dados com C++ e STL
Estruturas de dados com C++ e STL
 
Backtracking
BacktrackingBacktracking
Backtracking
 
Tabela Hash
Tabela HashTabela Hash
Tabela Hash
 
Python - Set
Python - SetPython - Set
Python - Set
 
Fila de prioridades
Fila de prioridadesFila de prioridades
Fila de prioridades
 
Binary heap
Binary heapBinary heap
Binary heap
 

Mais de Marcos Castro

Mais de Marcos Castro (14)

Árvores de Decisão
Árvores de DecisãoÁrvores de Decisão
Árvores de Decisão
 
Colored de Bruijn Graphs
Colored de Bruijn GraphsColored de Bruijn Graphs
Colored de Bruijn Graphs
 
Maratona de Programação
Maratona de ProgramaçãoMaratona de Programação
Maratona de Programação
 
Bioinformática
BioinformáticaBioinformática
Bioinformática
 
Arquivos FASTQ
Arquivos FASTQArquivos FASTQ
Arquivos FASTQ
 
Ferramentas para Bioinformática
Ferramentas para BioinformáticaFerramentas para Bioinformática
Ferramentas para Bioinformática
 
A importância da Bioinformática
A importância da BioinformáticaA importância da Bioinformática
A importância da Bioinformática
 
Bioinformática
BioinformáticaBioinformática
Bioinformática
 
Redes Neurais Artificiais
Redes Neurais ArtificiaisRedes Neurais Artificiais
Redes Neurais Artificiais
 
Agrupamento de sequências biológicas
Agrupamento de sequências biológicasAgrupamento de sequências biológicas
Agrupamento de sequências biológicas
 
Longest palindromic subsequence (LPS)
Longest palindromic subsequence (LPS)Longest palindromic subsequence (LPS)
Longest palindromic subsequence (LPS)
 
Algoritmo de Knuth-Morris-Pratt - KMP
Algoritmo de Knuth-Morris-Pratt - KMPAlgoritmo de Knuth-Morris-Pratt - KMP
Algoritmo de Knuth-Morris-Pratt - KMP
 
Bioinformática com Biopython
Bioinformática com BiopythonBioinformática com Biopython
Bioinformática com Biopython
 
Problema das N rainhas (Backtracking)
Problema das N rainhas (Backtracking)Problema das N rainhas (Backtracking)
Problema das N rainhas (Backtracking)
 

Último (6)

Apresentação sobre o cientista linus pauling.pptx
Apresentação sobre o cientista linus pauling.pptxApresentação sobre o cientista linus pauling.pptx
Apresentação sobre o cientista linus pauling.pptx
 
Historia da Agricultura Agronomia 2017.pptx
Historia da Agricultura Agronomia 2017.pptxHistoria da Agricultura Agronomia 2017.pptx
Historia da Agricultura Agronomia 2017.pptx
 
NEUROCIENCIA I (1).ppt aula explicativa 1
NEUROCIENCIA I (1).ppt aula explicativa 1NEUROCIENCIA I (1).ppt aula explicativa 1
NEUROCIENCIA I (1).ppt aula explicativa 1
 
Planejamento do viveiro de mudas florestais
Planejamento do viveiro de mudas florestaisPlanejamento do viveiro de mudas florestais
Planejamento do viveiro de mudas florestais
 
Estudo Dirigido Sistema Cardiovascular - 8°.docx
Estudo Dirigido Sistema Cardiovascular - 8°.docxEstudo Dirigido Sistema Cardiovascular - 8°.docx
Estudo Dirigido Sistema Cardiovascular - 8°.docx
 
Bilhete de Identidade sobre o Tungsténio.pptx
Bilhete de Identidade sobre o Tungsténio.pptxBilhete de Identidade sobre o Tungsténio.pptx
Bilhete de Identidade sobre o Tungsténio.pptx
 

Backtracking - Gerar todos os subconjuntos

  • 1. Backtracking Curso de Maratona de Programação ICT-Unifesp
  • 2. Backtracking • De acordo com o Wikipédia: • Backtracking é um tipo de algoritmo que representa um refinamento da busca por força bruta, em que múltiplas soluções podem ser eliminadas sem serem explicitamente examinadas. 2
  • 3. Backtracking • A recursividade pode ser usada para resolver problemas cuja solução é do tipo tentar todas as alternativas possíveis. • O backtracking executa podas quando não é possível encontrar uma solução pelo caminho escolhido. 3
  • 4. Backtracking • NULL quer encontrar a saída do labirinto... 4 Vou tentar por aqui... ?
  • 5. Backtracking • NULL quer encontrar a saída do labirinto... 5 Opa, consegui, vou continuar... ?
  • 6. Backtracking • NULL quer encontrar a saída do labirinto... 6 Sem saída, vou fazer o backtracking!! ?
  • 7. Backtracking • NULL quer encontrar a saída do labirinto... 7 Vou tentar por outro caminho... ? Sem saída
  • 8. Backtracking • NULL quer encontrar a saída do labirinto... 8 TRIVIAL!! ? Sem saída
  • 9. Backtracking • Imagine um problema com as seguintes características: • Você tem que fazer uma série de decisões... • Você não tem informações suficientes para saber o que escolher... • Cada decisão leva a um novo conjunto de escolhas... • Alguma sequência de escolhas pode ser uma solução para o seu problema... • Backtracking pode ser uma boa forma de experimentar várias sequências de decisões até encontrar uma que funciona! 9
  • 10. Backtracking • A busca em profundidade (DFS) explora tanto quanto possível um ramo antes de retroceder. É o que acontece no backtracking! 10
  • 11. Gerando todos os subconjuntos • Problema: gerando todos os subconjuntos • Temos um conjunto S = {1 ... N} • Objetivo: imprimir todos os subconjuntos a partir de N elementos. • Para S = {1, 2} (N = 2) temos os subconjuntos: {1,2}, {1}, {2}, {} • {1, 2} é o mesmo que {2, 1} • O número de possíveis subconjuntos é 2^N 11
  • 12. Gerando todos os subconjuntos • Ideia: ou o elemento faz parte do subconjunto ou não faz parte. • Pode-se construir um vetor de bool de tamanho N. • Para S = {1, 2}, teríamos um vetor inicialmente com {0, 0}. • Para S = {1, 2, 3}, teríamos um vetor inicialmente com {0, 0, 0}. • Esse vetor irá nos ajudar a construir todos os subconjuntos. • Se vet é o vetor de bool, vet[i] indica se o i-ésimo elemento está ou não está no subconjunto. 12
  • 13. Gerando todos os subconjuntos • Uma variável K indicará qual elemento será colocado ou removido do subconjunto. • S(K) = (true, false) • Seja F nossa função para gerar todos os subconjuntos, ela pode ser definida como F(K, N). • Inicialmente F é chamada da seguinte forma: • F(1, N) // indexando a partir do 1 13
  • 14. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 14 1 pertence a S 2 pertence a S K vet = [1, 0]
  • 15. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 15 1 pertence a S 2 pertence a S K == N, imprime {1, 2} vet = [1, 0] vet = [1, 1]
  • 16. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 16 1 pertence a S 2 pertence a S imprime {1, 2} Backtracking, o vet até então era [1, 1], quando retrocede, fazemos vet[K] = 0, se K = 2, teremos que vet = [1, 0]
  • 17. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 17 1 pertence a S 2 pertence a S imprime {1, 2} vet = [1, 0] K == N, imprime {1}
  • 18. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 18 1 pertence a S 2 pertence a S imprime {1, 2} imprime {1} ramo processado
  • 19. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 19 1 pertence a S 2 pertence a S imprime {1, 2} imprime {1} backtracking vet era [1, 0], como K = 1, fazemos vet[K] = 0, portanto, vet = [0, 0]
  • 20. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 20 1 pertence a S 2 pertence a S imprime {1, 2} imprime {1} vet = [0, 0] 2 pertence a S
  • 21. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 21 1 pertence a S 2 pertence a S imprime {1, 2} imprime {1} 2 pertence a S K == N, imprime {2} vet = [0, 1]
  • 22. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 22 1 pertence a S 2 pertence a S imprime {1, 2} imprime {1} 2 pertence a S imprime {2} backtracking... vet = [0, 0]
  • 23. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 23 1 pertence a S 2 pertence a S imprime {1, 2} imprime {1} 2 pertence a S imprime {2} K == N, imprime {} vet = [0, 0]
  • 24. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 24 1 pertence a S 2 pertence a S imprime {1, 2} imprime {1} 2 pertence a S imprime {2} K == N, imprime {} ramo processado
  • 25. Gerando todos os subconjuntos • Construindo a árvore para S = {1, 2}, N = 2 25 1 pertence a S 2 pertence a S imprime {1, 2} imprime {1} 2 pertence a S imprime {2} imprime {} Todos os subconjuntos foram gerados
  • 26. Gerando todos os subconjuntos • Construindo a função F (indexando a partir do 0)... 26
  • 27. Gerando todos os subconjuntos • Construindo a função F ... 27
  • 28. Gerando todos os subconjuntos • Código em C++ • https://goo.gl/9J7Zhi 28