You are on page 1of 32

Complexidade de Algoritmos

Introdução

Christian Azambuja Pagot


Professor
Complexidade de Algoritmos
• Algoritmos.
• Medidas de Eficiência.
• Análise de Complexidade.
• Notações para as Complexidades.
• Algoritmos e Técnicas Algorítmicas.
– Algoritmos de ordenação, classificação, etc.
– Métodos gulosos.
– Programação dinâmica.
– Divisão e conquista.
• Intratabilidade.
Método de Avaliação
• Prova 1 (P1) (9ª aula)
• Prova 2 (P2) (19ª aula), não cumulativa
• Exercícios complementares ao longo do semestre
• Trabalho Final (TF) (entrega na18ª aula)
• Nota final: (P1 + P2 + TF) / 3
• Exame (20ª aula)
• N >= 7 (aprovado), 3<=N<7 (exame), N<3
(reprovado)
Bibliografia Básica
• CORMEN, Thomas H. et al. Algoritmos:
teoria e prática. Rio de Janeiro, RJ: Campus,
2002.
• TOSCANI, Laira Vieira; VELOSO, Paulo A.
S. . Complexidade de algoritmos: análise,
projeto e métodos. Porto Alegre, RS: Sagra
Luzzatto, 2002. (Livros didáticos ;Número
13.)
Dúvidas?
Algoritmos
• Algoritmo: é um procedimento computacional
bem definido:
– Entrada.
– Passos seqüenciais.
– Saída.
Problema Computacional
• Problema que pode ser solucionado por um
algoritmo.
Problemas Computacionais Básicos
• Ordenação
• Multiplicação de matrizes
• Caminhar em um grafo
• Cálculo de intersecções
• Etc...
Outros Problemas Computacionais
• Projeto Genoma: localizar ~100.000 genes
em ~3 bilhões de bases.
• Pesquisa na Internet: Google, Bing, etc.
• Comércio eletrônico
– Criptografia, hash, assinatura digital, etc.
• Maximização / minimização
• Simulações
Problema Computacional
• Geralmente problemas computacionais
podem ser resolvidos por diversos
algoritmos!
• Exemplo: Oclusão (computação gráfica)
– BSP (Binary space partitioning)
– Ray Tracing
– Z-Buffer
Problema Computacional
• Outro exemplo: solução de sistemas lineares:
Instância de um problema
• É uma determinada entrada de um algoritmo.
• Exemplo: instância de um problema de
ordenação
– # de itens a ser ordenado
– Ordenamento parcial
– Restrições nos valores dos itens
– Dispositivo de armazenamento (RAM, disco, fitas,
etc.)
Medida de Eficiência
• Memória
• Largura de banda
• Hardware
• TEMPO !!!

Título > Subtítulo > Nome slide


NP-Completo
• Não tem solução eficiente
• Não existe prova que não exista solução
eficiente
• Se existir solução eficiente para um, existirão
para todos os outros
• Exemplo: TSP

Título > Subtítulo > Nome slide


Premissas para Análise de
Algoritmos
• Um processador seqüencial
• RAM: Random Access Machine
• Sem execuções concorrentes
• Sem hierarquia de memórias
• Instruções simples
– Exemplos: sem branches, exponenciação, etc.

Título > Subtítulo > Nome slide


“Tamanho” da entrada
• # de itens na entrada
• Multiplicação: # de bits dos operandos
• Caminhamento: grafos, com # de nós e # de
arestas

Título > Subtítulo > Nome slide


Tempo de Execução
• Sobre uma determinada entrada
• # de passos ou instruções primitivas
executadas

Título > Subtítulo > Nome slide


Exemplo: Insertion Sort

Insertion_Sort(A)

1 for j=2 to len(A)


2 do key = A[j]
3 i = j-1
4 while i>0 and A[i] > key
5 do A[i+1] = A[i]
6 i=i-1
7 A[i+1] = key
Insertion Sort

i j
Insertion_Sort(A) A = [5,2,4,6,1,3]
key = 2
1 for j=2 to 6
2 do key = A[j]
3 i = j-1
4 while i>0 and A[i] > key
5 do A[i+1] = A[i] A = [2,5,4,6,1,3]
6 i=i-1
7 A[i+1] = key
Insertion Sort

i j
Insertion_Sort(A) A = [2,5,4,6,1,3]
key = 4
1 for j=2 to 6
2 do key = A[j]
3 i = j-1
4 while i>0 and A[i] > key
5 do A[i+1] = A[i] A = [2,4,5,6,1,3]
6 i=i-1
7 A[i+1] = key
Insertion Sort

