Complexidade de Algoritmos - ?· Programação Dinâmica (Dynamic Programming) Uma abordagem auxiliar…

Embed Size (px)

Text of Complexidade de Algoritmos - ?· Programação Dinâmica (Dynamic Programming) Uma abordagem...

Complexidade de Algoritmos

Prof. Diego Buchinger

diego.buchinger@outlook.com

diego.buchinger@udesc.br

Prof. Cristiano Damiani Vasconcellos

cristiano.vasconcellos@udesc.br

Abordagens para Resoluo

de Problemas

Programao Dinmica(Dynamic Programming)

Uma abordagem auxiliar para reduzir a computao em

problemas de otimizao.

Consiste em dividir o problema original em subproblemas mais

simples, resolv-los, armazenar os resultados em memria e

consultar estes resultados posteriormente a fim de reduzir o

espao de busca.

Resultados so calculados apenas uma vez (nunca so

recalculados por outra iterao)

Programao Dinmica(Dynamic Programming)

Alguns problemas que podem ser resolvidos com programao

dinmica:

Fibonacci

Problema do Menor Troco no cannico

Problema da Mochila Binria (0/1)

Maior Subsequncia Comum

Multiplicao de Cadeias de Matrizes

Sokoban

Fibonacci

O modelo recursivo de Fibonacci pode ser extremamente ruim

dependendo da implementao:

Fibonacci

Para entender a programao dinmica, talvez o problema da

sequencia de Fibonacci seja o exemplo mais simples para

demonstrar o seu uso.

A ideia utilizar uma estrutura auxiliar para armazenar os

resultados e utiliz-los posteriormente

Fibonacci

Abordagem top-down (Memoization)

Fib(n)

se n 1 ento

retorne n

seno

se F[n] est indefinido

F[n] Fib(n 1) + Fib(n 2)

retorne F[n]

O vetor F inicializado

antes da chamada da

funo com um valor

padronizado que nunca

ser registrado [ex: -1]

FibonacciAbordagem bottom-up

Fib(n)

F[0] = 0

F[1] = 1

para i 2 at n

F[i] = F[i 2] + F[i 1]

retorne F[n]

Problema do Melhor Troco

no cannico

Como visto anteriormente, para sistemas monetrios no cannicos

a abordagem gulosa pode no resultar no melhor resultado!

Nesse caso, podemos usar programao dinmica como um mtodo

eficiente para encontrar o melhor troco:

Exemplo Trivial: Moedas disponveis: 1, 3, 4

Valor do troco: $ 0.06

Qual o nmero mnimo de moedas para o troco?

Problema do Melhor Troco

no cannico

Exemplo Trivial: Moedas disponveis: 1, 3, 4

Valor do troco: $ 0.06

Considere as moedas como um vetor: M = { 1, 3, 4 }

Inicialmente assumimos que o troco para $ 0.00 precisa de zero moedas

T(0) = 0

E seguimos iterativamente at o troco desejado usando a frmula:

T(n) = min( 1+T( n-M[0] ) , 1+T( n-M[1] ) , 1+T( n-M[2] ) )

Problema do Melhor Troco

no cannico

Exemplo Trivial: Moedas disponveis: 1, 3, 4

Valor do troco: $ 0.06

T(0) = 0

T(n) = min( 1+T( n-M[0] ) , 1+T( n-M[1] ) , 1+T( n-M[2] ) )

T(1) = min( 1+T(1-1) , 1+T(1-3) , 1+T(1-4) ) = 1

T(2) = min( 1+T(2-1) , 1+T(2-3) , 1+T(2-4) ) = 2

T(3) = min( 1+T(3-1) , 1+T(3-3) , 1+T(3-4) ) = 1

(...)

Complexidade de tempo => ( n * |M| )

Complexidade de espao => ( n )

Problema da Mochila Binria (0/1)

Dark Version: Um ladro est assaltando uma loja e possui uma

mochila que pode carregar at P kg sem arrebentar. Sabendo os

