Escolar Documentos
Profissional Documentos
Cultura Documentos
1. Por que backtracking favorece frequentemente melhor eficiência que uma busca exaustiva?
Explique.
Uma das principais vantagens do backtracking é que ele é capaz de evitar a busca exaustiva
em todas as soluções possíveis podando aquelas que não atendem às restrições que devem
ser satisfeitas na solução final e, portanto, não são viáveis, reduzindo assim drasticamente o
espaço de busca.
1
ANÁLISE DE ALGORITMOS
Bacharelado em Ciência da Computação
2
ANÁLISE DE ALGORITMOS
Bacharelado em Ciência da Computação
cuja complexidade é O(n3), que demonstra que essa abordagem não é melhor que o
algoritmo simples (citado no início da questão).
Sendo assim, o cientista inventou as seguintes equações:
4. Por que a recursividade funciona tão bem em divisão-e-conquista, porém não é aplicada em
programação dinâmica? Dica: pense sobre a árvore de recursão gerada para ambas as técnicas!
A recursividade funciona bem em divisão-e-conquista porque essa técnica divide o problema
em subproblemas menores e independentes que podem ser resolvidos recursivamente. Cada
subproblema é resolvido em uma etapa da recursão e seus resultados são combinados para
formar a solução do problema original.
3
ANÁLISE DE ALGORITMOS
Bacharelado em Ciência da Computação
Por outro lado, a programação dinâmica não é geralmente aplicada com recursão direta
porque essa técnica é baseada em memoização, que armazena os resultados dos
subproblemas resolvidos para evitar recalculá-los.
5. Suponham que o algoritmo A opera sobre uma árvore binária, sem modificá-la, como segue: A
processa o nodo-raiz da árvore em tempo O(1) e, então, recursivamente chama A para as subárvores
esquerda e direita. Pode-se afirmar que A pode ser substancialmente mais eficiente usando
programação dinâmica? Justifique.
Não, a programação dinâmica não pode ser aplicada para tornar o algoritmo A mais eficiente.
A programação dinâmica é uma técnica de otimização que se aplica a problemas de
otimização que possuem subestrutura ótima, ou seja, onde as soluções ótimas dos
subproblemas são usadas para construir a solução ótima do problema original.
No caso do algoritmo A, ele apenas percorre a árvore binária sem modificar seus nodos, e não
envolve a otimização de nenhum problema que possua subestrutura ótima. Portanto, a
aplicação de programação dinâmica não traria nenhum benefício para o algoritmo A, que já
possui uma eficiência assintótica de O(n) (onde n é o número de nodos da árvore), que é a
melhor que se pode esperar para uma operação que percorre todos os nodos de uma árvore.
Assim, não é possível aplicar programação dinâmica para tornar o algoritmo A mais eficiente.
A eficiência do algoritmo A depende principalmente da estrutura da árvore binária e da
distribuição dos nodos, e não de uma técnica específica de programação.
6. Suponha uma série de eventos, por exemplo, as transações feitas na bolsa de valores, na forma
compra Dell, vende HP, compra Google, … Uma certa ação pode acontecer mais de uma vez nessa
sequência. Dada uma outra sequência, decida o mais rápido possível, se ela é uma subsequência da
primeira. O seguinte algoritmo é eficiente para as sequências de tamanho m e n.
algoritmo Subsequencia
4
ANÁLISE DE ALGORITMOS
Bacharelado em Ciência da Computação
retorne falso
i←1
para j ← 1, ..., n
faça se s'i = sj
então
i←i+1
retorne falso
A complexidade do algoritmo é O(n). Sendo assim, é correto afirmar que o algoritmo se baseia em
programação dinâmica? Justifique.
Não, pois se trata do método guloso. Não há, sequer o uso de uma estrutura de dados
adicional que justifique qualquer ideia semelhança com a programação dinâmica.
1. Lista de variáveis: x, y e z.
2. Escolhemos x = True.
3. Avaliamos as cláusulas que contêm x:
(x𝗏y𝗏z) é satisfeita para qualquer valor de y e z.
(x𝗏¬y) é satisfeita para y = False.
(z𝗏¬x) é satisfeita para z = True.
Como a cláusula (y𝗏¬z) não é satisfeita para nenhum valor de y e z que respeite
as cláusulas anteriores, voltamos para o passo 2 e escolhemos x = False.
4. Escolhemos y = True.
5. Avaliamos as cláusulas que contêm x e y:
(x𝗏y𝗏z) é satisfeita para qualquer valor de x, y e z.
(y𝗏¬z) é satisfeita para z = False.
(¬x𝗏¬y𝗏¬z) é satisfeita para x = False e z = False.
6. Escolhemos z = True.
7. Avaliamos as cláusulas que contêm x, y e z:
Todas as cláusulas são satisfeitas.
8. Portanto, encontramos uma atribuição de valores para as variáveis que satisfaz a
fórmula: x = False, y = True e z = True.
Note que a técnica de Backtracking nos permite encontrar uma solução para o problema SAT
da fórmula de forma sistemática, testando todas as possibilidades de atribuição de valores às
variáveis. No entanto, para fórmulas mais complexas, o tempo de execução pode ser muito
grande e outras técnicas, como a Programação Dinâmica, podem ser mais eficientes.
6
ANÁLISE DE ALGORITMOS
Bacharelado em Ciência da Computação
variável anterior. Note que a árvore de decisão tem profundidade 3, pois temos 3 variáveis
na fórmula.
9. É dada uma peça retangular de tecido com dimensões X x Y, onde X e Y são inteiros positivos, e
uma lista de n produtos que podem ser feitos usando o tecido. Para cada produto i [1, n] você
sabe que um retângulo de tecido de dimensões a i x bi é necessário, e que o preço final de venda do
produto é ci. Considere que ai, bi e ci são todos inteiros positivos. Você tem uma máquina que pode
cortar qualquer peça retangular de pano em duas peças, horizontal ou verticalmente. É possível
aplicar programação dinâmica para o projeto de um algoritmo que determine o melhor retorno
possível sobre a peça de tecido de X x Y, ou seja, uma estratégia para cortar o tecido de forma que
os produtos feitos das peças resultantes deem a soma máxima de preços de venda? Justifique.