i j
Insertion_Sort(A) A = [2,4,5,6,1,3]
key = 6
1 for j=2 to 6
2 do key = A[j]
3 i = j-1
4 while i>0 and A[i] > key
5 do A[i+1] = A[i]
6 i=i-1
7 A[i+1] = key
Insertion Sort

i j
Insertion_Sort(A) A = [2,4,5,6,1,3]
key = 1
1 for j=2 to 6
2 do key = A[j]
i
3 i = j-1 A = [2,4,5,6,1,3]
4 while i>0 and A[i] > key i
5 do A[i+1] = A[i] A = [2,4,5,6,6,3]
6 i=i-1 i
7 A[i+1] = key A = [2,4,5,5,6,3]
i
A = [2,4,4,5,6,3]
i
A = [2,2,4,5,6,3]
i
A = [1,2,4,5,6,3]
Insertion Sort: Complexidade

Insertion_Sort(A) Custo Tempo

1 for j=2 to len(A) c1 n


2 do key = A[j] c2 n-1
3 i = j-1 c3 n-1
4 while i>0 and A[i] > key  nj 2 t j
c4
5 do A[i+1] = A[i]  nj  2 (t j  1)
c5
6 i=i-1  nj  2 (t j  1)
c6
7 A[i+1] = key
c7 n-1
Insertion Sort: Complexidade
Custo Tempo
• Custo total T(n):
c1 n
c2 n-1
c3 n-1
 nj 2 t j
c4
 nj 2 (t j  1)
c5
 nj 2 (t j  1)
c6
c7 n-1
T (n)  c1n  c2 (n  1)  c3 (n  1)  c4  nj  2 t j  c5  nj 2 (t j  1)  c6  nj  2 (t j  1)  c7 (n  1)
Insertion Sort: Complexidade
• O melhor caso é quando a lista está ordenada
(tj=0).
Insertion_Sort(A) Custo Tempo

1 for j=2 to len(A) c1 n


2 do key = A[j] c2 n-1
3 i = j-1 c3 n-1
4 while i>0 and A[i] > key c4 n-1
5 do A[i+1] = A[i] c5
6 i=i-1
c6
7 A[i+1] = key
c7 n-1
T (n)  c1n  c2 (n  1)  c3 (n  1)  c4 (n  1)  c7 (n  1)
 (c1  c2  c3  c4  c7 )n  (c2  c3  c4  c7 )
Insertion Sort: Complexidade
• O melhor caso é quando a lista já está
ordenada (tj=0).

T (n)  (c1  c2  c3  c4  c7 )n  (c2  c3  c4  c7 )


a  c1  c2  c3  c4  c7
b  c2  c3  c4  c7
T (n)  an  b
Insertion Sort: Complexidade
• O pior caso é quando a lista está invertida
(tj=j):
Insertion_Sort(A) Custo Tempo

1 for j=2 to len(A) c1 n


2 do key = A[j] c2 n-1
3 i = j-1 c3 n-1
4 while i>0 and A[i] > key  nj  2 j
c4
5 do A[i+1] = A[i]  nj  2 ( j  1)
c5
6 i=i-1  nj  2 ( j  1)
c6
7 A[i+1] = key
c7 n-1
Insertion Sort: Complexidade
• O pior caso é quando a lista está invertida
(tj=j):
n(n  1)
n
n(n  1)
 ( j  1) 
n

 j
2
1
j 2 2
Custo Tempo j 2

c1 n
c2 n-1
c3 n-1 T (n)  c1n  c2 (n  1)  c3 (n  1) 
 nj  2 j
c4  n(n  1)   n(n  1)   n(n  1) 
 nj  2 ( j  1) c4   1  c5    c6    c7 (n  1)
c5  2   2   2 
 nj  2 ( j  1)
c6
c7 n-1
Insertion Sort: Complexidade
• O pior caso é quando a lista está invertida
(tj=j):
 n(n  1)   n( n  1)   n(n  1) 
T (n)  c1n  c2 ( n  1)  c3 (n  1)  c4   1  c5    c6    c7 (n  1)
 2   2   2 
c c c   c c c 
T (n)   4  5  6 n 2   c1  c2  c3  4  5  6  c7 n  (c2  c3  c4  c7 )
2 2 2  2 2 2 
c c c
a 4  5  6
2 2 2
c c c
b  c1  c2  c3  4  5  6  c7
2 2 2
c  c2  c3  c4  c7
T (n)  an 2  bn  c
Insertion Sort: Complexidade
• Melhor caso:
T ( n)  an  c  (n)

• Pior caso:
T (n)  an 2  bn  c  (n 2 )
Insertion Sort: Complexidade
• Como seria o caso médio (vetor parcialmente
ordenado)?
Próxima aula...
• Merge Sort
– Baseado em divisão e conquista.
– Complexidade menor que o Insert Sort.
– Recursivo

You might also like