• Nenhum resultado encontrado

Ordenação em tempo linear

N/A
N/A
Protected

Academic year: 2022

Share "Ordenação em tempo linear"

Copied!
92
0
0

Texto

(1)

Ordenação em tempo linear

AULA 8

CLRS cap 8

(2)

Counting Sort

CLRS sec 8.2

Análise de Algoritmos – 1º sem 2022 2 / 93

(3)

Counting Sort

Recebe inteirosn ek, e um vetorA[1. .n]

onde cada elemento é um inteiro entre 1 ek.

Devolve um vetorB[1. .n] com

os elementos deA[1. .n] em ordem crescente. COUNTINGSORT(A,n)

1 para i←1aték faça 2 C[i]←0

3 para j←1 atén faça

4 C[A[j]]←C[A[j]] + 1 C[i]: número de ocorrências dei em A

5 para i←2aték faça

6 C[i]←C[i] +C[i−1] C[i]: número de elementosi em A

7 para jn decrescendo até 1faça 8 B[C[A[j]]]←A[j]

9 C[A[j]]←C[A[j]]−1 10 devolvaB

(4)

Counting Sort

Recebe inteirosn ek, e um vetorA[1. .n]

onde cada elemento é um inteiro entre 1 ek.

Devolve um vetorB[1. .n] com

os elementos deA[1. .n] em ordem crescente.

COUNTINGSORT(A,n) 1 para i←1aték faça 2 C[i]←0

3 para j←1 atén faça

4 C[A[j]]←C[A[j]] + 1 C[i]: número de ocorrências dei em A

5 para i←2aték faça

6 C[i]←C[i] +C[i−1] C[i]: número de elementosi em A

7 para jn decrescendo até 1faça 8 B[C[A[j]]]←A[j]

9 C[A[j]]←C[A[j]]−1 10 devolvaB

Análise de Algoritmos – 1º sem 2022 4 / 93

(5)

Counting Sort

Recebe inteirosn ek, e um vetorA[1. .n]

onde cada elemento é um inteiro entre 1 ek.

Devolve um vetorB[1. .n] com

os elementos deA[1. .n] em ordem crescente.

COUNTINGSORT(A,n) 1 para i←1aték faça 2 C[i]←0

3 para j←1 atén faça

4 C[A[j]]←C[A[j]] + 1 C[i]: número de ocorrências dei em A

5 para i←2aték faça

6 C[i]←C[i] +C[i−1] C[i]: número de elementosi em A

7 para jn decrescendo até 1faça 8 B[C[A[j]]]←A[j]

9 C[A[j]]←C[A[j]]−1 10 devolvaB

(6)

Counting Sort

Recebe inteirosn ek, e um vetorA[1. .n]

onde cada elemento é um inteiro entre 1 ek.

Devolve um vetorB[1. .n] com

os elementos deA[1. .n] em ordem crescente.

COUNTINGSORT(A,n) 1 para i←1aték faça 2 C[i]←0

3 para j←1 atén faça

4 C[A[j]]←C[A[j]] + 1 C[i]: número de ocorrências dei em A

5 para i←2aték faça

6 C[i]←C[i] +C[i−1] C[i]: número de elementosi em A

7 para jn decrescendo até 1faça 8 B[C[A[j]]]←A[j]

9 C[A[j]]←C[A[j]]−1 10 devolvaB

Análise de Algoritmos – 1º sem 2022 6 / 93

(7)

Counting Sort

Recebe inteirosn ek, e um vetorA[1. .n]

onde cada elemento é um inteiro entre 1 ek.

Devolve um vetorB[1. .n] com

os elementos deA[1. .n] em ordem crescente.

COUNTINGSORT(A,n) 1 para i←1aték faça 2 C[i]←0

3 para j←1 atén faça

4 C[A[j]]←C[A[j]] + 1 C[i]: número de ocorrências dei em A

5 para i←2aték faça

6 C[i]←C[i] +C[i−1] C[i]: número de elementosi em A

7 para jn decrescendo até 1faça

(8)

Counting Sort

COUNTINGSORT(A,n) 1 para i←1aték faça 2 C[i]←0

3 para j←1 atén faça 4 C[A[j]]←C[A[j]] + 1 5 para i←2aték faça 6 C[i]←C[i] +C[i−1]

7 para jn decrescendo até 1faça 8 B[C[A[j]]]←A[j]

9 C[A[j]]←C[A[j]]−1 10 devolvaB

Por que escrevemos as linhas 7-9 desta maneira?

Porque isso garante que oCOUNTINGSORT seja estável.

Análise de Algoritmos – 1º sem 2022 8 / 93

(9)

Counting Sort

COUNTINGSORT(A,n) 1 para i←1aték faça 2 C[i]←0

3 para j←1 atén faça 4 C[A[j]]←C[A[j]] + 1 5 para i←2aték faça 6 C[i]←C[i] +C[i−1]

7 para jn decrescendo até 1faça 8 B[C[A[j]]]←A[j]

9 C[A[j]]←C[A[j]]−1 10 devolvaB

(10)

Estabilidade

Um algoritmo de ordenação éestávelse sempre que, inicialmente,A[i] =A[j] para i<j, a cópia A[i] termina em uma posição menor do vetor que a cópiaA[j].

Isso só é relevante quando temosinformação satélite.

