• Nenhum resultado encontrado

Análise de Algoritmos

N/A
N/A
Protected

Academic year: 2022

Share "Análise de Algoritmos"

Copied!
68
0
0

Texto

(1)

Análise de Algoritmos

(2)

• Quicksort (ordenação rápida)

No pior caso é (n

2

)

Na prática a eficiência na média é muito boa

O tempo de execução esperado (n log n)

Os fatores ocultos na notação (n log n) são pequenos

Funciona bem em ambientes de memória virtual

www.nakamura.eti.br/eduardo Análise de Algoritmos 2

(3)

• Dividir

O arranjo A[p..r] é particionado em dois subarranjos

(possivelmente vazios) A[p..q-1] e A[q+1..r] tais que cada elemento de A[p..q-1] é menor que A[q] que, por sua vez, é igual ou menor a cada elemento de A[q+1..r]. O índice q é calculado como parte do procedimento

• Conquistar

Os dois subarranjos A[p..q-1] e A[q+1..r] são ordenados por chamadas recursivas

• Combinar

Os arranjos são ordenados localmente, não há a necessidade de combinação

www.nakamura.eti.br/eduardo Análise de Algoritmos 3

(4)

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

• Para ordenar um arranjo A, a chamada inicial seria

▫ QUICKSORT(A,1,n)

• Onde está o pulo do gato?

www.nakamura.eti.br/eduardo Análise de Algoritmos 4

(5)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

• O PARTITION sempre seleciona um elemento x=A[r] como um pivô

• O particionamento do arranjo A[p..r] é feito em torno do pivô x

www.nakamura.eti.br/eduardo Análise de Algoritmos 5

(6)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 6

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

(7)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 7

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

i i i i i i i i i

(8)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 8

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(9)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 9

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j j

(10)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 10

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(11)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 11

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(12)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 12

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(13)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 13

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(14)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 14

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(15)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 15

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(16)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 16

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(17)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 17

1 2 3 4 5 6 7 8

A 2 8 7 1 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(18)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 18

1 2 3 4 5 6 7 8

A 2 1 7 8 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(19)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 19

1 2 3 4 5 6 7 8

A 2 1 7 8 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(20)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 20

1 2 3 4 5 6 7 8

A 2 1 7 8 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(21)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 21

1 2 3 4 5 6 7 8

A 2 1 7 8 3 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(22)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 22

1 2 3 4 5 6 7 8

A 2 1 3 8 7 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(23)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 23

1 2 3 4 5 6 7 8

A 2 1 3 8 7 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(24)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 24

1 2 3 4 5 6 7 8

A 2 1 3 8 7 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(25)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 25

1 2 3 4 5 6 7 8

A 2 1 3 8 7 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(26)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 26

1 2 3 4 5 6 7 8

A 2 1 3 8 7 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(27)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 27

1 2 3 4 5 6 7 8

A 2 1 3 8 7 5 6 4

p r

i i i i i i i i i

j j j j j j j j

(28)

PARTITION(A,1,n)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

www.nakamura.eti.br/eduardo Análise de Algoritmos 28

1 2 3 4 5 6 7 8

A 2 1 3 4 7 5 6 8

p r

i i i i i i i i i

j j j j j j j j

(29)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

10: trocar(A[i+1],A[r]);

11: return i+1;

• A cada iteração do loop (linhas 3 – 8), para

qualquer k

▫ Se p  k  i, então A[k]  x

▫ Se i < k < j, então A[k] > x

▫ Se k = r, então A[k] = x

▫ Se j  k < r, então A[k] não foi avaliado ainda

www.nakamura.eti.br/eduardo Análise de Algoritmos 29

p i j r

xx

não avaliado

x

(30)

PARTITION(A,p,r) 1: x  A[r];

2: i  p-1;

3: for j  p to r-1 do 4: if A[j]  x then 6: i  i+1;

7: trocar(A[i],A[j]);

8: end if 9: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 30

 

1

 

1

 vezes

1 n r-p  

(31)

www.nakamura.eti.br/eduardo Análise de Algoritmos 31

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

1 2 3 4 5 6 7 8

A 85 24 63 45 17 31 96 50

(32)

www.nakamura.eti.br/eduardo Análise de Algoritmos 32

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

(33)

www.nakamura.eti.br/eduardo Análise de Algoritmos 33

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

1 2 3 4 5 6 7 8

A 24 45 17 31 50 85 63 96

(34)

www.nakamura.eti.br/eduardo Análise de Algoritmos 34

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

