• Nenhum resultado encontrado

Quicksort e Select Aleatorizados

N/A
N/A
Protected

Academic year: 2022

Share "Quicksort e Select Aleatorizados"

Copied!
61
0
0

Texto

(1)

Quicksort e Select Aleatorizados

CLRS Secs 7.3, 7.4 e 9.2

(2)

Relembremos o Particione

RearranjaA[p. .r]de modo quep≤q≤r e A[p. .q−1]≤A[q]<A[q+1. .r]

Particione(A,p,r)

1 x←A[r] xé o “pivô”

2 i←p−1

3 paraj←patér−1faça 4 seA[j]≤x

5 entãoi←i+1 6 A[i]↔A[j] 7 A[i+1]↔A[r]

8 devolvai+1

Invariantes: no começo de cada iteração de 3–6,

Consumo de tempo:Ê(n)onden:=r−p.

(3)

Relembremos o Particione

RearranjaA[p. .r]de modo quep≤q≤r e A[p. .q−1]≤A[q]<A[q+1. .r]

Particione(A,p,r)

1 x←A[r] xé o “pivô”

2 i←p−1

3 paraj←patér−1faça 4 seA[j]≤x

5 entãoi←i+1 6 A[i]↔A[j] 7 A[i+1]↔A[r]

8 devolvai+1

Consumo de tempo:Ê(n)onden:=r−p.

(4)

Quicksort aleatorizado

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

3 devolvaParticione(A,p,r)

QuickSort-Ale(A,p,r) 1 sep<r

2 entãoq←Particione-Alea(A,p,r) 3 QuickSort−Ale(A,p,q−1) 4 QuickSort−Ale(A,q+1,r)

(5)

Quicksort aleatorizado

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

3 devolvaParticione(A,p,r) QuickSort-Ale(A,p,r)

1 sep<r

2 entãoq←Particione-Alea(A,p,r) 3 QuickSort−Ale(A,p,q−1) 4 QuickSort−Ale(A,q+1,r)

(6)

Como analizar?

Vamos estimar o tempo médio...

do que, mesmo?

I Fixe uma permutação

I Considere as várias instâncias do QuickSort-Ale em cima dela, com a distribuição de probabilidade dada pelos sorteios ao longo da execução.

I Determine o tempo médiopara essa permutação.

(7)

Como analizar?

Vamos estimar o tempo médio...do que, mesmo?

I Fixe uma permutação

I Considere as várias instâncias do QuickSort-Ale em cima dela, com a distribuição de probabilidade dada pelos sorteios ao longo da execução.

I Determine o tempo médiopara essa permutação.

(8)

Como analizar?

Vamos estimar o tempo médio...do que, mesmo?

I Fixe uma permutação

I Considere as várias instâncias do QuickSort-Ale em cima dela, com a distribuição de probabilidade dada pelos sorteios ao longo da execução.

I Determine o tempo médiopara essa permutação.

(9)

Como analizar?

Vamos estimar o tempo médio...do que, mesmo?

I Fixe uma permutação

I Considere as várias instâncias do QuickSort-Ale em cima dela, com a distribuição de probabilidade dada pelos sorteios ao longo da execução.

I Determine o tempo médiopara essa permutação.

(10)

Como analizar?

Vamos estimar o tempo médio...do que, mesmo?

I Fixe uma permutação

I Considere as várias instâncias do QuickSort-Ale em cima dela, com a distribuição de probabilidade dada pelos sorteios ao longo da execução.

I Determine o tempo médiopara essa permutação.

(11)

Quicksort aleatorizado

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

3 devolvaParticione(A,p,r)

QuickSort-Ale(A,p,r) 1 sep<r

2 entãoq←Particione-Alea(A,p,r) 3 QuickSort−Ale(A,p,q−1) 4 QuickSort−Ale(A,q+1,r) Consumo esperado de tempo?

Basta contar o número esperado de comparações na linha 4 do Particione.

(12)

Quicksort aleatorizado

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