pesos e valores dos itens, qual o maior valor possvel que o

ladro conseguir roubar?

Na verso da mochila binria os elementos s podem ser pegos

como um todo (no podemos pegar metade de um item ou

pega, ou no pega).

Exemplo: Mochila com capacidade 9 kg

Objetos 1 2 3 4 5 6

Peso 1 3 2 5 7 9

Valor 3 2 4 7 9 12

Problema da Mochila Binria (0/1)

Soluo Matricial

Montamos uma matriz para armazenar as melhores solues

intermedirias e as usamos para gerar as prximas solues;

Objetos 1 2 3 4 5 6

Peso 1 3 2 5 7 9

Valor 3 2 4 7 9 12

Problema da Mochila Binria (0/1)

Soluo Matricial

Objetos 1 2 3 4 5 6

Peso 1 3 2 5 7 9

Valor 3 2 4 7 9 12

Item /

Capacidade0 1 2 3 4 5 6 7 8 9

1 0 3 3 3 3 3 3 3 3 3

2 0 3 3 3 5 5 5 5 5 5

3 0 3 4 7 7 7 9 9 9 9

4 0 3 4 7 7 7 10 11 14 14

5 0 3 4 7 7 7 10 11 14 14

6 0 3 4 7 7 7 10 11 14 14

m[item][k] = max( m[item-1][k], valor + m[item-1][k-peso] )

Problema da Mochila Binria (0/1)

Soluo Matricial

Complexidade de tempo => ( peso * qtd-itens )

Complexidade de espao => ( peso * qtd-itens )

Maior Subsequncia ComumLongest Common Subsequence

Dadas duas strings S e T, qual maior subsequencia (sequencia

no necessariamente contgua), da esquerda para a direita, entre

estas strings?

Exemplo: S = ABAZDC

T = BACBAD

Resposta ?

Resoluo similar a abordagem matricial para

resolver o problema da mochila.

Soluo Matricial

pA / pB A B A Z D C

0 0 0 0 0 0 0

B 0

A 0

C 0

B 0

A 0

D 0

1 Preenche linha

e coluna fictcia

2 usar regra:

m[i][j] = max( m[i-1][j],

m[i][j-1] )

SE pA[i] == pB[j]:

m[i][j] = max( m[i][j],

m[i-1][j-1] + 1 )

Maior Subsequncia ComumLongest Common Subsequence

Soluo Matricial

pA / pB A B A Z D C

0 0 0 0 0 0 0

B 0 0 1 1 1 1 1

A 0 1 1 2 2 2 2

C 0 1 1 2 2 2 3

B 0 1 2 2 2 2 3

A 0 1 2 3 3 3 3

D 0 1 2 3 3 4 4

Maior Subsequncia ComumLongest Common Subsequence

Multiplicao de Cadeias de MatrizesMatrix Chain Multiplication

Dadas uma sequencia de n matrizes, qual a melhor ordem para

multiplic-las a fim de realizar menos multiplicaes.

OBS: a multiplicao entre matrizes associativa, logo

(AB)(CD) = A(B(CD)) = (AB)C)D = (A(BC))D = A((BC)D)

Exemplo: So dadas 4 matrizes com os seguintes tamanhos:

M1 = (2,3) M1 * M2 = 2 * 3 * 6 = 36

M2 = (3,6) M2 * M3 = 3 * 6 * 4 = 72

M3 = (6,4) M3 * M4 = 6 * 4 * 5 = 120

M4 = (4,5)

Multiplicao de Cadeias de MatrizesMatrix Chain Multiplication

Exemplo: So dadas 4 matrizes com os seguintes tamanhos:

M1 = (2,3) M1 * M2 = 2 * 3 * 6 = 36

M2 = (3,6) M2 * M3 = 3 * 6 * 4 = 72

M3 = (6,4) M3 * M4 = 6 * 4 * 5 = 120

M4 = (4,5)

