Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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]
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:=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 ?
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