3 devolvaParticione(A,p,r) QuickSort-Ale(A,p,r)

1 sep<r

2 entãoq←Particione-Alea(A,p,r) 3 QuickSort−Ale(A,p,q−1) 4 QuickSort−Ale(A,q+1,r)

Consumo esperado de tempo?

Basta contar o número esperado de comparações na linha 4 do Particione.

(13)

Quicksort aleatorizado

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

3 devolvaParticione(A,p,r) QuickSort-Ale(A,p,r)

1 sep<r

2 entãoq←Particione-Alea(A,p,r) 3 QuickSort−Ale(A,p,q−1) 4 QuickSort−Ale(A,q+1,r) Consumo esperado de tempo?

Basta contar o número esperado de comparações na linha 4 do Particione.

(14)

Quicksort aleatorizado

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

3 devolvaParticione(A,p,r) QuickSort-Ale(A,p,r)

1 sep<r

2 entãoq←Particione-Alea(A,p,r) 3 QuickSort−Ale(A,p,q−1) 4 QuickSort−Ale(A,q+1,r) Consumo esperado de tempo?

(15)

Consumo esperado de tempo

Basta contar o número esperado de comparações na linha 4 do Particione.

Particione(A,p,r)

1 x←A[r] xé o “pivô”

2 i←p−1

3 paraj←patér−1faça 4 seA[j]≤x

5 entãoi←i+1 6 A[i]↔A[j] 7 A[i+1]↔A[r]

8 devolvai+1

(16)

Consumo de tempo esperado

SuponhaA[p. .r]permutação de 1. .n.

Xab = número de comparações entrea eb na linha 4 doParticionedo QuickSort-Ale;

Queremos calcular

X = total de comparações“A[j]≤x”

=

n1

¼

a=1 n

¼

b=a+1

Xab

(17)

Consumo de tempo esperado

Supondoa<b, Xab =