Análise de Algoritmos – 1º sem 2022 10 / 93

(11)

Estabilidade

Um algoritmo de ordenação éestávelse sempre que, inicialmente,A[i] =A[j] para i<j, a cópia A[i] termina em uma posição menor do vetor que a cópiaA[j].

Isso só é relevante quando temosinformação satélite.

(12)

Consumo de tempo

Quanto tempo consome o COUNTINGSORTem função do n e do k?

COUNTINGSORT(A,n) 1 para i←1aték faça 2 C[i]←0

3 para j←1 atén faça 4 C[A[j]]←C[A[j]] + 1 5 para i←2aték faça 6 C[i]←C[i] +C[i−1]

7 para jn decrescendo até 1faça 8 B[C[A[j]]]←A[j]

9 C[A[j]]←C[A[j]]−1 10 devolvaB

Análise de Algoritmos – 1º sem 2022 12 / 93

(13)

Consumo de tempo

linha consumo na linha

1 Ê(k)

2 O(k)

3 Ê(n)

4 O(n)

5 Ê(k)

6 O(k)

7 Ê(n)

8 O(n)

9 O(n)

10 Ê(1)

total ????

linha consumo na linha

1 Ê(k)

2 O(k)

3 Ê(n)

4 O(n)

5 Ê(k)

6 O(k)

7 Ê(n)

8 O(n)

9 O(n)

10 Ê(1)

total Ê(k+n)

(14)

Consumo de tempo

linha consumo na linha

1 Ê(k)

2 O(k)

3 Ê(n)

4 O(n)

5 Ê(k)

6 O(k)

7 Ê(n)

8 O(n)

9 O(n)

10 Ê(1)

total Ê(k+n)

Análise de Algoritmos – 1º sem 2022 14 / 93

(15)

Counting Sort

COUNTINGSORT(A,n) 1 para i←1aték faça 2 C[i]←0

3 para j←1 atén faça 4 C[A[j]]←C[A[j]] + 1 5 para i←2aték faça 6 C[i]←C[i] +C[i−1]

7 para jn decrescendo até 1faça 8 B[C[A[j]]]←A[j]

9 C[A[j]]←C[A[j]]−1 10 devolvaB

(16)

Radixsort

CLRS sec 8.3

Análise de Algoritmos – 1º sem 2022 16 / 93

(17)

Radix Sort

Algoritmo usado para ordenar

I inteiros não-negativos com d dígitos I cartões perfurados (Hollerith!)

I registros cuja chave tem vários campos

campo 1: menos significativo campod: mais significativo

RADIXSORT(A,n,d)

1 para i←1até d faça 2 Ordene (A,n,i)

Ordene(A,n,i): ordena A[1. .n] pelo i-ésimo campo dos registros emA por meio de um algoritmoestável.

(18)

Radix Sort

Algoritmo usado para ordenar

I inteiros não-negativos com d dígitos I cartões perfurados (Hollerith!)

I registros cuja chave tem vários campos campo 1: menos significativo

campod: mais significativo

RADIXSORT(A,n,d)

1 para i←1até d faça 2 Ordene (A,n,i)

Ordene(A,n,i): ordena A[1. .n] pelo i-ésimo campo dos registros emA por meio de um algoritmoestável.

Análise de Algoritmos – 1º sem 2022 18 / 93

(19)

Radix Sort

Algoritmo usado para ordenar

I inteiros não-negativos com d dígitos I cartões perfurados (Hollerith!)

I registros cuja chave tem vários campos campo 1: menos significativo

campod: mais significativo RADIXSORT(A,n,d)

1 para i←1atéd faça 2 Ordene (A,n,i)

Ordene(A,n,i): ordena A[1. .n] pelo i-ésimo campo dos registros emA por meio de um algoritmoestável.

(20)

Radix Sort

Algoritmo usado para ordenar

I inteiros não-negativos com d dígitos I cartões perfurados (Hollerith!)

I registros cuja chave tem vários campos campo 1: menos significativo

campod: mais significativo RADIXSORT(A,n,d)

1 para i←1atéd faça 2 Ordene (A,n,i)

Ordene(A,n,i): ordena A[1. .n] pelo i-ésimo campo dos registros emA por meio de um algoritmoestável.

Análise de Algoritmos – 1º sem 2022 20 / 93

(21)

Estabilidade

Um algoritmo de ordenação éestávelse sempre que, inicialmente,A[i] =A[j] para i<j, a cópia A[i] termina em uma posição menor do vetor que a cópiaA[j].

Isso só é relevante quando temosinformação satélite.

Quais dos algoritmos que vimos são estáveis?

I inserção direta? seleção direta? bubblesort?

I mergesort?

I quicksort?

I heapsort?

(22)

Consumo de tempo do Radixsort

Depende do algoritmoOrdene.

Se cada campo é um inteiro de 1 ak, então podemos usar oCOUNTINGSORT.

Neste caso, o consumo de tempo éÊ(d(k+n)).

Sed é limitado por uma constante (ou seja, sed=O(1)) ek=O(n), então o consumo de tempo éÊ(n).

Análise de Algoritmos – 1º sem 2022 22 / 93

(23)

Consumo de tempo do Radixsort

Depende do algoritmoOrdene.

Se cada campo é um inteiro de 1 ak, então podemos usar oCOUNTINGSORT.

