Sunteți pe pagina 1din 53

Ordenao em tempo linear

CLRS cap 8

Algoritmos p. 1

Ordenao: limite inferior


Problema: Rearranjar um vetor A[1 . . n] de modo que
ele fique em ordem crescente.
Existem algoritmos que consomem tempo O(n lg n).

Algoritmos p. 2

Ordenao: limite inferior


Problema: Rearranjar um vetor A[1 . . n] de modo que
ele fique em ordem crescente.
Existem algoritmos que consomem tempo O(n lg n).
Existe algoritmo assintoticamente melhor?

Algoritmos p. 2

Ordenao: limite inferior


Problema: Rearranjar um vetor A[1 . . n] de modo que
ele fique em ordem crescente.
Existem algoritmos que consomem tempo O(n lg n).
Existe algoritmo assintoticamente melhor?
NO, se o algoritmo baseado em comparaes.
Prova?

Algoritmos p. 2

Ordenao: limite inferior


Problema: Rearranjar um vetor A[1 . . n] de modo que
ele fique em ordem crescente.
Existem algoritmos que consomem tempo O(n lg n).
Existe algoritmo assintoticamente melhor?
NO, se o algoritmo baseado em comparaes.
Prova?
Qualquer algoritmo baseado em comparaes
uma rvore de deciso.

Algoritmos p. 2

Exemplo
ORDENA-POR-INSERO (A[1 . . 3]):
SIM

A[1] A[2]?

A[2] A[3]?
SIM

NO

A[1] A[3]?
SIM

NO

A[1]A[2]A[3] A[1] A[3]?


SIM

A[1]A[3]<A[2]

A[2]<A[1]A[3]

NO

A[3]<A[1]A[2]

NO

A[2] A[3]?
SIM

NO

A[2]A[3]A[1] A[3]<A[2]<A[1]

Algoritmos p. 3

Limite inferior
Considere uma rvore de deciso para A[1 . . n].

Algoritmos p. 4

Limite inferior
Considere uma rvore de deciso para A[1 . . n].
Nmero de comparaes, no pior caso?

Algoritmos p. 4

Limite inferior
Considere uma rvore de deciso para A[1 . . n].
Nmero de comparaes, no pior caso?
Resposta: altura, h, da rvore de deciso.

Algoritmos p. 4

Limite inferior
Considere uma rvore de deciso para A[1 . . n].
Nmero de comparaes, no pior caso?
Resposta: altura, h, da rvore de deciso.
Todas as n! permutaes de 1, . . . , n devem ser folhas.

Algoritmos p. 4

Limite inferior
Considere uma rvore de deciso para A[1 . . n].
Nmero de comparaes, no pior caso?
Resposta: altura, h, da rvore de deciso.
Todas as n! permutaes de 1, . . . , n devem ser folhas.
Toda rvore binria de altura h tem no mximo 2h folhas.

Algoritmos p. 4

Limite inferior
Considere uma rvore de deciso para A[1 . . n].
Nmero de comparaes, no pior caso?
Resposta: altura, h, da rvore de deciso.
Todas as n! permutaes de 1, . . . , n devem ser folhas.
Toda rvore binria de altura h tem no mximo 2h folhas.
Prova: Por induo em h. A afirmao vale para h = 0.
Suponha que a afirmao vale para toda rvore binria de
altura menor que h, para h 1.
O nmero de folhas de uma rvore de altura h a soma do
nmero de folhas de suas sub-rvores, que tm altura
h 1. Logo, o nmero de folhas de uma rvore de altura
h no superior a
2 2h1 = 2h .

Algoritmos p. 4

Limite inferior
Assim, devemos ter 2h n! , donde h lg(n!).
(n!)2 =

n1
Y
i=0

(ni)(i+1)

n
Y

n = nn

i=1

Portanto,
1
h lg(n!) n lg n.
2

Alternativamente, a frmula de Stirling diz que

1
n n
(1 + ( )).
n! = 2 n
e
n

n n
Disso, temos que h lg(n!) lg e
= n(lg n lg e).
Algoritmos p. 5

Concluso

Todo algoritmo de ordenao


baseado em comparaes faz
(n lg n)

comparaes no pior caso.

