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
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)
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
C
ASO AC
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 DEF
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
C
LASSES DEF
UNÇÃO9 polinomial (quadrática, cúbica,...)
linear
constante
logarítmica exponencial
Cada classe é caracterizada por uma família diferente de curva
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
C
ÁLCULO DO TEMPO: I
DÉIAP
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ÁLISEA
SSINTÓTICAÉ uma ferramenta para ajudar a estruturar nosso pensamento
Eficiência assintótica:
entradas grandes
N
OTAÇÃOA
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
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
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 AN
OTAÇÃO
Remova os termos de ordem mais baixa
Ignore as constantes da ordem mais alta
Exemplo
7n4+5n2+890 ∈ (n4)
E
XERCÍCIO1
Qual o das funções abaixo?
8
5n2+8
7n7+5n2+8
7n.logn + 5n
21
E
XERCÍCIO2
E
XERCÍCIO3
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;
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++)
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)+)
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
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ÍCIO4
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]
E
XERCÍCIO4
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ÍCIO4
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
N
OTAÇÃOA
SSINTÓTICA EME
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çõesn
2+2n =
(n
2)+n
função anônima, significando qualquer função em (n2)
E
XERCÍCIO1
E
XERCÍCIO2
A afirmação n = Θ(2n+5) é verdadeira?
Justifique.
37
E
XERCÍCIO3
Qual a interpretação de Θ(n)+Θ(n)=Θ(n)?
E
XERCÍCIO4
A afirmação Θ(n) = Θ(n2) é verdadeira ou falsa?
39
N
OTAÇÃOO (
UPPER BOUNDS)
Intuição
n
T(n) c.g(n)
f(n)
n
g(n) é um limite
N
OTAÇÃOO (
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ÇÃODOB
IG-O
0 20 40 60 80 100 120 140
1 2 3 4 5
tamanho da entrada
T(
n
)
n
0f(n) = n
2+10
5.g(n) =
5.
n
2E
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ÍCIO1
Qual o O das funções abaixo?
890
5n2+890
7n7+5n2+890
E
XERCÍCIO2
Indique pelo menos 5 funções que ∈ O(n3).
45
E
XERCÍCIO3
log2n ∈ O(n)?
log2n ∈Θ(n)?
n2 ∈ O(2n)?
n2 ∈Θ(2n)?
3n+1 ∈ O(5n+10)?
E
XERCÍCIO4
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ÍCIO4
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
E
XERCÍCIO5
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)
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,
E
XERCÍCIO1
Qual o ordem das funções abaixo?
890
5n2+890
7n5+5n2+890
7nlogn+5n
53
E
XERCÍCIO2
E
XERCÍCIO3
log n ∈(n)?
logn ∈(n)?
logn ∈ O(n)?
n2 ∈(2n)?
n2 ∈(2n)?
n2 ∈O(2n)?
55
g(n)
h(n)
f(n)
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
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ÍCIO1
Qual o o das funções abaixo?
890
5n2+890
7n7+5n2+890
E
XERCÍCIO2
Indique pelo menos 5 funções que ∈ o(n3).
61
E
XERCÍCIO3
log2n ∈ o(n)?
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
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ÍCIO1
Qual o ω das funções abaixo?
5n2+890
7n5+5n2+890
E
XERCÍCIO2
Indique pelo menos 5 funções que ∈ ω(n3).
67
E
XERCÍCIO3
R
ELAÇÃO ENTREN
OTAÇÕES69
(
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) nT(n) c.g(n)
f(n)
n
T(n) c2g(n)
f(n)
c1g(n)
n0
P
ROPRIEDADES DASC
LASSES DEF
UNÇÕES71
T
RABALHANDO COM LIMITES73
E
XERCÍCIO1
O o ω
5n2+8
7n4+5n2 +8
E
XERCÍCIO3
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ÍCIO4
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); }