Neste caso, o consumo de tempo éÊ(d(k+n)).

Sed é limitado por uma constante (ou seja, sed=O(1)) ek=O(n), então o consumo de tempo éÊ(n).

(24)

Consumo de tempo do Radixsort

Depende do algoritmoOrdene.

Se cada campo é um inteiro de 1 ak, então podemos usar oCOUNTINGSORT.

Neste caso, o consumo de tempo éÊ(d(k+n)).

Sed é limitado por uma constante (ou seja, sed=O(1)) ek=O(n), então o consumo de tempo éÊ(n).

Análise de Algoritmos – 1º sem 2022 24 / 93

(25)

Consumo de tempo do Radixsort

Depende do algoritmoOrdene.

Se cada campo é um inteiro de 1 ak, então podemos usar oCOUNTINGSORT.

Neste caso, o consumo de tempo éÊ(d(k+n)).

Sed é limitado por uma constante (ou seja, sed=O(1)) ek=O(n), então o consumo de tempo éÊ(n).

(26)

Bucketsort

CLRS sec 8.4

Análise de Algoritmos – 1º sem 2022 26 / 93

(27)

Bucket Sort

Recebe um inteiron e um vetorA[1. .n] onde cada elemento é um número no intervalo [0,1).

A .47 .93 .82 .12 .42 .03 .62 .38 .77 .91

Devolve um vetorC[1. .n] com

os elementos deA[1. .n] em ordem crescente.

C .03 .12 .38 .42 .47 .62 .77 .82 .91 .93

(28)

Bucket Sort

Recebe um inteiron e um vetorA[1. .n] onde cada elemento é um número no intervalo [0,1).

A .47 .93 .82 .12 .42 .03 .62 .38 .77 .91

Devolve um vetorC[1. .n] com

os elementos deA[1. .n] em ordem crescente.

C .03 .12 .38 .42 .47 .62 .77 .82 .91 .93

Análise de Algoritmos – 1º sem 2022 28 / 93

(29)

Bucket Sort

Recebe um inteiron e um vetorA[1. .n] onde cada elemento é um número no intervalo [0,1).

A .47 .93 .82 .12 .42 .03 .62 .38 .77 .91

Devolve um vetorC[1. .n] com

os elementos deA[1. .n] em ordem crescente.

C .03 .12 .38 .42 .47 .62 .77 .82 .91 .93

(30)

Bucket Sort

Recebe um inteiron e um vetorA[1. .n] onde cada elemento é um número no intervalo [0,1).

A .47 .93 .82 .12 .42 .03 .62 .38 .77 .91

Devolve um vetorC[1. .n] com

os elementos deA[1. .n] em ordem crescente.

C .03 .12 .38 .42 .47 .62 .77 .82 .91 .93

Análise de Algoritmos – 1º sem 2022 30 / 93

(31)

Exemplo

.47 .93 .82 .12 .42 .03 .62 .38 .77 .91

B[0] : .03 B[1] : .12 B[2] : B[3] : .38 B[4] : .47 .42 B[5] :

B[6] : .62 B[7] : .77 B[8] : .82 B[9] : .93 .91

(32)

Exemplo

.47 .93 .82 .12 .42 .03 .62 .38 .77 .91

B[0] : .03 B[1] : .12 B[2] : B[3] : .38 B[4] : .47 .42 B[5] :

B[6] : .62 B[7] : .77 B[8] : .82 B[9] : .93 .91

Análise de Algoritmos – 1º sem 2022 32 / 93

(33)

Exemplo

.47 .93 .82 .12 .42 .03 .62 .38 .77 .91

B[0] : .03 B[1] : .12 B[2] : B[3] : .38 B[4] : .42 .47 B[5] :

B[6] : .62 B[7] : .77 B[8] : .82 B[9] : .91 .93

(34)

Exemplo

.47 .93 .82 .12 .42 .03 .62 .38 .77 .91

B[0] : .03 B[1] : .12 B[2] : B[3] : .38 B[4] : .42 .47 B[5] :

B[6] : .62 B[7] : .77 B[8] : .82 B[9] : .91 .93

.03 .12 .38 .42 .47 .62 .77 .82 .91 .93

Análise de Algoritmos – 1º sem 2022 34 / 93

(35)

Bucket Sort

Recebe um inteiron e um vetorA[1. .n] onde cada elemento é um número no intervalo [0,1).

Devolve um vetorC[1. .n] com

os elementos deA[1. .n] em ordem crescente.

BUCKETSORT(A,n)

1 para i←0atén−1 faça 2 B[i]NIL

3 para i←1atén faça 4 INSIRA(B[bn A[i]c],A[i]) 5 para i←0atén−1 faça 6 ORDENELISTA(B[i])

7 C ←C (B,n)

(36)

Bucket Sort

BUCKETSORT(A,n)

1 para i←0atén−1 faça 2 B[i]NIL

3 para i←1atén faça 4 INSIRA(B[bn A[i]c],A[i]) 5 para i←0atén−1 faça 6 ORDENELISTA(B[i]) 7 C ←CONCATENE(B,n) 8 devolvaC

INSIRA(p,x): inserex na lista apontada por p ORDENELISTA(p): ordena a lista apontada por p CONCATENE(B,n): devolve a lista obtida da

concatenação das listas apontadas porB[0], . . . ,B[n−1].