(35)

www.nakamura.eti.br/eduardo Análise de Algoritmos 35

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

1 2 3 4 5 6 7 8

A 24 45 17 31 50 85 63 96

(36)

www.nakamura.eti.br/eduardo Análise de Algoritmos 36

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

(37)

www.nakamura.eti.br/eduardo Análise de Algoritmos 37

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

1 2 3 4 5 6 7 8

A 24 17 31 45 50 85 63 96

(38)

www.nakamura.eti.br/eduardo Análise de Algoritmos 38

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

(39)

www.nakamura.eti.br/eduardo Análise de Algoritmos 39

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

1 2 3 4 5 6 7 8

A 17 24 31 45 50 85 63 96

(40)

www.nakamura.eti.br/eduardo Análise de Algoritmos 40

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

(41)

www.nakamura.eti.br/eduardo Análise de Algoritmos 41

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

1 2 3 4 5 6 7 8

A 17 24 31 45 50 85 63 96

(42)

www.nakamura.eti.br/eduardo Análise de Algoritmos 42

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

(43)

www.nakamura.eti.br/eduardo Análise de Algoritmos 43

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

1 2 3 4 5 6 7 8

A 17 24 31 45 50 85 63 96

(44)

www.nakamura.eti.br/eduardo Análise de Algoritmos 44

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

(45)

www.nakamura.eti.br/eduardo Análise de Algoritmos 45

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

1 2 3 4 5 6 7 8

A 17 24 31 45 50 85 63 96

(46)

www.nakamura.eti.br/eduardo Análise de Algoritmos 46

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

(47)

www.nakamura.eti.br/eduardo Análise de Algoritmos 47

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

1 2 3 4 5 6 7 8

A 17 24 31 45 50 85 63 96

(48)

www.nakamura.eti.br/eduardo Análise de Algoritmos 48

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

(49)

www.nakamura.eti.br/eduardo Análise de Algoritmos 49

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

1 2 3 4 5 6 7 8

A 17 24 31 45 50 85 63 96

(50)

www.nakamura.eti.br/eduardo Análise de Algoritmos 50

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

(51)

www.nakamura.eti.br/eduardo Análise de Algoritmos 51

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

1 2 3 4 5 6 7 8

A 17 24 31 45 50 63 85 96

(52)

www.nakamura.eti.br/eduardo Análise de Algoritmos 52

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

(53)

• O desempenho do Quicksort depende da qualidade do particionamento

Pior caso: totalmente desbalanceado

Melhor caso: totalmente balanceado

• Particionamento balanceado

Custo de mesma ordem que o Mergesort

• Particionamento desbalanceado

Custo de mesma ordem que o Insertionsort

www.nakamura.eti.br/eduardo Análise de Algoritmos 54

(54)

• O pior balanceamento é quando o particionamento produz

Subproblema de n-1 elementos

Outro com 0 elementos

Ocorre quando o pivô é o maior (ou o menor) elemento do arranjo

www.nakamura.eti.br/eduardo Análise de Algoritmos 55

(55)

• Quando isso ocorre sempre (recursivamente), temos

www.nakamura.eti.br/eduardo Análise de Algoritmos 56

) ( )

0 ( )

1

(n T n

T

T(n)    ) ( )

1 ( )

1

(n n

T   

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

3: QUICKSORT(A,p,q-1);

4: QUICKSORT(A,q+1,r);

6: end if

) ( )

1

(n n

T  

 

2

)

(n n

T  

(56)

• Na divisão mais balanceada possível, o PARTITION produz dois subproblemas de tamanho igual

www.nakamura.eti.br/eduardo Análise de Algoritmos 57

 

2 ( )

2T n n

T(n) 

QUICKSORT(A,p,r) 1: if p < r then

2: q  PARTITION(A,p,r);

(57)

• No caso médio, o PARTITION produz uma mistura de divisões BOAS e RUINS

As divisões boas e ruins são divididas aleatoriamente

• Para efeitos de intuição

Suponha que as divisões boas sejam as do melhor caso e as divisões ruins sejam as do pior caso

www.nakamura.eti.br/eduardo Análise de Algoritmos 58

(58)

www.nakamura.eti.br/eduardo Análise de Algoritmos 59

n

0 n-1

(n-1)/2-1 (n-1)/2

(59)

www.nakamura.eti.br/eduardo Análise de Algoritmos 60

. . . .

. . . .

. . . .

n

0 n-1

(n-1)/2-1 (n-1)/2

(n-1)/4-1 (n-1)/4 0 (n-1)/2-2

)

