Você está na página 1de 22

Solved Exercises

1. Finding the Peak. Let A= a1,,an be a sequence of n numbers with the following property: there is p in {1,,n} for which (i) the subsequence a1,..,ap is increasing and (ii) the subsequence ap,,an is decreasing. Find p in O( log n) time. Exemplo A=13568 6432 p=5

Solved Exercises
2. Subcadeia de Soma Mxima

Entrada
a = (a1, a2, , aN) um vetor de inteiros

Sada: i e j tais que


S[i , j ]= ai + ai+1 + + aj mximo. quando todos os valores de a so negativos, ento a subsequencia vazia escolhida e o valor mximo da soma considerado 0. Exemplo: a = (-2, 11, -4, 13, -5, -2) Soluo i=2 e j=4 s[2,4]= 11 - 4 + 13 = 20

Soluo fora bruta

Existem O(n2) intervalos Para calcular s[i, j ] gasta-se O(j-i)=O(n)

Complexidade de tempo O(n3)

Soluo fora bruta

Smax

Para i:=1 at n faa Para j:=i ate n faa S A[i] Para k:=i+1 at j faa S S+A[k]

if S > Smax then Smax S

Preprocessamento ...

Calculando s[1,i], para 1 i n, podemos calcular as demais somas em O(1): S[ i , j ]= s[ 1, j ] s[ 1 , i-1 ] O(n2) intervalos => Complexidade de tempo O(n2)

Preprocessamento ...

Para i:=0 at n Prefix[i] 0 Para i:=1 at n Prefix[i+1] Prefix[i] + A[i] Smax 0

Para i:=1 at n faa Para j:=i ate n faa if Prefix[j] Prefix[i-1] > Smax then Smax Prefix[j] Prefix[i-1]

...dividir-e-conquistar
Quebrar em dois subvetores menores

resposta a esquerda

resposta no centro

resposta a direita

a1

a2

a1

a2

...dividir-e-conquistar
Quebrar em dois subvetores menores

resposta no centro

a1

a2

T(esq): subsequencia de soma mxima que comea em algum i* menor ou igual a n/2 e termina em n/2 T(dir): subsequencia de soma mxima que comea em n/2 e termina em algum j* maior ou igual a n/2 Melhor resposta no centro igual a s[ i*, j* ]

dividir-e-conquistar
SubseqMaxima (i,j) Se i=j and A[i]>0 then return A[i] Se i=j and A[i]<0 then return 0 Seno Sleft SubseqMaxima (i,(i+j) div 2 ) Sright SubseqMaxima ((i+j) div 2 + 1, j ) Lmax 0; aux 0 Para k:= (i+j) div 2 downto i aux aux + A[k] Se aux > Lmax then Lmax aux Rmax 0; aux 0 Para k:= (i+j) div 2 +1 to j aux < - aux + A[k] Se aux > Rmax then Rmax aux Scenter Lmax+ Rmax Return max(Sleft , Scenter , Sright )

dividir-e-conquistar

T(n) = esforo para resolver instancia de tamanho n T(n) = n + 2.T(n/2) T(1) = O(1) T(n) = O(n.lg(n)) + O(n) = O(n.lg(n)) Complexidade de tempo O(n log n)

possvel melhorar ?

Programao Dinmica Tempo Linear

Exerccio 1
Ao comparar a mediana a(n/2) da primeira lista com a mediana b(n/2) da segunda lista temos Caso i) a(n/2) >= b(n/2). Neste caso, os elementos a(n/2+1),,a(n) so maiores ou iguais que n elementos e os elementos b(1),,b(n/2) so menores ou iguais do que n elementos. Portanto, o elemento desejado o (n/2)-simo elemento do conjunto b(n/2+1),,b(b), a(1),,a(n/2). Este pode ser encontrado recursivamente Caso ii) a(n/2) < b(n/2). Anlogo ao caso i Complexidade de Tempo T(2n) = 1 + T(n) T(1) =1 Resolvendo a recorrncia temos T(2n)= log (2n) = O(log n)