Análise de Algoritmos – 1º sem 2022 36 / 93

(37)

Consumo de tempo

Suponha que os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1).

Suponha que oORDENELISTAseja o INSERTIONSORT.

SejaXi o número de elementos na listaB[i]. Seja

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i] 0 se o j-ésimo elemento não foi para a listaB[i]. Observe queXi =PjXij.

Yi: número de comparações para ordenar a lista B[i].

(38)

Consumo de tempo

Suponha que os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1).

Suponha que oORDENELISTAseja o INSERTIONSORT. SejaXi o número de elementos na listaB[i].

Seja Xij =

( 1 se o j-ésimo elemento foi para a listaB[i] 0 se o j-ésimo elemento não foi para a listaB[i]. Observe queXi =PjXij.

Yi: número de comparações para ordenar a lista B[i].

Análise de Algoritmos – 1º sem 2022 38 / 93

(39)

Consumo de tempo

Suponha que os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1).

Suponha que oORDENELISTAseja o INSERTIONSORT. SejaXi o número de elementos na listaB[i].

Seja Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Observe queXi =PjXij.

Yi: número de comparações para ordenar a lista B[i].

(40)

Consumo de tempo

Suponha que os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1).

Suponha que oORDENELISTAseja o INSERTIONSORT. SejaXi o número de elementos na listaB[i].

Seja Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Observe queXi =PjXij.

Yi: número de comparações para ordenar a lista B[i].

Análise de Algoritmos – 1º sem 2022 40 / 93

(41)

Consumo de tempo

Suponha que os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1).

Suponha que oORDENELISTAseja o INSERTIONSORT. SejaXi o número de elementos na listaB[i].

Seja Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Observe queXi =PjXij.

(42)

Consumo de tempo

Xi: número de elementos na lista B[i]

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Yi: número de comparações para ordenar a lista B[i].

Observe queYiXi2.

LogoE[Yi]≤E[Xi2] =E[(PjXij)2].

E[(X

j

Xij)2] = E[X

j X

k

XijXik]

= X

j

E[Xij2] +X

j X

k,j

E[XijXik]

Análise de Algoritmos – 1º sem 2022 42 / 93

(43)

Consumo de tempo

Xi: número de elementos na lista B[i]

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Yi: número de comparações para ordenar a lista B[i].

Observe queYiXi2.

LogoE[Yi]≤E[Xi2] =E[(PjXij)2].

E[(X

j

Xij)2] = E[X

j X

k

XijXik]

= X

j

E[Xij2] +X

j X

k,j

E[XijXik]

(44)

Consumo de tempo

Xi: número de elementos na lista B[i]

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Yi: número de comparações para ordenar a lista B[i].

Observe queYiXi2.

LogoE[Yi]≤E[Xi2] =E[(PjXij)2].

E[(X

j

Xij)2] = E[X

j X

k

XijXik]

= E[X

j

Xij2+X

j X

k,j

XijXik]

E[(X

j

Xij)2] = E[X

j X

k

XijXik]

= X

j

E[Xij2] +X

j X

k,j

E[XijXik]

Análise de Algoritmos – 1º sem 2022 44 / 93

(45)

Consumo de tempo

Xi: número de elementos na lista B[i]

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Yi: número de comparações para ordenar a lista B[i].

Observe queYiXi2.

LogoE[Yi]≤E[Xi2] =E[(PjXij)2].

E[(X

j

Xij)2] = E[X

j X

k

XijXik]

= E[X

j

Xij2] +E[X

j X

k,j

XijXik]

E[(X

j

Xij)2] = E[X

j X

k

XijXik]

= X

j

E[Xij2] +X

j X

k,j

E[XijXik]

(46)

Consumo de tempo

Xi: número de elementos na lista B[i]

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Yi: número de comparações para ordenar a lista B[i].

Observe queYiXi2.

LogoE[Yi]≤E[Xi2] =E[(PjXij)2].

E[(X

j

Xij)2] = E[X

j X

k

XijXik]

= X

j

E[Xij2] +X

j X

k,j

E[XijXik]

Análise de Algoritmos – 1º sem 2022 46 / 93

(47)

Consumo de tempo

Primeiro vamos calcularE[Xij2].

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Lembre-se que os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1).

Observe queXij2 é uma variável aleatória binária. Então E[Xij2] = Pr[Xij2= 1] = Pr[Xij= 1] = 1

n.

(48)

Consumo de tempo

Primeiro vamos calcularE[Xij2].

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Lembre-se que os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1).

Observe queXij2 é uma variável aleatória binária. Então E[Xij2] = Pr[Xij2= 1] = Pr[Xij= 1] = 1

n.

Análise de Algoritmos – 1º sem 2022 48 / 93

(49)

Consumo de tempo

Primeiro vamos calcularE[Xij2].

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Lembre-se que os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1).

Observe queXij2 é uma variável aleatória binária.

Então E[Xij2] = Pr[Xij2= 1] = Pr[Xij= 1] = 1

n.

(50)

Consumo de tempo

Primeiro vamos calcularE[Xij2].

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i]

0 se o j-ésimo elemento não foi para a listaB[i].

Lembre-se que os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1).

Observe queXij2 é uma variável aleatória binária. Então E[Xij2] = Pr[Xij2= 1] = Pr[Xij = 1] = 1

n.

Análise de Algoritmos – 1º sem 2022 50 / 93