Algoritmos p. 6

Counting Sort
Recebe inteiros n e k , e um vetor A[1 . . n] onde
cada elemento um inteiro entre 1 e k .

Algoritmos p. 7

Counting Sort
Recebe inteiros n e k , e um vetor A[1 . . n] onde
cada elemento um inteiro entre 1 e k .
Devolve um vetor B[1 . . n] com
os elementos de A[1 . . n] em ordem crescente.

Algoritmos p. 7

Counting Sort
Recebe inteiros n e k , e um vetor A[1 . . n] onde
cada elemento um inteiro entre 1 e k .
Devolve um vetor B[1 . . n] com
os elementos de A[1 . . n] em ordem crescente.
COUNTINGSORT(A, n)
1 para i 1 at k faa
2
C[i] 0
3 para j 1 at n faa
4
C[A[j]] C[A[j]] + 1
5 para i 2 at k faa
6
C[i] C[i] + C[i 1]
7 para j n decrescendo at 1 faa
8
B[C[A[j]]] A[j]
9
C[A[j]] C[A[j]] 1
10 devolva B
Algoritmos p. 7

Consumo de tempo
linha consumo na linha
1
2
3
4
5
6
7
8
9
10

(k)
O(k)
(n)
O(n)
(k)
O(k)
(n)
O(n)
O(n)
(1)

total

????
Algoritmos p. 8

Consumo de tempo
linha consumo na linha
1
2
3
4
5
6
7
8
9
10

(k)
O(k)
(n)
O(n)
(k)
O(k)
(n)
O(n)
O(n)
(1)

total

(k + n)
Algoritmos p. 8

Counting Sort
COUNTINGSORT(A, n)
1 para i 1 at k faa
2
C[i] 0
3 para j 1 at n faa
4
C[A[j]] C[A[j]] + 1
5 para i 2 at k faa
6
C[i] C[i] + C[i 1]
7 para j n decrescendo at 1 faa
8
B[C[A[j]]] A[j]
9
C[A[j]] C[A[j]] 1
10 devolva B
Consumo de tempo: (k + n)
Se k = O(n), o consumo de tempo (n).
Algoritmos p. 9

Radix Sort
Algoritmo usado para ordenar
inteiros no-negativos com d dgitos
cartes perfurados
registros cuja chave tem vrios campos

Algoritmos p. 10

Radix Sort
Algoritmo usado para ordenar
inteiros no-negativos com d dgitos
cartes perfurados
registros cuja chave tem vrios campos
dgito 1: menos significativo
dgito d: mais significativo

Algoritmos p. 10

Radix Sort
Algoritmo usado para ordenar
inteiros no-negativos com d dgitos
cartes perfurados
registros cuja chave tem vrios campos
dgito 1: menos significativo
dgito d: mais significativo
RADIXSORT(A, n, d)
1 para i 1 at d faa
2
ORDENE(A, n, i)

Algoritmos p. 10

Radix Sort
Algoritmo usado para ordenar
inteiros no-negativos com d dgitos
cartes perfurados
registros cuja chave tem vrios campos
dgito 1: menos significativo
dgito d: mais significativo
RADIXSORT(A, n, d)
1 para i 1 at d faa
2
ORDENE(A, n, i)
ORDENE(A, n, i): ordena A[1 . . n] pelo i-simo dgito dos
nmeros em A por meio de um algoritmo estvel.
Algoritmos p. 10

Estabilidade
Um algoritmo de ordenao estvel se sempre que,
inicialmente, A[i] = A[j] para i < j , a cpia A[i] termina em
uma posio menor do vetor que a cpia A[j].

Algoritmos p. 11

Estabilidade
Um algoritmo de ordenao estvel se sempre que,
inicialmente, A[i] = A[j] para i < j , a cpia A[i] termina em
uma posio menor do vetor que a cpia A[j].
Isso s relevante quando temos informao satlite.

Algoritmos p. 11

Estabilidade
Um algoritmo de ordenao estvel se sempre que,
inicialmente, A[i] = A[j] para i < j , a cpia A[i] termina em
uma posio menor do vetor que a cpia A[j].
Isso s relevante quando temos informao satlite.
Quais dos algoritmos que vimos so estveis?