(n

)

(n

)

(n )

(n

) (logn O

) log (

)

(n O n n

T

(60)

• Os algoritmos vistos compartilham uma propriedade

A seqüência ordenada é obtida apenas usando comparações entre os elementos de entrada

Esta classe de algoritmos chama-se ordenação por

comparação

• Pertencem a esta classe

Bubblesort

www.nakamura.eti.br/eduardo Análise de Algoritmos 61

(61)

• Nenhum algoritmo de ordenação por comparação pode ser melhor do que (n log n)

Para provar isso é necessário montar uma árvore de

decisão

• A cada dois elementos a

i

, a

j

,

Precisamos definir quem é o menor

Fazemos a comparação a

i

 a

j

www.nakamura.eti.br/eduardo Análise de Algoritmos 62

(62)

www.nakamura.eti.br/eduardo Análise de Algoritmos 63

a1  a3

 a

 >

 >

> 

7, 9, 4

a1  a2

a2  a3

(63)

www.nakamura.eti.br/eduardo Análise de Algoritmos 64

a1  a3

a2  a3

a1, a2, a3

a1, a3, a2

a2, a1, a3

a2, a3, a1 a3, a2, a1

 >

>

>

>

> 

7, 9, 4

a1  a2

a1  a3

a3, a1, a2

7  9

a2  a3

(64)

www.nakamura.eti.br/eduardo Análise de Algoritmos 65

a1  a3

 a

 >

 >

> 

7, 9, 4

a1  a2

7  9

a2  a3

9  4

(65)

www.nakamura.eti.br/eduardo Análise de Algoritmos 66

a1  a3

a2  a3

a1, a2, a3

a1, a3, a2

a2, a1, a3

a2, a3, a1 a3, a2, a1

 >

>

>

>

> 

7, 9, 4

a1  a2

a1  a3

a3, a1, a2

7  9

a2  a3

9  4

7  9

(66)

www.nakamura.eti.br/eduardo Análise de Algoritmos 67

a1  a3

a2  a3

a1, a2, a3 a2, a1, a3

 >

 >

> 

7, 9, 4

a1  a2

a1  a3

7  9

a2  a3

9  4

7  4

(67)

• O número de folhas (f) da árvore corresponde a todas as possíveis permutações do arranjo

f = n!

• O número de folhas (f) de uma árvore binária de altura h é no máximo 2

h

f  2

h

• Logo

n!  2h

 h  log(n!)  h  (n log n)  h = (n log n)

• No pior caso o custo será altura da árvore!

www.nakamura.eti.br/eduardo Análise de Algoritmos 68

(68)

• Qual valor de q o PARTITION retorna quando todos os elementos do arranjo A[p..r] são iguais?

• Modifique o PARTITION para que q = (p+r) / 2 quando todos os elementos do arranjo A[p..r] são iguais

www.nakamura.eti.br/eduardo Análise de Algoritmos 69

Referências

Documentos relacionados

Assim, o objetivo desse artigo é reconstruir a relação que Heidegger faz entre liberdade e fundamento em dois momentos: mostrar como a liberdade é um modo de ser fundamental

91 • RÁDIO - Desatarraxe os dois parafusos, como indicado na figura, para retirá-lo e colocar as pilhas.. 92 • Usando uma ferramenta, levante a parte alta do fechamento frontal

O agora está sendo muito confuso e complicado, estou vivenciando coisas que nunca pensei que passaria, tanto boas como ruins, me reaproximei de pessoas que

esquece completamente das coisas boas e fixa-se somente nas ruins. E isso acontece principalmente quando estamos passando por problemas; nos esquecemos de tudo o

Acredita-se que as pessoas são julgadas pelos seus feitos em vida, sendo direcionadas ao paraíso ou ao inferno de acordo com o nível de ações boas ações ou ruins, além

Trata-se da canção de abertura do 3º ato da opereta sertaneja homônima representada no Teatro Recreio em março de 1921.. Desta opereta, há também no Acervo Digital Chiquinha

● Alguns grandes usuários de embalagens como alimentos, medicamentos/vitaminas, alguns produtos de higiene pessoal e produtos de limpeza, apresentaram crescimento, principalmente,

2º prego, no peito, que vare um ao outro, dizendo a seguinte invocação: Fulano (o nome da pessoa a quem se quer fazer o mal), eu, (citar o próprio nome), te juro, debaixo do poder