(51)

Consumo de tempo

Voltando...

Xi: número de elementos na lista B[i]

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i] 0 se o j-ésimo elemento não foi para a listaB[i].

)

Yi: número de comparações para ordenar a lista B[i].

Observe queYiXi2. Ademais, E[Yi] ≤ X

j

E[Xij2] +X

j X

k,j

E[XijXik]

= X

j

1 n+X

j X

k,j

E[XijXik]

= 1 +X

j X

k,j

E[XijXik].

(52)

Consumo de tempo

Voltando...

Xi: número de elementos na lista B[i]

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i] 0 se o j-ésimo elemento não foi para a listaB[i].

)

Yi: número de comparações para ordenar a lista B[i].

Observe queYiXi2. Ademais, E[Yi] ≤ X

j

E[Xij2] +X

j X

k,j

E[XijXik]

= X

j

1 n+X

j X

k,j

E[XijXik]

= 1 +X

j X

k,j

E[XijXik].

Análise de Algoritmos – 1º sem 2022 52 / 93

(53)

Consumo de tempo

Voltando...

Xi: número de elementos na lista B[i]

Xij =

( 1 se o j-ésimo elemento foi para a listaB[i] 0 se o j-ésimo elemento não foi para a listaB[i].

)

Yi: número de comparações para ordenar a lista B[i].

Observe queYiXi2. Ademais, E[Yi] ≤ X

j

E[Xij2] +X

j X

k,j

E[XijXik]

= X

j

1 n+X

j X

k,j

E[XijXik]

(54)

Consumo de tempo

Para calcularE[XijXik] para j ,k, primeiro note que Xij e Xik são variáveis aleatórias independentes.

Portanto,E[XijXik] =E[Xij]E[Xik].

Ademais,E[Xij] = Pr[Xij= 1] =1n.

Logo,

E[Yi] ≤ 1 +X

j X

k,j

1 n2

= 1 +n(n−1)1 n2

= 1 + (n−1)1 n

= 2−1 n.

Análise de Algoritmos – 1º sem 2022 54 / 93

(55)

Consumo de tempo

Para calcularE[XijXik] para j ,k, primeiro note que Xij e Xik são variáveis aleatórias independentes.

Portanto,E[XijXik] =E[Xij]E[Xik].

Ademais,E[Xij] = Pr[Xij= 1] =1n. Logo,

E[Yi] ≤ 1 +X

j X

k,j

1 n2

= 1 +n(n−1)1 n2

= 1 + (n−1)1 n

(56)

Consumo de tempo

Agora, sejaY =PiYi.

Note queY é o número de comparações realizadas peloBUCKETSORTno total.

AssimE[Y] é o número esperado de comparações realizadas pelo algoritmo, e tal número determina o consumo assintótico de tempo doBUCKETSORT.

E[Y] = X

i

E[Yi] ≤ 2n−1 = O(n).

O consumo de tempo esperado doBUCKETSORT

quando os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1) é O(n).

Análise de Algoritmos – 1º sem 2022 56 / 93

(57)

Consumo de tempo

Agora, sejaY =PiYi.

Note queY é o número de comparações realizadas peloBUCKETSORTno total.

AssimE[Y] é o número esperado de comparações realizadas pelo algoritmo, e tal número determina o consumo assintótico de tempo doBUCKETSORT.

E[Y] = X

i

E[Yi] ≤ 2n−1 = O(n).

O consumo de tempo esperado doBUCKETSORT

quando os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1) é O(n).

(58)

Consumo de tempo

Agora, sejaY =PiYi.

Note queY é o número de comparações realizadas peloBUCKETSORTno total.

AssimE[Y] é o número esperado de comparações realizadas pelo algoritmo, e tal número determina o consumo assintótico de tempo doBUCKETSORT.

E[Y] = X

i

E[Yi] ≤ 2n−1 = O(n).

O consumo de tempo esperado doBUCKETSORT

quando os números emA[1. .n] são uniformemente distribuídos no intervalo [0,1) é O(n).

Análise de Algoritmos – 1º sem 2022 58 / 93

(59)

Dicas de implementação

Mergesort

I Onde declarar o vetor auxiliar? I Alternância entre dois vetores I Teste se já ordenado

I Inserção direta para vetores pequenos Quicksort

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

I Inserção direta para vetores pequenos

(60)

Dicas de implementação

Mergesort

I Onde declarar o vetor auxiliar?

I Onde declarar o vetor auxiliar? I Alternância entre dois vetores I Teste se já ordenado

I Inserção direta para vetores pequenos Quicksort

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

I Inserção direta para vetores pequenos

Análise de Algoritmos – 1º sem 2022 60 / 93

(61)

Dicas de implementação

Mergesort

I Onde declarar o vetor auxiliar?

I Alternância entre dois vetores

I Onde declarar o vetor auxiliar? I Alternância entre dois vetores I Teste se já ordenado

I Inserção direta para vetores pequenos Quicksort

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

I Inserção direta para vetores pequenos

(62)

Dicas de implementação

Mergesort

I Onde declarar o vetor auxiliar?

I Alternância entre dois vetores I Teste se já ordenado

I Onde declarar o vetor auxiliar? I Alternância entre dois vetores I Teste se já ordenado

I Inserção direta para vetores pequenos Quicksort

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