( 1 se primeiro pivô em{a, . . . ,b|} éa oub 0 caso contrário

Qual a probabilidade deXab valer 1?

Pr{Xab=1| }= 1

b−a+1+ 1

b−a+1 = E[Xab]

X=

n1

¼

a=1

¼n

b=a+1

Xab E[X] =????

(18)

Consumo de tempo esperado

Supondoa<b, Xab =

( 1 se primeiro pivô em{a, . . . ,b|} éa oub 0 caso contrário

Qual a probabilidade deXab valer 1?

Pr{Xab=1| }= 1

b−a+1+ 1

b−a+1 = E[Xab]

X=

n1

¼

a=1

¼n

b=a+1

Xab E[X] =????

(19)

Consumo de tempo esperado

Supondoa<b, Xab =

( 1 se primeiro pivô em{a, . . . ,b|} éa oub 0 caso contrário

Qual a probabilidade deXab valer 1?

Pr{Xab=1| }= 1

b−a+1+ 1

b−a+1 = E[Xab]

X =

n1

¼

a=1

¼n

b=a+1

Xab E[X] =????

(20)

Consumo de tempo esperado

E[X] =

n1

¼

a=1 n

¼

b=a+1

E[Xab]

=

n1

¼

a=1

¼n

b=a+1

Pr{Xab=1}

=

n1

¼

a=1 n

¼

b=a+1

2 b−a+1

=

n1

¼

a=1 na

¼

k=1

2 k+1

< 2

n1

¼

a=1

1

2+· · ·+1n

< 2n(Hn−1) < 2n lnn

(21)

Consumo de tempo esperado

E[X] =

n1

¼

a=1 n

¼

b=a+1

E[Xab]

=

n1

¼

a=1

¼n

b=a+1

Pr{Xab=1}

=

n1

¼

a=1 n

¼

b=a+1

2 b−a+1

=

n1

¼

a=1 na

¼

k=1

2 k+1

< 2

n1

¼

a=1

1

2+· · ·+1n

< 2n(Hn−1) < 2n lnn

(22)

Consumo de tempo esperado

E[X] =

n1

¼

a=1 n

¼

b=a+1

E[Xab]

=

n1

¼

a=1

¼n

b=a+1

Pr{Xab=1}

=

n1

¼

a=1 n

¼

b=a+1

2 b−a+1

=

n1

¼

a=1 na

¼

k=1

2 k+1

< 2

n1

¼

a=1

1

2+· · ·+1n

< 2n(Hn−1) < 2n lnn

(23)

Consumo de tempo esperado

E[X] =

n1

¼

a=1 n

¼

b=a+1

E[Xab]

=

n1

¼

a=1

¼n

b=a+1

Pr{Xab=1}

=

n1

¼

a=1 n

¼

b=a+1

2 b−a+1

=

n1

¼

a=1 na

¼

k=1

2 k+1

< 2

n1

¼

a=1

1

2+· · ·+1n

< 2n(Hn−1) < 2n lnn

(24)

Consumo de tempo esperado

E[X] =

n1

¼

a=1 n

¼

b=a+1

E[Xab]

=

n1

¼

a=1

¼n

b=a+1

Pr{Xab=1}

=

n1

¼

a=1 n

¼

b=a+1

2 b−a+1

=

n1

¼

a=1 na

¼

k=1

2 k+1

< 2

n1

¼

a=1

1

2+· · ·+n1

< 2n(Hn−1) < 2n lnn

(25)

Consumo de tempo esperado

E[X] =

n1

¼

a=1 n

¼

b=a+1

E[Xab]

=

n1

¼

a=1

¼n

b=a+1

Pr{Xab=1}

=

n1

¼

a=1 n

¼

b=a+1

2 b−a+1

=

n1

¼

a=1 na

¼

k=1

2 k+1

< 2

n1

¼

a=1

1

2+· · ·+n1

< 2n(Hn−1) < 2n lnn

(26)

Conclusões

O consumo de tempo esperado do algoritmo QuickSort-AleéO(nlogn).

Doexercício 7.4-4 do CLRStemos que

O consumo de tempo esperado do algoritmo QuickSort-AleéÊ(nlogn).

(27)

Prática

1. Eliminar recursão de cauda e começar pela “metade menor”, para economizar pilha.

2. Parar a recursão quandon chega num certo ponto (n≈10). No final, fazer uma passada doORDENA-POR-INSERÇÃO.

3. TimSort. Algo parecido, mas baseado noMergeSort. Usado no python.

Não está em livros ainda, mas está na Wikipedia e no código do python, super-explicado.

(28)

Prática

1. Eliminar recursão de cauda e começar pela “metade menor”, para economizar pilha.

2. Parar a recursão quandon chega num certo ponto (n≈10). No final, fazer uma passada doORDENA-POR-INSERÇÃO.

3. TimSort. Algo parecido, mas baseado noMergeSort. Usado no python.

Não está em livros ainda, mas está na Wikipedia e no código do python, super-explicado.

(29)

Prática

1. Eliminar recursão de cauda e começar pela “metade menor”, para economizar pilha.

2. Parar a recursão quandon chega num certo ponto (n≈10). No final, fazer uma passada doORDENA-POR-INSERÇÃO.

3. TimSort. Algo parecido, mas baseado noMergeSort. Usado no python.

Não está em livros ainda, mas está na Wikipedia e no código do python, super-explicado.

(30)

Prática

1. Eliminar recursão de cauda e começar pela “metade menor”, para economizar pilha.

2. Parar a recursão quandon chega num certo ponto (n≈10). No final, fazer uma passada doORDENA-POR-INSERÇÃO.

3. TimSort. Algo parecido, mas baseado noMergeSort. Usado no python.

Não está em livros ainda, mas está na Wikipedia e no código do python, super-explicado.

(31)

Prática

1. Eliminar recursão de cauda e começar pela “metade menor”, para economizar pilha.

2. Parar a recursão quandon chega num certo ponto (n≈10). No final, fazer uma passada doORDENA-POR-INSERÇÃO.

3. TimSort. Algo parecido, mas baseado noMergeSort. Usado no python. Não está em livros ainda, mas está na Wikipedia e no código do python, super-explicado.

(32)

k -ésimo menor elemento

CLRS 9

(33)

k -ésimo menor

Problema:Encontrar ok-ésimo menor elemento deA[1. .n].

SuponhaA[1. .n]sem elementos repetidos.

Exemplo:33é o4ºmenor elemento de:

1 10

22 99 32 88 34 33 11 97 55 66 A

1 4 10

11 22 32 33 34 55 66 88 97 99 ordenado

(34)

Mediana

Medianaé ojn+1

2

k-ésimo menor ou oln+1

2

m-ésimo menor elemento.

Exemplo:a mediana é34ou55:

1 10

22 99 32 88 34 33 11 97 55 66 A

1 5 6 10

11 22 32 33 34 55 66 88 97 99 ordenado

(35)

k -ésimo menor

RecebeA[1. .n]ek tal que 1≤k ≤n

e devolve valor dok-ésimo menor elemento deA[1. .n].

SELECT-ORD(A,n,k) 1 ORDENE(A,n) 2 devolvaA[k]

O consumo de tempo doSELECT-ORDéÊ(nlgn).

Dá para fazer melhor?

(36)

k -ésimo menor

RecebeA[1. .n]ek tal que 1≤k ≤n

e devolve valor dok-ésimo menor elemento deA[1. .n].

SELECT-ORD(A,n,k) 1 ORDENE(A,n) 2 devolvaA[k]

O consumo de tempo doSELECT-ORDéÊ(nlgn).

(37)

Menor

Recebe um vetorA[1. .n]e devolve o valor domenorelemento.

MENOR(A,n) 1 menor←A[1]

2 parak ←2atén faça 3 seA[k]<menor

4 entãomenor←A[k] 5 devolvamenor

O consumo de tempo do algoritmoMENORéÊ(n).

(38)

Segundo menor

Recebe um vetorA[1. .n]e devolve o valor dosegundo menor elemento, supondon≥2.

SEG-MENOR(A,n)

1 menor←min{A[1],A[2]} segmenor←max{A[1],A[2]} 2 parak ←3atén faça

3 seA[k]<menor

4 entãosegmenor←menor 5 menor←A[k] 6 senão seA[k]<segmenor 7 entãosegmenor←A[k] 8 devolvasegmenor

(39)

Algoritmo linear?

Será que conseguimos fazer umalgoritmo linear para a mediana?

para ok-ésimo menor?

Sim!

Usaremos oParticionedoQuickSort!

(40)

Algoritmo linear?

Será que conseguimos fazer umalgoritmo linear para a mediana?

para ok-ésimo menor?

Sim!

Usaremos oParticionedoQuickSort!

(41)

Select aleatorizado

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

3 devolvaParticione(A,p,r) Select-Alea(A,p,r,k)

1 sep=rentão devolvaA[p]

2 q←Particione-Alea(A,p,r) 3 sek=q−p+1

4 então devolvaA[q] 5 sek<q−p+1

6 então devolvaSelect-Alea(A,p,q−1,k)

7 senão devolvaSelect-Alea(A,q+1,r,k−(q−p+1))

Consumo esperado de tempo?

X=número de comparações noParticione-Alea

(42)

Select aleatorizado

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

3 devolvaParticione(A,p,r) Select-Alea(A,p,r,k)

1 sep=rentão devolvaA[p]

2 q←Particione-Alea(A,p,r) 3 sek=q−p+1

4 então devolvaA[q] 5 sek<q−p+1

6 então devolvaSelect-Alea(A,p,q−1,k)

7 senão devolvaSelect-Alea(A,q+1,r,k−(q−p+1))

X=número de comparações noParticione-Alea

(43)

Select aleatorizado

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

3 devolvaParticione(A,p,r) Select-Alea(A,p,r,k)

1 sep=rentão devolvaA[p]

2 q←Particione-Alea(A,p,r) 3 sek=q−p+1

4 então devolvaA[q] 5 sek<q−p+1

6 então devolvaSelect-Alea(A,p,q−1,k)

7 senão devolvaSelect-Alea(A,q+1,r,k−(q−p+1))

(44)

Quebrar em fases

KT13.5

Umafaseé uma sucessão de chamadas recursivas

a fase muda quando o tamanho do vetor cai de pelo menos 3/4 Na fasek, o tamanho do vetor é≤3

4

k

n SeXk é o número de chamadas da fasek, vale

X ≤¼

k0

Xk 3

4 k

n

Logo,

E(X)≤n¼

k0

E(Xk) 3

4 k

(45)

Quebrar em fases

KT13.5

Umafaseé uma sucessão de chamadas recursivas

a fase muda quando o tamanho do vetor cai de pelo menos 3/4

Na fasek, o tamanho do vetor é≤3

4

k

n SeXk é o número de chamadas da fasek, vale

X ≤¼

k0

Xk 3

4 k

n

Logo,

E(X)≤n¼

k0

E(Xk) 3

4 k

(46)

Quebrar em fases

KT13.5

Umafaseé uma sucessão de chamadas recursivas

a fase muda quando o tamanho do vetor cai de pelo menos 3/4 Na fasek, o tamanho do vetor é≤3

4

k

n

SeXk é o número de chamadas da fasek, vale

X ≤¼

k0

Xk 3

4 k

n

Logo,

E(X)≤n¼

k0

E(Xk) 3

4 k

(47)

Quebrar em fases

KT13.5

Umafaseé uma sucessão de chamadas recursivas

a fase muda quando o tamanho do vetor cai de pelo menos 3/4 Na fasek, o tamanho do vetor é≤3

4

k

n SeXk é o número de chamadas da fasek, vale

X ≤¼

k0

Xk 3

4 k

n

Logo,

E(X)≤n¼

k0

E(Xk) 3

4 k

(48)

Quebrar em fases

KT13.5

Umafaseé uma sucessão de chamadas recursivas

a fase muda quando o tamanho do vetor cai de pelo menos 3/4 Na fasek, o tamanho do vetor é≤3

4

k

n SeXk é o número de chamadas da fasek, vale

X ≤¼

k0

Xk 3

4 k

n

Logo,

E(X)≤n¼

k0

E(Xk) 3

4 k

(49)

Quebrar em fases

KT13.5

Umafaseé uma sucessão de chamadas recursivas

a fase muda quando o tamanho do vetor cai de pelo menos 3/4 Na fasek, o tamanho do vetor é≤3

4

k

n SeXk é o número de chamadas da fasek, vale

X ≤¼

k0

Xk 3

4 k

n

Logo,

E(X)≤n¼

k0

E(Xk) 3

4 k

(50)

Com pivô sortudo

Suponha que cada pivô caia na faixa boa

25% 50% 25%

a chamada recursiva faz mudar de fase.

Difícil dar sorte sempre, mas quanto tempo precisa esperar?

(51)

Com pivô sortudo

Suponha que cada pivô caia na faixa boa

25% 50% 25%

a chamada recursiva faz mudar de fase.

Difícil dar sorte sempre, mas quanto tempo precisa esperar?

(52)

Com pivô sortudo

Suponha que cada pivô caia na faixa boa

25% 50% 25%

a chamada recursiva faz mudar de fase.

Difícil dar sorte sempre, mas quanto tempo precisa esperar?

(53)

Um pouco mais de probabilidade

Considere uma sequência de sorteios debomoumau, onde a probabilidade debomép>0 a cada sorteio.

quantos sorteios em média para aparecer o primeirobom?

X =instante do primeiro sorteio favorável Pr[X=j] = (1−p)j1p

E(X) =¼

j1

jPr[X =j] =¼

j1

j(1−p)j1p

≤p

¼

j=1

j(1−p)j1= 1 p

(54)

Um pouco mais de probabilidade

Considere uma sequência de sorteios debomoumau, onde a probabilidade debomép>0 a cada sorteio.

quantos sorteios em média para aparecer o primeirobom? X =instante do primeiro sorteio favorável

Pr[X=j] = (1−p)j1p

E(X) =¼

j1

jPr[X =j] =¼

j1

j(1−p)j1p

≤p

¼

j=1

j(1−p)j1= 1 p

(55)

Um pouco mais de probabilidade

Considere uma sequência de sorteios debomoumau, onde a probabilidade debomép>0 a cada sorteio.

quantos sorteios em média para aparecer o primeirobom? X =instante do primeiro sorteio favorável

Pr[X=j] = (1−p)j1p

E(X) =¼

j1

jPr[X =j] =¼

j1

j(1−p)j1p

≤p

¼

j=1

j(1−p)j1= 1 p

(56)

Um pouco mais de probabilidade

Considere uma sequência de sorteios debomoumau, onde a probabilidade debomép>0 a cada sorteio.

quantos sorteios em média para aparecer o primeirobom? X =instante do primeiro sorteio favorável

Pr[X=j] = (1−p)j1p

E(X) =¼

j1

jPr[X =j] =¼

j1

j(1−p)j1p

≤p

¼

j=1

j(1−p)j1= 1 p

(57)

Um pouco mais de probabilidade

Considere uma sequência de sorteios debomoumau, onde a probabilidade debomép>0 a cada sorteio.

quantos sorteios em média para aparecer o primeirobom? X =instante do primeiro sorteio favorável

Pr[X=j] = (1−p)j1p

E(X) =¼

j1

jPr[X =j] =¼

j1

j(1−p)j1p

≤p

¼

j=1

j(1−p)j1= 1 p

(58)

Terminando

Para um pivô cair na faixa boa,p=1/2. Logo, onúmero esperadode sorteios para que o tamanho do vetor caia por 3/4 é≤2.

Da análise anterior,

E(X)≤n

¼

k0

E(Xk) 3

4 k

≤2n¼

k0

3 4

k

≤8n

(59)

Terminando

Para um pivô cair na faixa boa,p=1/2. Logo, onúmero esperadode sorteios para que o tamanho do vetor caia por 3/4 é≤2.

Da análise anterior,

E(X)≤n¼

k0

E(Xk) 3

4 k

≤2n¼

k0

3 4

k

≤8n

(60)

Conclusões

O consumo de tempo esperado do algoritmoSelect-Alea éO(n).

(61)

Próxima aula

CLRS Cap 6Heapsort

Referências

Documentos relacionados

Fica convencionado que serão liberados da prestação de serviço pelo prazo de 2 (dois) dias por mês, com salário pago pelas empresas, desde que estas sejam notificadas com

A metodologia de avaliação visual EPM (Estrutura, Precocidade e Musculosidade) foi desenvolvida recentemente, e são poucos os trabalhos que estimaram parâmetros

Os estudos originais encontrados entre janeiro de 2007 e dezembro de 2017 foram selecionados de acordo com os seguintes critérios de inclusão: obtenção de valores de

Considerando uma avaliação de qualidade de forma quantitativa e classificatória, na variável de dados relevantes da realidade, utilizados para medidas serem

O Quicksort é um algoritmo do tipo dividir para conquistar para ordenação cujo tempo de execução no pior caso é O(n 2 ) sobre uma seqüência de entrada de n números.. Apesar

ambos favorecem uma postura vindicacionista dos Estados Unidos, favorável à intervenção unilateral para a mudança de regimes. O fato é que essa agenda determinada

Para tanto, foi necessário debater sobre cidades pequenas, urbanização, centro e centralidade, como também o histórico da cidade e a dinâmica atual do

Além disso, estudos que contemplam a situação de saúde da equipe de enfermagem são vastos; entretanto, ainda são necessárias pesquisas que subsidiem a visão dos