Você está na página 1de 33

Nmero de inverses

Voc sabe fazer um algoritmo mais rpido para o problema do nmero de inverses?

Algoritmos p.

Nmero de inverses
Voc sabe fazer um algoritmo mais rpido para o problema do nmero de inverses? Note que o nmero de inverses pode ser (n2 ). Portanto, para isso, no podemos contar de uma em uma as inverses, como faz o algoritmo visto hoje. Temos que ser mais espertos...

Algoritmos p.

Nmero de inverses
Voc sabe fazer um algoritmo mais rpido para o problema do nmero de inverses? Note que o nmero de inverses pode ser (n2 ). Portanto, para isso, no podemos contar de uma em uma as inverses, como faz o algoritmo visto hoje. Temos que ser mais espertos... Idia: Vamos ordenar e contar ao mesmo tempo! A ordenao vai ajudar a contar vrias inverses de uma s vez.

Algoritmos p.

Nmero de inverses
Voc sabe fazer um algoritmo mais rpido para o problema do nmero de inverses? Note que o nmero de inverses pode ser (n2 ). Portanto, para isso, no podemos contar de uma em uma as inverses, como faz o algoritmo visto hoje. Temos que ser mais espertos... Idia: Vamos ordenar e contar ao mesmo tempo! A ordenao vai ajudar a contar vrias inverses de uma s vez. Mtodo: Diviso e conquista.

Algoritmos p.

Nmero de inverses
Voc sabe fazer um algoritmo mais rpido para o problema do nmero de inverses? Note que o nmero de inverses pode ser (n2 ). Portanto, para isso, no podemos contar de uma em uma as inverses, como faz o algoritmo visto hoje. Temos que ser mais espertos... Idia: Vamos ordenar e contar ao mesmo tempo! A ordenao vai ajudar a contar vrias inverses de uma s vez. Mtodo: Diviso e conquista. Resultado: Um algoritmo O(n lg n) para o problema do nmero de inverses de uma permutao.
Algoritmos p.

Nmero de inverses
Problema: Dada uma permutao p[1 . . n], determinar o nmero de inverses em p. Uma inverso um par (i, j) de ndices de p tal que i < j e p[i] > p[j].

Algoritmos p.

Nmero de inverses
Problema: Dada uma permutao p[1 . . n], determinar o nmero de inverses em p. Uma inverso um par (i, j) de ndices de p tal que i < j e p[i] > p[j]. Que algoritmo de ordenao usaremos? Queremos um algoritmo O(n lg n), ento temos duas opes: o MERGE-SORT e o HEAPSORT. Qual deles parece mais adequado para nos ajudar a contar inverses?

Algoritmos p.

Nmero de inverses
Problema: Dada uma permutao p[1 . . n], determinar o nmero de inverses em p. Uma inverso um par (i, j) de ndices de p tal que i < j e p[i] > p[j]. Que algoritmo de ordenao usaremos? Queremos um algoritmo O(n lg n), ento temos duas opes: o MERGE-SORT e o HEAPSORT. Qual deles parece mais adequado para nos ajudar a contar inverses? Resposta: o MERGE-SORT.

Algoritmos p.

Merge-Sort
Rearranja A[p . . r], com p r, em ordem crescente.

MERGE-SORT (A, p, r) 1 se p < r 2 ento q (p + r)/2 3 MERGE-SORT (A, p, q) 4 MERGE-SORT (A, q + 1, r) INTERCALA (A, p, q, r) 5

Algoritmos p.

Intercalao
Problema: Dados A[p . . q] e A[q+1 . . r] crescentes, rearranjar A[p . . r] de modo que ele fique em ordem crescente. Para que valores de q o problema faz sentido? Entra:
p A q r 22 33 55 77 99 11 44 66 88

Algoritmos p.

Intercalao
Problema: Dados A[p . . q] e A[q+1 . . r] crescentes, rearranjar A[p . . r] de modo que ele fique em ordem crescente. Para que valores de q o problema faz sentido? Entra:
p A q r 22 33 55 77 99 11 44 66 88

Sai:
A

11 22 33 44 55 66 77 88 99

Algoritmos p.

Intercalao
INTERCALA (A, p, q, r) 0 B[p . . r] um vetor auxiliar 1 para i p at q faa 2 B[i] A[i] 3 para j q + 1 at r faa 4 B[r + q + 1 j] A[j] 5 ip 6 jr 7 para k p at r faa 8 se B[i] B[j] 9 ento A[k] B[i] 10 ii+1 11 seno A[k] B[j] j j1 12
Algoritmos p.