I Inserção direta para vetores pequenos

Análise de Algoritmos – 1º sem 2022 62 / 93

(63)

Dicas de implementação

Mergesort

I Onde declarar o vetor auxiliar?

I Alternância entre dois vetores I Teste se já ordenado

I Inserção direta para vetores pequenos

Quicksort

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

I Inserção direta para vetores pequenos

(64)

Dicas de implementação

Mergesort

I Onde declarar o vetor auxiliar?

I Alternância entre dois vetores I Teste se já ordenado

I Inserção direta para vetores pequenos Quicksort

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

I Inserção direta para vetores pequenos

Análise de Algoritmos – 1º sem 2022 64 / 93

(65)

Dicas de implementação

Mergesort

I Onde declarar o vetor auxiliar?

I Alternância entre dois vetores I Teste se já ordenado

I Inserção direta para vetores pequenos Quicksort

I Elementos repetidos: partição ternária

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

I Inserção direta para vetores pequenos

(66)

Dicas de implementação

Mergesort

I Onde declarar o vetor auxiliar?

I Alternância entre dois vetores I Teste se já ordenado

I Inserção direta para vetores pequenos Quicksort

I Elementos repetidos: partição ternária I Mediana de três

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

I Inserção direta para vetores pequenos

Análise de Algoritmos – 1º sem 2022 66 / 93

(67)

Dicas de implementação

Mergesort

I Onde declarar o vetor auxiliar?

I Alternância entre dois vetores I Teste se já ordenado

I Inserção direta para vetores pequenos Quicksort

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

I Inserção direta para vetores pequenos

(68)

Dicas de implementação

Mergesort

I Onde declarar o vetor auxiliar?

I Alternância entre dois vetores I Teste se já ordenado

I Inserção direta para vetores pequenos Quicksort

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

I Inserção direta para vetores pequenos

Análise de Algoritmos – 1º sem 2022 68 / 93

(69)

Dicas de implementação: Mergesort

RearranjaA[p. .r] em ordem crescente.

MergeSort(A,p,r) 1 sep<r

2 entãoq← b(p+r)/2c 3 MergeSort(A,p,q) 4 MergeSort(A,q+ 1,r) 5 Intercala(A,p,q,r)

I Onde declarar o vetor auxiliar usado noIntercala?

(70)

Dicas de implementação: Mergesort

MergeSort(A,n) ←− aqui 1 MergeSortRec(A,1,n) xxx

MergeSortRec(A,p,r) 1 sep<r

2 entãoq← b(p+r)/2c

3 MergeSortRec(A,p,q) 4 MergeSortRec(A,q+ 1,r) 5 Intercala(A,p,q,r)

I Onde declarar o vetor auxiliar usado noIntercala?

Análise de Algoritmos – 1º sem 2022 70 / 93

(71)

Dicas de implementação: Mergesort

MergeSort(A,n)

1 MergeSortRec(A,1,n) xxx

MergeSortRec(A,p,r) 1 sep<r

2 entãoq← b(p+r)/2c

3 MergeSortRec(A,p,q) 4 MergeSortRec(A,q+ 1,r) 5 Intercala(A,p,q,r)

I Onde declarar o vetor auxiliar usado noIntercala?

(72)

Dicas de implementação: Mergesort

MergeSort(A,n) 1 BA

2 MergeSortRec(B,A,1,n) xxx

MergeSortRec(A,B,p,r) 1 sep<r

2 entãoq← b(p+r)/2c

3 MergeSortRec(B,A,p,q) 4 MergeSortRec(B,A,q+ 1,r) 5 Intercala(A,B,p,q,r)

I Onde declarar o vetor auxiliar usado noIntercala? I Alternância entre dois vetores

Análise de Algoritmos – 1º sem 2022 72 / 93

(73)

Dicas de implementação: Mergesort

Intercala(A,B,p,q,r) 1 ip jq+ 1 kp 2 enquantoiq e jr faça 3 se A[i]A[j]

4 então B[k]A[i] kk+1 ii+1 5 senão B[k]←A[j] kk+1 jj+1 6 enquantoiq faça

7 B[k]A[i] kk+1 ii+1 8 enquantojr faça

9 B[k]A[j] kk+1 jj+1

(74)

Dicas de implementação: Mergesort

Intercala(A,p,q,r)

1 paraip atéq faça B[i]←A[i]

2 parajq+ 1até r façaB[r+q+ 1−j]←A[j] 3 ip jr

4 parakp atér faça 5 se B[i]B[j]

6 entãoA[k]B[i]

7 ii+ 1

8 senãoA[k]B[j]

9 jj−1

I Onde declarar o vetor auxiliar usado noIntercala? I Alternância entre dois vetores

I Teste se já ordenado

Intercala(A,p,q,r)

0 seA[q]>A[q+ 1]então ←− aqui 1 para ip atéq façaB[i]A[i]

2 para jq+ 1atér façaB[r+q+ 1−j]←A[j] 3 ip jr

4 para kp atér faça 5 se B[i]≤B[j]

6 então A[k]←B[i]

7 ii+ 1

8 senão A[k]B[j]

9 jj−1

I Onde declarar o vetor auxiliar usado noIntercala? I Alternância entre dois vetores

I Teste se já ordenado

Análise de Algoritmos – 1º sem 2022 74 / 93

(75)

Dicas de implementação: Mergesort

