27
Solved Exercises 1. Finding the Peak. Let A= a 1 ,…,a n be a sequence of n numbers with the following property: there is p in {1,…,n} for which (i) the subsequence a 1 ,..,a p is increasing and (ii) the subsequence a p ,…,a n is decreasing. Find p in O( log n) time. Exemplo A = 1 3 5 6 8 6 4 3 2 p = 5

Exericicio-DivisãoConquista

Embed Size (px)

DESCRIPTION

analise e projeto

Citation preview

  • Solved Exercises1. 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.

    ExemploA = 1 3 5 6 8 6 4 3 2 p = 5

  • Solved Exercises2. Subcadeia de Soma MximaEntradaa = (a1, a2, , aN) um vetor de inteirosSada: i e j tais queS[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)Soluoi=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 faaPara j:=i ate n faaSA[i]Para k:=i+1 at j faaS 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 faaPara j:=i ate n faaif Prefix[j] Prefix[i-1] > Smax then Smax Prefix[j] Prefix[i-1]

  • ...dividir-e-conquistarQuebrar em dois subvetores menores

  • ...dividir-e-conquistarQuebrar em dois subvetores menoresT(esq): subsequencia de soma mxima que comea em algum i* menor ou igual a n/2 e termina em n/2T(dir): subsequencia de soma mxima que comea em n/2+1 e termina em algum j* maior ou igual a n/2+1Melhor 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] Lmax then Lmax auxRmax 0; aux 0Para k:= (i+j) div 2 +1 to j aux < - aux + A[k]Se aux > Rmax then Rmax auxScenter Lmax+ RmaxReturn max(Sleft , Scenter , Sright )

  • dividir-e-conquistarT(n) = esforo para resolver instncia de tamanho nT(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 1Ao 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 TempoT(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 existaNull caso contrrio

  • Exerccio 3Carto (S)Se |S|=1 Return o nico carto de SSenoParticione S em dois subconjuntos S1 e S2 de tamanho mais parecido possvela Carto(S1) ; bCarto(S2)Se a = Null e b = Null Return NullSe a Null (*)Compare a com todos os cartes de SSe a aparece mais do que |S|/2 vezes Return a Se b Null(**)Compare b com todos os cartes de SSe 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) ( comparar cartes mais duas chamadas recursivas)

    T(1)=1

    T(n) = O(n log n)

  • Exerccio 4

  • Exerccio 5Escreva 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 5Conquista. 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 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(i)Return rSe r< r.esq e r
  • Exerccio 6Teorema. LocalMinimo (r) retorna um mnimo local da rvore enrazada em r

    ProvaInduo no tamanho da rvore.Base. r uma folha (i). Ok.Hiptese. Vale para rvores com 2d -1 nsPasso. 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 corretaSubcaso 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 Cormen1. 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 Cormen1. Encontre a mediana m em tempo linear2. Para cada elemento x de S faaS 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 sala4. 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