Algoritmos p. 11

Estabilidade
Um algoritmo de ordenao estvel se sempre que,
inicialmente, A[i] = A[j] para i < j , a cpia A[i] termina em
uma posio menor do vetor que a cpia A[j].
Isso s relevante quando temos informao satlite.
Quais dos algoritmos que vimos so estveis?
insero direta? seleo direta? bubblesort?
mergesort?
quicksort?
heapsort?
countingsort?
Algoritmos p. 11

Consumo de tempo do Radixsort


Depende do algoritmo ORDENE.

Algoritmos p. 12

Consumo de tempo do Radixsort


Depende do algoritmo ORDENE.

Se cada dgito um inteiro de 1 a k ,


ento podemos usar o COUNTINGSORT.

Algoritmos p. 12

Consumo de tempo do Radixsort


Depende do algoritmo ORDENE.

Se cada dgito um inteiro de 1 a k ,


ento podemos usar o COUNTINGSORT.
Neste caso, o consumo de tempo (d(k + n)).

Algoritmos p. 12

Consumo de tempo do Radixsort


Depende do algoritmo ORDENE.

Se cada dgito um inteiro de 1 a k ,


ento podemos usar o COUNTINGSORT.
Neste caso, o consumo de tempo (d(k + n)).
Se d limitado por uma constante (ou seja, se d = O(1))
e k = O(n), ento o consumo de tempo (n).

Algoritmos p. 12

Bucket Sort
Recebe um inteiro n e um vetor A[1 . . n] onde
cada elemento um nmero no intervalo [0, 1).

Algoritmos p. 13

Bucket Sort
Recebe um inteiro n e um vetor A[1 . . n] onde
cada elemento um nmero no intervalo [0, 1).
Devolve um vetor C[1 . . n] com
os elementos de A[1 . . n] em ordem crescente.

Algoritmos p. 13

Bucket Sort
Recebe um inteiro n e um vetor A[1 . . n] onde
cada elemento um nmero no intervalo [0, 1).
Devolve um vetor C[1 . . n] com
os elementos de A[1 . . n] em ordem crescente.
BUCKETSORT(A, n)
1 para i 0 at n 1 faa
2
B[i] NIL
3 para i 1 at n faa
4
INSIRA(B[n A[i]], A[i])
5 para i 0 at n 1 faa
ORDENELISTA(B[i])
6
7 C CONCATENE(B, n)
8 devolva C
Algoritmos p. 13

Bucket Sort
BUCKETSORT(A, n)
1 para i 0 at n 1 faa
2
B[i] NIL
3 para i 1 at n faa
4
INSIRA(B[n A[i]], A[i])
5 para i 0 at n 1 faa
ORDENELISTA(B[i])
6
7 C CONCATENE(B, n)
8 devolva C

Algoritmos p. 14

Bucket Sort
BUCKETSORT(A, n)
1 para i 0 at n 1 faa
2
B[i] NIL
3 para i 1 at n faa
4
INSIRA(B[n A[i]], A[i])
5 para i 0 at n 1 faa
ORDENELISTA(B[i])
6
7 C CONCATENE(B, n)
8 devolva C
INSIRA(p, x): insere x na lista apontada por p
ORDENELISTA(p): ordena a lista apontada por p
CONCATENE(B, n): devolve a lista obtida da concatenao
das listas apontadas por B[0], . . . , B[n 1].
Algoritmos p. 14

Bucket Sort
BUCKETSORT(A, n)
1 para i 0 at n 1 faa
2
B[i] NIL
3 para i 1 at n faa
4
INSIRA(B[n A[i]], A[i])
5 para i 0 at n 1 faa
ORDENELISTA(B[i])
6
7 C CONCATENE(B, n)
8 devolva C
Se os nmeros em A[1 . . n] forem
uniformemente distribudos no intervalo [0, 1),
ento o consumo de tempo esperado linear em n.

Algoritmos p. 14

Bucket Sort
Se os nmeros em A[1 . . n] forem
uniformemente distribudos no intervalo [0, 1),
ento o nmero esperado de elementos de A[1 . . n]
em cada lista B[i] (1).

Algoritmos p. 15