Adaptao do Merge-Sort
Conta o nmero de inverses de A[p . . r], com p r, e rearranja A[p . . r] em ordem crescente. CONTA-E-ORDENA (A, p, r) 1 se p r 2 ento devolva 0 3 seno q (p + r)/2 c CONTA-E-ORDENA (A, p, q)+ 3 4 CONTA-E-ORDENA (A, q + 1, r)+ 5 CONTA-E-INTERCALA (A, p, q, r) 6 devolva c

Algoritmos p.

Contagem na intercalao
CONTA-E-INTERCALA (A, p, q, r) 1 para i p at q faa 2 B[i] A[i] 3 para j q + 1 at r faa 4 B[r + q + 1 j] A[j] 5 ip 6 jr 7 c0 8 para k p at r faa 9 se B[i] B[j] 10 ento A[k] B[i] ii+1 11 12 seno A[k] B[j] j j1 13 c c + (q i + 1) 14 15 devolva c

inicializa o contador

conta inverses

Algoritmos p.

Simulao
p A q r 22 33 55 77 99 11 44 66 88

c=0

Algoritmos p.

Simulao
k A i B j

22 33 55 77 99 88 66 44 11

c=0

Algoritmos p.

Simulao
k A 11 i B j

22 33 55 77 99 88 66 44 11

c=0+5=5

Algoritmos p. 1

Simulao
k A 11 22 i B j

22 33 55 77 99 88 66 44 11

c=5

Algoritmos p. 1

Simulao
k A 11 22 33 i B j

22 33 55 77 99 88 66 44 11

c=5

Algoritmos p. 1

Simulao
k A 11 22 33 44 i B j

22 33 55 77 99 88 66 44 11

c=5+3=8

Algoritmos p. 1

Simulao
k A 11 22 33 44 55 i B j

22 33 55 77 99 88 66 44 11

c=8

Algoritmos p. 1

Simulao
k A 11 22 33 44 55 66 i B j

22 33 55 77 99 88 66 44 11

c = 8 + 2 = 10

Algoritmos p. 1

Simulao
k A 11 22 33 44 55 66 77 i B j

22 33 55 77 99 88 66 44 11

c = 10

Algoritmos p. 1

Simulao
k A 11 22 33 44 55 66 77 88 i=j B 22 33 55 77 99 88 66 44 11

c = 10 + 1 = 11

Algoritmos p. 1

Simulao
A 11 22 33 44 55 66 77 88 99 j B i

22 33 55 77 99 88 66 44 11

c = 11

Algoritmos p. 1

Consumo de tempo em O
Quanto tempo consome em funo de n := r p + 1? linha 1 2 3 4 57 8 9 1014 15 total consumo de todas as execues da linha ? ? ? ? ? ? ? ? ? ?

Algoritmos p. 1

Consumo de tempo
Quanto tempo consome em funo de n := r p + 1? linha 1 2 3 4 57 8 9 1014 15 total consumo de todas as execues da linha
O(n) O(n) O(n) O(n) O(1) O(n) O(n) O(n) O(1) O(7n + 2) = O(n)

Algoritmos p. 2

Concluso

O algoritmo CONTA-E-INTERCALA consome O(n) unidades de tempo. Tambm escreve-se O algoritmo CONTA-E-INTERCALA consome tempo O(n).

Algoritmos p. 2

Anlise do Conta-E-Ordena
Seja T (n) o tempo consumido pelo CONTA-E-ORDENA.

Algoritmos p. 2

Anlise do Conta-E-Ordena
Seja T (n) o tempo consumido pelo CONTA-E-ORDENA. Vale a seguinte recorrncia para T (n):
T (n) = T (n/2) + T (n/2) + O(n)

Algoritmos p. 2

Anlise do Conta-E-Ordena
Seja T (n) o tempo consumido pelo CONTA-E-ORDENA. Vale a seguinte recorrncia para T (n):
T (n) = T (n/2) + T (n/2) + O(n)

Soluo: T (n) = O(n lg n). Prova?

Algoritmos p. 2

Anlise do Conta-E-Ordena
Seja T (n) o tempo consumido pelo CONTA-E-ORDENA. Vale a seguinte recorrncia para T (n):
T (n) = T (n/2) + T (n/2) + O(n)

Soluo: T (n) = O(n lg n). Prova? Considera-se a recorrncia simplicada


T (n) = 2 T (n/2) + n

denida apenas para n potncia de 2.

Algoritmos p. 2

Anlise do Conta-E-Ordena
Seja T (n) o tempo consumido pelo CONTA-E-ORDENA. Vale a seguinte recorrncia para T (n):
T (n) = T (n/2) + T (n/2) + O(n)

Soluo: T (n) = O(n lg n). Prova? Considera-se a recorrncia simplicada


T (n) = 2 T (n/2) + n

denida apenas para n potncia de 2. Prova-se por induo em n que T (n) = n + n lg n = O(n lg n).

Algoritmos p. 2