MATRIZ 1 2 3 4

1 0 36

2 0 72

3 0 120

4 0

MATRIZ 1 2 3 4

1 0 1

2 0 2

3 0 3

4 0

Multiplicao de Cadeias de MatrizesMatrix Chain Multiplication

Exemplo: So dadas 4 matrizes com os seguintes tamanhos:

M1 = (2,3) (M1 * M2) M3 = 36 + 2 * 6 * 4 = 84

M2 = (3,6) M1 (M2 * M3) = 2 * 3 * 4 + 72 = 96

M3 = (6,4) (M2 * M3) M4 = 72 + 3 * 4 * 5 = 132

M4 = (4,5) M2 (M3 * M4) = 3 * 6 * 5 + 120 = 210

MATRIZ 1 2 3 4

1 0 36 84

2 0 72 132

3 0 120

4 0

MATRIZ 1 2 3 4

1 0 1 2

2 0 2 3

3 0 3

4 0

Exemplo: So dadas 4 matrizes com os seguintes tamanhos:

M1 = (2,3) (M1 M2 M3) M4 = 84 + 2 * 4 * 5 = 124

M2 = (3,6) (M1M2)*(M3M4) = 36+2*6*5+120 = 216

M3 = (6,4) M1 (M2 M3 M4) = 2 * 3 * 5 + 132 = 162

M4 = (4,5)

Multiplicao de Cadeias de MatrizesMatrix Chain Multiplication

MATRIZ 1 2 3 4

1 0 36 84 124

2 0 72 132

3 0 120

4 0

MATRIZ 1 2 3 4

1 0 1 2 3

2 0 2 3

3 0 3

4 0

Multiplicao de Cadeias de MatrizesMatrix Chain Multiplication

PSEUDOCDIGO

MATRIX-CHAIN-MULT( v[n] )

para i de 1 a n: // zera a primeira linha

m[ i , i ] = 0

para c de 2 a n: // para todas as linhas posteriores

para i de 1 a (n - c + 1): // para todos os elem. da diagonal

j = i + c - 1

m[ i , j ] =

para k de i a (j - 1): // para todas as permutaes

q = m[ i , k ] + m[ k+1 , j ] + v[ i-1 ] * v[ k ] * v[ j ]

se q < m[ i , j ]:

m[ i , j ] = q

s[ i, j] = k

Multiplicao de Cadeias de MatrizesMatrix Chain Multiplication

PSEUDOCDIGO

PRINT-EQUACAO ( s[n][n] , i , j )

se i == j

print M + i

seno

print (

PRINT-EQUACAO( s , i , s[ i , j ] )

PRINT-EQUACAO( s , s[ i , j ] + 1 , j )

print )

MATRIZ 1 2 3 4

1 0 1 2 3

2 0 2 3

3 0 3

4 0

P-E (1,4)

P-E(1,3)

P-E(1,2)

P-E(1,1) => M1

P-E(2,2) => M2

P-E(3,3) => M3

P-E(4,4) => M4

( M1 M2 ) M3 ) M4 )

Sokoban

Abordagem usando programao dinmica

Posio do jogador (x,y) | Posio das caixas (x,y)

(1,2) | (2,2) => [1][2][2][2] = 0 (movimentos)

Algoritmos de Aproximao(Approximation Algorithms)

Existem alguns problemas os quais no se conhece uma soluo

eficiente. Dizemos que estes problemas so difceis ou

intratveis pois, para instncias grandes, o tempo de

processamento seria invivel.

Nestas situaes comum remover a exigncia de procurar pela

soluo tima e passamos a procurar por uma soluo prxima da

tima (soluo boa / razovel)

Algoritmos de Aproximao(Approximation Algorithms)

Existem duas abordagens principais:

Heurstica/Metaheursticas: algoritmo que buscam solues

prximas a soluo tima. Utilizam alguma informao (ou

intuio) sobre a instncia do problema para resolv-lo de

forma eficiente. Podem ser