• Nenhum resultado encontrado

E STRUTURAS DED ADOSE A LGORITMOS C

N/A
N/A
Protected

Academic year: 2019

Share "E STRUTURAS DED ADOSE A LGORITMOS C"

Copied!
38
0
0

Texto

(1)

ESTRUTURAS DE DADOS E

ALGORITMOS

COMPLEXIDADE E NOTAÇÃO

ASSINTÓTICA

Adalberto Cajueiro

(adalberto@computacao.ufcg.edu.br) Departamento de Sistemas e Computação Universidade Federal de Campina Grande 1

R

ECAPITULANDO

É importante não só ter uma

máquina

boa, mas também um

(2)

P

ERGUNTAS PERTINENTES

 Como representar e estudar o tempo de execução

dos algoritmos?

 Como classificar os diversos algoritmos de acordo

com seus tempos de execução?

 O quão eficiente é um algoritmo?

3

P

ONTOS A CONSIDERAR

 Intruções sequenciais

 Uso de abstração (identificar termos mais

significantes nas fórmulas)

(3)

P

ONTOS A CONSIDERAR

 Tempo de execução = número de passos

executados

 Cada linha é executada em um tempo constante

 O número de repeticoes de cada linha é que será relevante na complexidade!!!

5

(4)

C

ASO A

C

ONSIDERAR

 Pior Caso

 É um limite superior do tempo de execucao de um algoritmo

 Ocorre frequentemente

 O caso médio é frequentemente tao ruim quanto o pior caso

7

C

LASSES DE

F

UNÇÃO

 O tempo de execucao é uma função da entrada

 Cada funcao tem uma taxa de crescimento

 Uso de agrupamento de funcoes. Funcoes de

(5)

C

LASSES DE

F

UNÇÃO

9 polinomial (quadrática, cúbica,...)

linear

constante

logarítmica exponencial

Cada classe é caracterizada por uma família diferente de curva

(6)

E

XERCÍCIO

 Ordene as funções por ordem de crescimento

 n5+132n2

 3n+12

 8900

 45log(n)

 45log(n).n

 132n2

11

E

XERCÍCIO

 Se tivermos dois algoritmos que ordenam elementos. O

Alg 1 pertence a classe n2 e Alg 2 pertence a classe

(7)

C

ÁLCULO DO TEMPO

: I

DÉIA

P

RINCIPAL

Ignore constantes relacionadas ao hardware

 Foco

 Crescimento da função quando n → infinito

 Análise Assintótica

 Exemplo

13

O tempo de execução cresce proporcionalmente

(polinomialmente, exponencialmente, logaritmicamente, etc.) a n

Foco!!!

A

NÁLISE

A

SSINTÓTICA

É uma ferramenta para ajudar a estruturar nosso pensamento

Eficiência assintótica:

entradas grandes

(8)

N

OTAÇÃO

A

SSINTÓTICA

 Descreve o tempo de execução assintótica de um

algoritmo

15

N

OTAÇÃO

 Intuição

n

T(n) c2g(n)

f(n)

c1g(n)

n

g(n) é um limite

(9)

N

OTAÇÃO

 Intuição

17

(g(n)) = {f(n) | c1>0, c2>0, n0>0,

0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) n ≥ n0} n

T(n) c2g(n)

f(n)

c1g(n)

n0

g(n) é um limite

assintoticamente restrito para f(n)

- Se f(n) (g(n)) então dizemos que f(n) cresce tão rapidamente quanto g(n)!

- g(n) é um limitante assintótico justo (apertado) para f(n)

N

OTAÇÃO

 Intuição

(g(n)) = {f(n) | c1>0, c2>0, n0>0,

0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) n ≥ n0} n

T(n) c2g(n)

f(n)

c1g(n)

n0

g(n) é um limite

(10)

E

XEMPLO

 f(n) = 7n4+5n2+10 e g(n) = n4  c1 = 7 > 0

 c2 = 22 > 0

 0 ≤ 7n4 ≤ 7n4+5n2+10 22n4

 Logo, concluímos que:

 7n4+5n2+10 (n4)

19

Θ(g(n)) = {f(n) |  c1>0, c2>0, n0>0,

0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) n ≥ n0}

c1g(n) f(n) c2g(n)

L

IDANDO COM A

N

OTAÇÃO

Remova os termos de ordem mais baixa

Ignore as constantes da ordem mais alta

 Exemplo

 7n4+5n2+890 ∈ (n4)

