Você está na página 1de 27

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 0 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 ...

Prefix[0] 0 Para i:=0 at n-1 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+1 e termina em algum j* maior ou igual a n/2+1 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 instncia de tamanho n T(n) = n + 2.T(n/2) T(1) = O(1) T(n) = O(n.log n) + O(n) = O(n log 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 tamanho mais parecido possvel 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. Se existe carto que aparece mais do |S|/2 vezes, o procedimento devolve tal carto. 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 j que tanto (*) quanto (**) vo retornar 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.

Exerccio 5
Conquista. Seja L_e a lista dos intervalos para as retas do conjunto da esquerda e L_d a lista de intervalos para as retas do conjunto da direita. Seja r_e a reta associada ao primeiro intervalo de (l_e,u_e) de L_e e r_d a reta associada ao primeiro intervalo de (l_d,u_d) de L_d. Assuma sem perda de generalidade que l_e <= l_d. Calculamos o ponto de interseo entre as retas r_e e r_d. Com base neste ponto interseo descobrimos como fica a visibilidade na interseo entre os intervalos (l_e,u_e) e (l_d,u_d). Se u_d > u_e aplicamos o mesmo processamento em L_d e L_e (l_e,u_e)

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 obtidos 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 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)

(i) (ii)

(iii) (iv)

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

10-3-6 Cormen
1. Seja p(i) , para i=1,...,k o ltimo elemento do i-simo quantil 2. Encontre p(k/2) utilizando o algoritmo de seleo linear. Note que p(k/2) o k/2 . (n/k) menor elemento do conjunto de entrada. 3. Faa um pivoteamento colocando os elementos maiores que p(k/2) a direita e os menores a esquerda. 4. Encontre os quantil p(1),...p(k/2-1) utilizando recurso para os elementos menores que p(k/2) e os quantils p(k/2+1),...,p(k) utilizando recurso para os elementos maiores que p(k/2). Complexidade de Tempo; T(k) = n + 2 .T(k/2) T(k) = n log k

10-3-7 Cormen
1. Encontre a mediana m em tempo linear 2. Para cada elemento x de S faa S S U |x m| 3. Seja q o (k+1)-simo menor elemento de S. Encontre q utilizando o algoritmo de seleo em tempo linear mostrado em sala 4. Obtenha os k+1 menores elementos de S pivoteando em relao ao elemento obtido em 3. Devido a transformao no passo 2, no conjunto S os k menores elementos correspondem aos k mais prximos da mediana

10-3-9 Cormen

O local timo deve dividir metade dos poos para cada lado. Caso contrrio seria possvel melhorar diminuir o comprimento total movendo o duto principal de modo a aproximar da maioria dos poos. Basta calcular a mediana considerando as coordenadas y

Você também pode gostar