Bucket Sort
Se os nmeros em A[1 . . n] forem
uniformemente distribudos no intervalo [0, 1),
ento o nmero esperado de elementos de A[1 . . n]
em cada lista B[i] (1).
Logo, o consumo de tempo esperado para
ordenar cada uma das listas B[i] (1).
Assim, o consumo de tempo esperado do algoritmo
BUCKETSORT neste caso (n).

Algoritmos p. 15

Bucket Sort
Se os nmeros em A[1 . . n] forem
uniformemente distribudos no intervalo [0, 1),
ento o nmero esperado de elementos de A[1 . . n]
em cada lista B[i] (1).
Logo, o consumo de tempo esperado para
ordenar cada uma das listas B[i] (1).
Assim, o consumo de tempo esperado do algoritmo
BUCKETSORT neste caso (n).

Algoritmos p. 15

Exerccios
Exerccio 10.A
Desenhe a rvore de deciso para o SELECTIONSORT aplicado a A[1 . . 3] com todos os
elementos distintos.
Exerccio 10.B [CLRS 8.1-1]
Qual o menor profundidade (= menor nvel) que uma folha pode ter em uma rvore de
deciso que descreve um algoritmo de ordenao baseado em comparaes?
Exerccio 10.C [CLRS 8.1-2]
Mostre que lg(n!) = (n lg n) sem usar a frmula de Stirling. Sugesto: Calcule
Pn
k=n/2 lg k. Use as tcnicas de CLRS A.2.

Algoritmos p. 16

Exerccios
Exerccio 10.D [CLRS 8.2-1]
Simule a execuo do COUNTINGSORT usando como entrada o vetor
A[1 . . 11] = h7, 1, 3, 1, 2, 4, 5, 7, 2, 4, 3i.
Exerccio 10.E [CLRS 8.2-2]
Mostre que o COUNTINGSORT estvel.
Exerccio 10.F [CLRS 8.2-3]
Suponha que o para da linha 7 do COUNTINGSORT substitudo por
7

para j 1 at n faa

Mostre que o ainda funciona. O algoritmo resultante continua estvel?

Algoritmos p. 17

Dicas de implementao
Mergesort

Algoritmos p. 18

Dicas de implementao
Mergesort
Onde declarar o vetor auxiliar?

Algoritmos p. 18

Dicas de implementao
Mergesort
Onde declarar o vetor auxiliar?
Alternncia entre dois vetores

Algoritmos p. 18

Dicas de implementao
Mergesort
Onde declarar o vetor auxiliar?
Alternncia entre dois vetores
Teste se j ordenado

Algoritmos p. 18

Dicas de implementao
Mergesort
Onde declarar o vetor auxiliar?
Alternncia entre dois vetores
Teste se j ordenado
Insero direta para vetores pequenos

Algoritmos p. 18

Dicas de implementao
Mergesort
Onde declarar o vetor auxiliar?
Alternncia entre dois vetores
Teste se j ordenado
Insero direta para vetores pequenos
Quicksort

Algoritmos p. 18

Dicas de implementao
Mergesort
Onde declarar o vetor auxiliar?
Alternncia entre dois vetores
Teste se j ordenado
Insero direta para vetores pequenos
Quicksort
Elementos repetidos: partio ternria

Algoritmos p. 18

Dicas de implementao
Mergesort
Onde declarar o vetor auxiliar?
Alternncia entre dois vetores
Teste se j ordenado
Insero direta para vetores pequenos
Quicksort
Elementos repetidos: partio ternria
Mediana de trs

Algoritmos p. 18

Dicas de implementao
Mergesort
Onde declarar o vetor auxiliar?
Alternncia entre dois vetores
Teste se j ordenado
Insero direta para vetores pequenos
Quicksort
Elementos repetidos: partio ternria
Mediana de trs
Recurso de cauda

Algoritmos p. 18

Dicas de implementao
Mergesort
Onde declarar o vetor auxiliar?
Alternncia entre dois vetores
Teste se j ordenado
Insero direta para vetores pequenos
Quicksort
Elementos repetidos: partio ternria
Mediana de trs
Recurso de cauda
Insero direta para vetores pequenos
Algoritmos p. 18

S-ar putea să vă placă și