Intercala(A,p,q,r)

0 seA[q]>A[q+ 1]então ←− aqui 1 para ip atéq façaB[i]A[i]

2 para jq+ 1atér façaB[r+q+ 1−j]←A[j] 3 ip jr

4 para kp atér faça 5 seB[i]≤B[j]

6 entãoA[k]←B[i]

7 ii+ 1

8 senão A[k]←B[j]

9 jj−1

I Onde declarar o vetor auxiliar usado noIntercala?

(76)

Dicas de implementação: Quicksort

Quicksort(A,p,r) 1 sep<r

2 entãoq←Particione(A,p,r) 3 Quicksort(A,p,q−1) 4 Quicksort(A,q+ 1,r)

Particione-Alea(A,p,r) 1 i←RANDOM(p,r) 2 A[i]↔A[r]

3 devolvaParticione(A,p,r) I Elementos repetidos: partição ternária I Mediana de três

Em vez de escolher um pivô aleatoriamente, escolhe três elementos do vetor aleatoriamente, e usa como pivô a mediana dos três.

Aproveite para colocar o menor dos três no extremo esquerdo, e o maior dos três no extremo direito, e use-os de sentinela na partição!

Análise de Algoritmos – 1º sem 2022 76 / 93

(77)

Dicas de implementação: Quicksort

Quicksort(A,p,r) 1 sep<r

2 então(q,t)←TriParticione(A,p,r) 3 Quicksort(A,p,q−1)

4 Quicksort(A,t+ 1,r) I Elementos repetidos: partição ternária

Particione-Alea(A,p,r) 1 i←RANDOM(p,r) 2 A[i]↔A[r]

3 devolvaParticione(A,p,r) I Elementos repetidos: partição ternária I Mediana de três

Em vez de escolher um pivô aleatoriamente, escolhe três elementos do vetor aleatoriamente, e usa como pivô a mediana dos três.

Aproveite para colocar o menor dos três no extremo esquerdo, e o maior dos três no extremo direito, e use-os de sentinela na partição!

(78)

Dicas de implementação: Quicksort

Particione-Alea(A,p,r) 1 i←RANDOM(p,r) 2 A[i]↔A[r]

3 devolvaParticione(A,p,r) I Elementos repetidos: partição ternária I Mediana de três

Em vez de escolher um pivô aleatoriamente, escolhe três elementos do vetor aleatoriamente, e usa como pivô a mediana dos três.

Aproveite para colocar o menor dos três no extremo esquerdo, e o maior dos três no extremo direito, e use-os de sentinela na partição!

Análise de Algoritmos – 1º sem 2022 78 / 93

(79)

Dicas de implementação: Quicksort

Particione-Alea(A,p,r) 1 i←RANDOM(p,r) 2 A[i]↔A[r]

3 devolvaParticione(A,p,r) I Elementos repetidos: partição ternária I Mediana de três

Em vez de escolher um pivô aleatoriamente, escolhe três elementos do vetor aleatoriamente, e usa como pivô a mediana dos três.

Aproveite para colocar o menor dos três no extremo esquerdo, e o maior dos três no extremo direito, e use-os de sentinela na partição!

(80)

Dicas de implementação: Quicksort

Particione-Alea(A,p,r) 1 i←RANDOM(p,r) 2 A[i]↔A[r]

3 devolvaParticione(A,p,r) I Elementos repetidos: partição ternária I Mediana de três

Em vez de escolher um pivô aleatoriamente, escolhe três elementos do vetor aleatoriamente, e usa como pivô a mediana dos três.

Aproveite para colocar o menor dos três no extremo esquerdo, e o maior dos três no extremo direito, e use-os de sentinela na partição!

Análise de Algoritmos – 1º sem 2022 80 / 93

(81)

Particione

RearranjaA[p. .r] de modo que pqr e A[p. .q−1]A[q]<A[q+1. .r]

Supõe queA[p]A[r]≤A[r−1] e useA[r] como pivô.

Particione(A,p,r)

1 xA[r] x é o “pivô”

2 ip+ 1 jr−2 3 enquantoij faça

4 enquanto A[i]x façaii+ 1 5 enquanto A[j]x façajj−1 6 se i<j entãoA[i]↔A[j]

7 A[i]↔A[r]

(82)

Dicas de implementação: Quicksort

Quicksort(A,p,r) 1 sep<r

2 entãoq←Particione(A,p,r) 3 Quicksort(A,p,q−1)

4 Quicksort(A,q+ 1,r) ←− aqui I Elementos repetidos: partição ternária

I Mediana de três I Recursão de cauda

Quicksort(A,p,r)

1 enquanto p<r faça ←− virou enquanto aqui! 2 q←Particione(A,p,r)

3 Quicksort(A,p,q−1)

4 pq+ 1 ←− ajusta os parâmetros! I Elementos repetidos: partição ternária

I Mediana de três I Recursão de cauda

Substitua essa chamada recursiva por um enquanto.

Análise de Algoritmos – 1º sem 2022 82 / 93

(83)

Dicas de implementação: Quicksort

Quicksort(A,p,r)

1 enquantop<r faça ←− virou enquanto aqui!

2 q←Particione(A,p,r) 3 Quicksort(A,p,q−1)

4 pq+ 1 ←− ajusta os parâmetros!

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

