Você está na página 1de 4

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO

MESTRADO EM INFORMÁTICA APLICADA


PROJETO E ANÁLISE DE ALGORITMO

Anderson Melo de Morais

Lista de Exercícios II

1 - Considera uma modificação no problema do “Corte da Haste”, no qual em adição


ao preço pi de cada haste de tamanho i, cada corte executado incorre em um custo fixo c. A
receita associada com a solução do problema é agora a soma dos preços dos pedaços menos os
custos para realizar os respectivos cortes. Escreva um algoritmo de programação dinâmica
para resolver este novo problema do corte da haste. Qual o custo em tempo deste novo
algoritmo?

Para isso teremos que subtrair o custo c do corte do lucro ri de cada corte, assim teremos:
rn = max {pn, r1 + rn – 1 – c, r2 + rn – 2 – c, . . . , rn − 1 + r1 – c}
E assim iremos reescrever o algoritmo MEMOIZED-CUT-ROD da seguinte maneira:
CUT-ROD(p, n, r)
1 seja r[0...n] um novo arranjo
2 for i = 0 to n
3 r[i] = - ∞
4 if r[n] ≥ 0
5 return r[n]
6 if n == 0
7 q=0
8 else q = - ∞
9 for i = 1 to n - 1
10 q = max(q - c, p[i] + CUT-ROD(p, n - i, r))
11 r[n] = q
12 return q

Alteramos o for na linha 9 para i de 1 até n - 1 em vez de n. Além disso, no o loop for, na linha 10,
definimos q = max{q - c, p[i]}.

2 - Escreva um algoritmo recursivo MATRIX-CHAIN-MULTIPLY(A, s, i, j) que


desempenhe a multiplicação ´ótima, dando-se a sequência de matrizes (A1, A2,..., An), a tabela
s computada por MATRIX-CHAINORDER e os ´índices i e j. (A chamada inicial poderia ser
MATRIXCHAIN-MULTIPLY(A,s,1,n)).
MATRIX-CHAIN-MULTIPLY(A,s,1,n))
1 if i == j
2 return Ai
3 else
4 return MATRIX-CHAIN-MULTIPLY(A, s, 1, s[i,j]) x MATRIX-CHAIN-MULTIPLY(A, s,
s[i,j]+1, j))

3. Seja R(i, j) o número de vezes que uma entrada na tabela m[i, j] é referenciada
enquanto realiza-se a computação de outras entradas da tabela m na chamada do
procedimento MATRIX-CHAIN-ORDER. Mostre que o n´úmero total de referências para a
tabela m completa é

Onde n é a quantidade de matrizes na sequência. (Sugestão: Examine


o apêndice A do livro do texto - Equação A.3)

Abaixo mostramos um exemplo de pseudocódigo do algoritmo matrix-chain-ordem, que utilizamos


para a análise da questão:

E os referidos somatórios que são encontrados no Apêndice do livro, que foram utilizados para os
cálculos:

Contamos o número de vezes que referenciamos uma entrada diferente em m, que estamos
computando, ou seja, 2 vezes o número de vezes que a linha 10 corre.
Para i temos i = n-l+1
Para j temos j=i+l-1 -> j-i=l-1
∑∑ R(i,j) = ∑ 2(𝑛 − 𝑙 + 1)(𝑙 − 1)
= 2∑ (𝑛 − 𝑙 + 1)(𝑙 − 1) =
= 2∑ (𝑛 − 1 − 𝑙 − 1) (𝑙 + 1 − 1) = 2∑ (𝑛 − 𝑙)𝑙 =
= 2∑(𝑛𝑙 − 𝑙 2 ) = 2∑ 𝑛𝑙 - 2∑ 𝑙 2
2𝑛(𝑛−1)𝑛 2(𝑛−1)𝑛(2𝑛−1)
= −
2 6

2𝑛3 −3𝑛2 +𝑛
= 𝑛3 − 𝑛2 − 3

𝑛3 −𝑛
= 3𝑛3 − 3𝑛2 − 2𝑛3 − 3𝑛2 + 𝑛 = 3

4. Esboce a arvore de recursividade para o algoritmo Merge-Sort (Seção 2.3.1 do livro


texto) para um arranjo numérico com 16 elementos. Explique por que a memoização falha no
processo de aceleração de um bom algoritmo de dividir para conquistar como ´e o Merge-
Sort.

Dado um vetor A[i..n], o MergeSort irá realizar a ordenação dos elementos de i a n da matriz
original. A árvore de recursão terá [1..n] como sua raiz, e em qualquer nó i terá [i .. (j - i) / 2] e [(j -
i) / 2 + 1..j] como seus filhos esquerdo e direito, respectivamente. Se j - i = 1, não haverá filhos. A
abordagem de memória não consegue acelerar o Merge Sort porque os subproblemas não se
sobrepõem. Classificar uma lista de tamanho não é o mesmo que ordenar outra lista de tamanho n,
portanto, não há economia no armazenamento de soluções para subproblemas, pois cada solução é
usada no máximo uma vez.
5 4 7 1 2 9 15 3 6 8 11 16 12 13 10 14

5 4 7 1 2 9 15 3 6 8 11 16 12 13 10 14

5 4 7 1 2 9 15 3 6 8 11 16 12 13 10 14

5 4 7 1 2 9 15 3 6 8 11 16 12 13 10 14

11
5 4 7 1 2 9 15 3 6 8 16 12 13 10 14

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
5. Considere uma variação do problema da Multiplicação da Sequência de Matrizes,
no qual é desejado definir a ordem de multiplicação entre as matrizes tal que o número de
multiplicações escalares seja maximizado, ao invés de minimizado. Este problema exibe uma
substrutura ótima? Comente sua resposta.

Se realizarmos a modificação do problema de multiplicação de matrizes, este ainda irá apresentar


as propriedades de uma subestrutura ótima. Para isso bastaríamos dividirmos uma sequência de
matrizes (A1,...,An) e procurarmos a multiplicação máxima da sequência, estes subproblemas
gerados também apresentarão as características da subestrutura ótima. Então, entre Ak e Ak + 1,
devemos ter uma multiplicação de custo máximo em ambos os lados, caso contrário poderíamos
substituir por um outro arranjo de matrizes que possua uma multiplicação mais custosa de
(A1,....,An.)

Você também pode gostar