(11)

E

XERCÍCIO

1

 Qual o  das funções abaixo?

 8

 5n2+8

 7n7+5n2+8

 7n.logn + 5n

21

E

XERCÍCIO

2

(12)

E

XERCÍCIO

3

 Justifique:

 5n2+8n ∈ (n) ?

 7n7+5n2+8 ∈(n7) ?

 7log n ∈(n) ?

23

R

ECAPITULANDO

 Algoritmo do cálculo de potência de 2

long potencia(int n) { long r = 1;

for (int i=1; i<=n; i++) r=2*r;

(13)

R

ECAPITULANDO

 Algoritmo do cálculo de potência de 2

25

long potencia(int n) {

c1 +

for (int i=1; i<=n; i++) r=2*r;

return r; }

R

ECAPITULANDO

 Algoritmo do cálculo de potência de 2

long potencia(int n) {

c1 +

for (c1 + i<=n; i++)

(14)

R

ECAPITULANDO

 Algoritmo do cálculo de potência de 2

27

long potencia(int n) {

c1 +

for (c1 + n*c2 + i++)

r=2*r; return r; }

R

ECAPITULANDO

 Algoritmo do cálculo de potência de 2

long potencia(int n) {

c1 +

for (c1 + n*c2 + c3*(n-1)+)

(15)

R

ECAPITULANDO

 Algoritmo do cálculo de potência de 2

29

long potencia(int n) {

c1 +

for (c1 + n*c2 + c3*(n-1)+)

n*c4 +

return r; }

R

ECAPITULANDO

 Algoritmo do cálculo de potência de 2

long potencia(int n) {

c1 +

for (c1 + n*c2 + c3*(n-1)+)

n*c4 +

c5

(16)

R

ECAPITULANDO

 Algoritmo do cálculo de potência de 2

31

f(n) = n

f(n) =

(n)

simplificando... Complexidade do algoritmo

long potencia(int n) {

c1 +

for (c1 + n*c2 + c3*(n-1)+)

n*c4 +

c5

}

f(n) = 2*c1 + c2*n + c3*(n-1) + n*c4 + c5

E

XERCÍCIO

4

 Qual a complexidade  do algoritmo abaixo?

public static int soma(int[] A) { int soma = 0;

for(int i=0;i<A.length;i++) soma+=A[i]

(17)

E

XERCÍCIO

4

 Qual a complexidade  do algoritmo abaixo?

33

public static int soma(int[] A) { int soma = 0;

for(int i=0;i<A.length;i++) soma+=A[i] return soma; } c c n*c

E

XERCÍCIO

4

 Qual a complexidade  do algoritmo abaixo?

public static int soma(int[] A) { int soma = 0;

for(int i=0;i<A.length;i++) soma+=A[i]

return soma; }

f(n) = n

f(n) =

(n)

c

(18)

N

OTAÇÃO

A

SSINTÓTICA EM

E

QUAÇÕES

 Abusos da notação matemática que podem facilitar o entendimento em alguns casos

35

n

2

+2n =

(n

2

)

Conjunto de funções

n

2

+2n =

(n

2

)+n

função anônima, significando qualquer função em (n2)

E

XERCÍCIO

1

(19)

E

XERCÍCIO

2

 A afirmação n = Θ(2n+5) é verdadeira?

Justifique.

37

E

XERCÍCIO

3

 Qual a interpretação de Θ(n)+Θ(n)=Θ(n)?

(20)

E

XERCÍCIO

4

 A afirmação Θ(n) = Θ(n2) é verdadeira ou falsa?

39

N

OTAÇÃO

O (

UPPER BOUNDS

)

 Intuição

n

T(n) c.g(n)

f(n)

n

g(n) é um limite

(21)

N

OTAÇÃO

O (

UPPER BOUNDS

)

 Intuição

41

O(g(n)) = {f(n) | c>0, n0>0,

0 ≤ f(n) ≤ c g(n) n ≥ n0} n

T(n) c.g(n)

f(n)

n0

g(n) é um limite

assintótico superior para f(n)

I

NTUIÇÃODO

B

IG

-O

0 20 40 60 80 100 120 140

1 2 3 4 5

tamanho da entrada

T(

n

)

n

0

f(n) = n

2

+10

5.g(n) =

5.

n

2

(22)

E

XEMPLO

 Comparar f(n) = 7n4+5n2+10 com g(n) = n4

 0 ≤ 7n4+5n2+10 22n4, c = 22 > 0

 Logo, concluímos que:

 7n4+5n2+10 O(n4)

 f(n) = 7n4+5n2+10 com g(n) = n5

 0 ≤ 7n4+5n2+10 22n5, c = 22 > 0

 Logo, concluímos que:

 7n4+5n2+10 O(n5) 43

O(g(n)) = {f(n) | c>0, n0>0,

0 ≤ f(n) ≤ c g(n)  n ≥ n0}

E

XERCÍCIO

1

 Qual o O das funções abaixo?

 890

 5n2+890

 7n7+5n2+890

(23)

E

XERCÍCIO

2

 Indique pelo menos 5 funções que ∈ O(n3).

45

E

XERCÍCIO

3

 log2n ∈ O(n)?

 log2n ∈Θ(n)?

 n2 ∈ O(2n)?

 n2 ∈Θ(2n)?

 3n+1 ∈ O(5n+10)?

(24)

E

XERCÍCIO

4

 Qual a complexidade O do algoritmo abaixo?

47

public static int soma(int[] A) { int soma = 0;

for(int i=0;i<A.length;i++) soma+=A[i]

return soma; }

E

XERCÍCIO

4

 Qual a complexidade O do algoritmo abaixo?

public static int soma(int[] A) { int soma = 0;

for(int i=0;i<A.length;i++) soma+=A[i]

return soma; }

c

(25)

E

XERCÍCIO

5

 Qual a complexidade

O dos algoritmos ao

lado no pior caso?

 Vocês conhecem

algum algoritmo assintoticamente mais eficiente?

49

boolean primo(int n) { if (n==2) return true; for (int i=2; i<n; i++) if (n%i==0) return false; return true; }

boolean primo(int n) { if (n==2) return true; for (int i=2; i<=n/2; i++) if (n%i==0)

return false; return true; }

N

OTAÇÃO

(

LOWER BOUNDS

)

 Intuição

(g(n)) = {f(n) | c>0, n0>0,

0 ≤ cg(n) ≤ f(n) n ≥ n0} n T(n)

f(n)

cg(n)

n0

g(n) é um limite

assintótico inferior para f(n)

(26)

N

OTAÇÃO

(

LOWER BOUNDS

)

 Intuição

51

(g(n)) = {f(n) | c>0, n0>0,

0 ≤ cg(n) ≤ f(n) n ≥ n0} n T(n)

f(n)

cg(n)

n0

g(n) é um limite

assintótico inferior para f(n)

E

XEMPLO

 f(n) = 7n4+5n2+10 e g(n) = n4

 0 ≤7n4≤ 7n4+5n2+10, c = 7 > 0

 Logo, concluímos que:

4 2 ∈  4

(g(n)) = {f(n) | c>0, n0>0,

(27)

E

XERCÍCIO

1

 Qual o ordem  das funções abaixo?

 890

 5n2+890

 7n5+5n2+890

 7nlogn+5n

53

E

XERCÍCIO

2

(28)

E

XERCÍCIO

3

 log n ∈(n)?

 logn ∈(n)?

 logn ∈ O(n)?

 n2 ∈(2n)?

 n2 ∈(2n)?

 n2 ∈O(2n)?

55

g(n)

h(n)

f(n)

(29)

N

OTAÇÃO O

 Intuição

57

o(g(n)) = {f(n) | para qualquer c>0, existe n0>0,

0 ≤ f(n) < c g(n) para todo n ≥ n0} n

T(n) c.g(n)

f(n)

n0

g(n) é um limite

superior que não é assintoticamente

restrito para f(n)

- Se f(n)  o(g(n)) então dizemos que f(n) cresce mais lentamente que g(n)!

N

OTAÇÃO O

 Intuição

o(g(n)) = {f(n) | para qualquer c>0, existe n0>0, 0 ≤ f(n) < c g(n) para todo n ≥ n0}

n

T(n) c.g(n)

f(n)

n0

g(n) é um limite

superior que não é assintoticamente

(30)

E

XEMPLO

 f(n) = 7n4+5n2+10 e g(n) = n5

 0 ≤ 7n4+5n2+10 < cn5, c > 0

 Logo, concluímos que:

 7n4+5n2+10 o(n5)

 f(n) = 7n4+5n2+10 e g(n) = n6

 0 ≤ 7n4+5n2+10 < cn6, c > 0

 Logo, concluímos que:

 7n4+5n2+10 o(n6)

59

o(g(n)) = {f(n) | para qualquer c>0, existe n0>0, 0 ≤ f(n) < c g(n) para todo n ≥ n0}

E

XERCÍCIO

1

 Qual o o das funções abaixo?

 890

 5n2+890

 7n7+5n2+890

(31)

E

XERCÍCIO

2

 Indique pelo menos 5 funções que ∈ o(n3).

61

E

XERCÍCIO

3

 log2n ∈ o(n)?

(32)

N

OTAÇÃO

ω

 Intuição

63

ω(g(n)) = {f(n) | para qualquer c>0, existe n0>0, 0 ≤ cg(n) < f(n) para todo n ≥ n0}

n T(n)

f(n)

cg(n)

n0

g(n) é um limite

inferior que não é assintoticamente restrito para f(n)

- Se f(n) ω(g(n)) então dizemos que f(n) cresce mais rapidamente que g(n)!

N

OTAÇÃO

ω

 Intuição n T(n) f(n) cg(n) n

g(n) é um limite

(33)

E

XEMPLO

 f(n) = 7n4+5n2+10 e g(n) = n3

 0 ≤ cn3< 7n4+5n2+10, c > 0

 Logo, concluímos que:

 7n4+5n2+10 ∈ ω(n3)

 f(n) = 7n4+5n2+10 e g(n) = n

 0 ≤ cn ≤ 7n4+5n2+10, c > 0

 Logo, concluímos que:

 7n4+5n2+10 ∈ ω(n)

65

ω(g(n)) = {f(n) | para qualquer c>0, existe n0>0, 0 ≤ cg(n) < f(n) para todo n ≥ n0}

E

XERCÍCIO

1

 Qual o ω das funções abaixo?

 5n2+890

 7n5+5n2+890

(34)

E

XERCÍCIO

2

 Indique pelo menos 5 funções que ∈ ω(n3).

67

E

XERCÍCIO

3

(35)

R

ELAÇÃO ENTRE

N

OTAÇÕES

69

(

g(n)) = O(g(n)) ∩

(g(n))

Upper bound Lower bound Tight bound ou

Prova: exercício pra casa!

R

ECAPITULANDO n T(n) f(n) cg(n) n

T(n) c.g(n)

f(n)

n

T(n) c2g(n)

f(n)

c1g(n)

n0

(36)

P

ROPRIEDADES DAS

C

LASSES DE

F

UNÇÕES

71

(37)

T

RABALHANDO COM LIMITES

73

E

XERCÍCIO

1

 O o  ω

5n2+8

7n4+5n2 +8

(38)

E

XERCÍCIO

3

Faça a análise do algoritmo a seguir.

75

public int fatorial(int n) { int fat = 1;

for (int i = 1; i <= n; i++) fat = fat * i;

return fat; }

E

XERCÍCIO

4

 Os algoritmos fazem

a mesma coisa?

 Qual deles é mais

eficiente? Por que?

float [] result = new float[x.length]; for(int i=0;i<x.length; i++) {

float a=0;

for(int j=0;j<=i;j++) a = a + x[j];

result[i] = (a)/(i+1); }

Referências

Documentos relacionados

 Cada elemento (nó) da lista contém um dado armazenado e um apontador para o próximo elemento da lista?.  Estrutura recursiva com

 Para algumas aplicações, skip lists são mais naturais que árvore e levam a algoritmos mais simples e fáceis de implementar..  Performance melhorada por um fator constante em

 Alguns conjuntos dinamicos pressupoem que existe uma relação de ordem entre as chaves.. Isso permite falar do próximo elemento ao invés de um elemento

 Chaves que colidam precisam ter seu hash code “recalculado” para encontrar um slot vazio?.  Todas as chaves estão em

 A alocação dinâmica é muito utilizada em problemas de estrutura de dados como por exemplo, listas encadeadas, pilhas, filas, arvores binárias e grafos ...  O interessante

f) A participação dos coordenadores pedagógicos e, se possível, da direção da escola, pode potencializar o processo de formação em serviço, na medida que tornam-se participantes

Objetivou-se com esse trabalho avaliar os indicadores externos NANOLIPE, Dióxido de titânio (TiO 2 ), e os indicadores internos matéria seca indigestível (MSi), fibra

*Com relação aos dados deste Anexo I, foram considerados aqueles na data de assinatura da respectiva Escritura de Emissão, do Termo de Securitização ou documento equivalente,