Substitua essa chamada recursiva por um enquanto.

(84)

Dicas de implementação: Quicksort

Quicksort(A,p,r)

1 enquantop<r faça ←− virou enquanto aqui!

2 q←Particione(A,p,r) 3 Quicksort(A,p,q−1)

4 pq+ 1 ←− ajusta os parâmetros!

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

Correto: substitua a chamada da maior metade!

Quicksort(A,p,r)

1 enquanto p<r ←− virou enquanto aqui! 2 q←Particione(A,p,r)

3 se qp<rq

4 entãoQuicksort(A,p,q−1)

5 pq+ 1

6 senãoQuicksort(A,q+ 1,r)

7 rq−1

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

Correto: substitua a chamada da maior metade! Profundidade da pilha da recursão: O(lgn).

Análise de Algoritmos – 1º sem 2022 84 / 93

(85)

Dicas de implementação: Quicksort

Quicksort(A,p,r)

1 enquantop<r ←− virou enquanto aqui!

2 q←Particione(A,p,r) 3 se qp<rq

4 entãoQuicksort(A,p,q−1)

5 pq+ 1

6 senãoQuicksort(A,q+ 1,r)

7 rq−1

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

Correto: substitua a chamada da maior metade!

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

Correto: substitua a chamada da maior metade! Profundidade da pilha da recursão: O(lgn).

(86)

Dicas de implementação: Quicksort

Quicksort(A,p,r)

1 enquantop<r ←− virou enquanto aqui!

2 q←Particione(A,p,r) 3 se qp<rq

4 entãoQuicksort(A,p,q−1)

5 pq+ 1

6 senãoQuicksort(A,q+ 1,r)

7 rq−1

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda

Correto: substitua a chamada da maior metade!

Profundidade da pilha da recursão: O(lgn).

Análise de Algoritmos – 1º sem 2022 86 / 93

(87)

Dicas de implementação

Inserção direta para vetores pequenos.

Mergesort

I Onde declarar o vetor auxiliar usado noIntercala? I Alternância entre dois vetores

I Teste se já ordenado Quicksort

I Elementos repetidos: partição ternária I Mediana de três

I Recursão de cauda Heapsort

(88)

Comparação entre os algoritmos

Mergesort:

Entre 12nlgn e nlgn comparações.

Usa espaço extra linear.

Quicksort:

Em média, 2nlgn comparações (e 13nlgn trocas). Espaço extra logarítmico.

Heapsort:

Menos de 2nlgn+ 2n comparações.

(Em média, cai para metade disso com a melhora.) Espaço extra constante.

Performance de cache ruim.

Análise de Algoritmos – 1º sem 2022 88 / 93

(89)

Comparação entre os algoritmos

Mergesort:

Entre 12nlgn e nlgn comparações.

Usa espaço extra linear.

Quicksort:

Em média, 2nlgn comparações (e 13nlgn trocas).

Espaço extra logarítmico.

Heapsort:

Menos de 2nlgn+ 2n comparações.

(Em média, cai para metade disso com a melhora.) Espaço extra constante.

Performance de cache ruim.

(90)

Comparação entre os algoritmos

Mergesort:

Entre 12nlgn e nlgn comparações.

Usa espaço extra linear.

Quicksort:

Em média, 2nlgn comparações (e 13nlgn trocas).

Espaço extra logarítmico.

Heapsort:

Menos de 2nlgn+ 2n comparações.

(Em média, cai para metade disso com a melhora.) Espaço extra constante.

Performance de cache ruim.

Análise de Algoritmos – 1º sem 2022 90 / 93

(91)

Primeira prova

Data: 29 de abril (sexta), às 10h.

Duração: 2 horas (reserve mais um pouco).

Matéria da prova: tudo que vimos até a aula passada.

Dúvidas? Perguntas?

(92)

Primeira prova

Data: 29 de abril (sexta), às 10h.

Duração: 2 horas (reserve mais um pouco).

Matéria da prova: tudo que vimos até a aula passada.

Dúvidas? Perguntas?

Análise de Algoritmos – 1º sem 2022 92 / 93

Referências

Documentos relacionados

No ajuste de um modelo de regress˜ao, linear ou n˜ao linear, para dados observados ao longo do tempo, em que y ij denota a i-´esima resposta observada na ocasi˜ao j (i = 1,. , n i )

◦ Supomos que as chaves são inteiros não-negativos pequenos; co- locamos item de chave i na posição v[i] do vetor v.. ◦ Tempo de inserção, remoção e

Para avaliação da diversidade e da densidade de propágulos de FMA no solo e da colonização micorrízica em plantas da área, foram realizadas coletas de solo e raízes nas

Muitas vezes, para designar com clareza certas situações, é necessário formar um grupo ordenado de números que se apresentam dispostos em linhas e colunas numa tabela..

O objetivo ´ e estudar Geometria pelo m´ etodo cartesiano (atribu´ıdo a Ren´ e Descartes, no s´ eculo XVI) que consiste em associar equa¸c˜ oes aos entes geom´ etricos, e atrav´

[r]

Distˆ ancia de um ponto a uma reta... Distˆ ancia de um ponto a

Slides adaptados dos slides do livro texto (Ziviani) e dos slides de aula dos professores Davi Menotti (DECOM/UFOP) e Antônio Alfredo Ferreira Loureiro (DCC/UFMG)...