Exerccio 2

Devemos aplicar a mesma estratgia do algoritmo para contar inverses com a seguinte modificao na hora de combinar

multiplique todos os elementos da lista direita por 2 e faa um merge entre as duas listas para contar o nmero de inverses Faa o merge com as listas originais (sem multiplicar por 2) para obter uma lista ordenada

Exerccio 3

Escreva uma funo Carto(S) que dados o conjunto S de cartes : Retorna um dos cartes que aparece mais do que |S|/2 vezes caso este exista Null caso contrrio

Exerccio 3
Carto (S) Se |S|=1 Return o nico carto de S Seno Particione S em dois subconjuntos S1 e S2 de mesmo tamanho a Carto(S1) ; b Carto(S2) Se a = Null e b = Null Return Null Se a <> Null Compare a com todos os cartes de S Se a aparece mais do que |S|/2 vezes Return a Se b <> Null Compare b com todos os cartes de S Se b aparece mais do que |S|/2 vezes Return b Return Null

Exerccio 3
Teorema. Carto(S) devolve Null se nenhum carto de S aparece mais do que |S|/2 vezes e o carto que aparece mais do |S|/2 vezes Induo em |S| Base |S|=1. Ok! Hiptese. Propriedade vale quando |S| < = k. Passo |S|=k+1. Reciocnio. Caso 1.) Existe um carto em S, digamos c, que aparece mais do que (k+1)/2 vezes. Logo, este carto aparecer mais do que |S1|/2 vezes em S1 ou mais de |S2|/2 vezes em S2. Como Carto(S1) e Carto(S2) esto corretos ento um destes retornar c. Logo, Carto(S) retornar c. Caso 2) No existe carto em S que aparece mais do que (k+1)/2 vezes. O procedimento retorna Null.

Exerccio 3

Complexidade de Tempo T(n) = 2n + 2T(n/2) T(1)=1 T(n) = O(n log n) ( comparar cartes mais duas chamadas recursivas)

Exerccio 4

Exerccio 5
Escreva um Rotina HSR que recebe como entrada n retas e retorna uma partio do intervalo (-\infty,+\infty) aonde a cada intervalo associado a reta visvel naquele intervalo. Note que cada reta esta associada a no mximo um intervalo Diviso. Divida as retas em dois conjuntos de n/2 retas e resolva recursivamente cada um dos subproblemas. Conquista. Faa um merge dos intervalos obtidas Complexidade de Tempo T(n)=n + 2T(n/2) ( merge + duas chamadas recursivas) T(1)=1 T(n) =O(log n)

Exerccio 6
LocalMinimo existe ? bvio. O menor elemento da rvore um local mnimo

Exerccio 6

LocalMinimo(r) Se r um folha Return r Se r< r.esq e r<r.dir Return r Se r.esq<r Return LocalMinimo(r.esq) Se r.dir<r Return LocalMinimo(r.dir) Complexidade de Tempo

(i) (ii)

(iii) (iv)

T(n) <= c + T(n/2) se n>1 ( comparaes + chamada recursiva) T(n) =1 se n=1 ( caso base) T(n) = O(log n)

Exerccio 6
Teorema. LocalMinimo (r) retorna um mnimo local da rvore enrazada em r Prova Induo no tamanho da rvore. Base. r uma folha (i). Ok. Hiptese. Vale para rvores com 2d -1 ns Passo. Provar para rvore T com 2d+1 -1 ns Caso 1) A raz um mnimo local de T. O algoritmo devolve r (ii) Caso 2) A raz no um mnimo local de T Subcaso 2.1) r.esq < r. Ento um mnimo local da rvore enrazada em r.esq um mnimo local de T. Como neste caso LocalMinimo(r.esq) chamado, segue da hip de induo que o algoritmo devolve a resposta correta Subcaso 2.2) r.esq > r. Ento r.dir < r eum mnimo local da rvore enrazada em r.dir um mnimo local de T. Como neste caso LocalMinimo(r.dir) chamado, segue da hip de induo que o algoritmo devolve a resposta correta