Prévia do material em texto
PPGI/200
9
Prof. Lucídio Cabral - Estrutura de Dados e Complexidade de Algoritmo
s
1
Crescimento de Funções
Análise de AlgoritmosAnálise de Algoritmos
– tempo de processamento em função dos dados de
entrada;
– espaço de memória total requerido para os dados;
– comprimento total do código;
– correcta obtenção do resultado pretendido;
– robustez (como comporta-se com as entradas
inválidas ou não previstas).
– quantidade de "trabalho" necessária para a sua
execução, expressa em função das operações
fundamentais, as quais variam de acordo com o
algoritmo, e em função do volume de dados.
Complexidade
• Porquê o estudo da Complexidade?
– Performance
• Escolher entre vários algoritmos o mais eficiente
para implementar;
• Desenvolver novos algoritmos para problemas que
já têm solução;
• Desenvolver algoritmos mais eficientes (melhorar os
algoritmos), devido ao aumento constante do
"tamanho" dos problemas a serem resolvidos.
– Complexidade Computacional - torna possível
determinar se a implementação de determinado
algoritmo é viável.
Complexidade
• Tipos de Complexidade
– Espacial
• Este tipo de complexidade representa, por exemplo, o
espaço de memória usado para executar o algoritmo.
– Temporal
• Este tipo de complexidade é o mais usado podendo
dividir-se em dois grupos:
– Tempo (real) necessário à execução do algoritmo.
(como podemos medir?)
– Número de instruções necessárias à execução.
• Medidas de Análise
– Devem ser independentes da tecnologia
(hardware/software)
– Modelos Matemáticos simplificados baseados nos fatores
relevantes:
• Tempo de Execução
Uma função que relaciona o tempo de execução com o
tamanho de entrada:
t = F(n)
– Conjunto de operações a serem executadas.
– Custo associado à execução de cada operação.
• Ocupação de Espaço em Memória
Analise de Algoritmos
Complexidade
• Exemplo
– Sejam 5 algoritmos A1 a A5 para resolver um mesmo
problema, de complexidades diferentes. (Supomos que
uma operação leva 1 ms para ser efetuada.)
– Tk(n) é a complexidade ou seja o número de operações
que o algoritmo efetua para n entradas
n A1
T1(n)= n
A2
T2(n)=nlog n
A3
T3(n)=n2
A4
T4(n)=n3
A5
T5(n)=2n
16 0.016s 0.064s 0.256s 4s 1m4s
32 0.032s 0.16s 1s 33s 46 Dias
512 0.512s 9s 4m22s 1 Dia 13h 10137 Séculos
tempo necessário para o algoritmo em função de n entradas
Operações primitivas
• Atribuição de valores a variáveis
• Chamadas de métodos
• Operações aritméticas
• Comparação de dois números
• Acesso a elemento de um array
• Seguir uma referência de objeto (acesso a
objeto)
• Retorno de um método
Complexidade de
Algoritmos
• Complexidade de pior caso – big-Oh g(n)
• Complexidade de melhor caso – big-Omega g(n)
– de uso bem menos freqüente
– em algumas situações específicas
• Complexidade de caso médio – big-Theta g(n)
– menos utilizada apesar de importante
– difícil conhecer a distribuição de probabilidades das diferentes
entradas
Notações assintóticas
Limite assintótico apertado ou exato
Limite assintótico superior
Limite assintótico inferior
Limite superior que não é
assintoticamente apertado
Limite inferior que não é
assintoticamente apertado
Por que as notações assintóticas são importantes?
• Elas fornecem uma caracterização simples da eficiência de um
algoritmo.
• Elas permitem a comparaçãode desempenho entre vários algoritmos.
• Para valores elevados de componentes/entradas, as constantes
multiplicativas e termos de baixa ordem de um tempo de execução
exato são dominados pelo efeito do tamanho de entrada (o número
de componentes).
– O tempo de execução de uma algoritmo sobre uma entrada particular, é o número de operações
primitivas ou “passos” executados.
– O tamanho da entrada depende problema sendo estudado. Mas na maioria dos casos este é o
número de itens na entrada, por exemplo: o número total de bits.
Resumindo, em geral, quando observamos tamanhos de entrada
suficientemente grandes para tornar a ordem de crescimento do
tempo de execução relevante para um algoritmo, nós estamos
estudando a eficiência assintótica de um algoritmo.
E um algoritmo que é assintoticamente mais eficiente será
efetivamente a melhor escolha. Isto pode não ser verdade para
todas as entradas consideradas pequenas!
Limite assintótico
apertado ou exato
OBS:
Limite assintótico
apertado ou exato
Eg.
Limite assintótico apertado
ou exato
Eg.
Limite assintótico superior
Limite assintótico superior
Qual melhor algoritmo?
• Sejam A e B dois algoritmos que o
resolvem o problema P, cujos tempos de
execução são
TA(n) e TB(n)
• comportamento assintótico – tamanho da
entrada arbitrariamente grande
– caracterizado pela notação O (big O)
Diagrama
Definição do Big-Oh
Ordens mais comuns
Fonte: Sahni, "Data Structures, Algorithms and Applications in C++"
log n
n
n2
2n
n
f
n log n
1
(linear)
(quadrática)
(exponencial)
(logarítmica)
(constante)
Alguns conceitos
• T (n) = O (1) : constante
• T (n) = O (log log n) : super-rápido
• T (n) = O (log n) : logarítmico – muito bom
• T (n) = O (n) : linear – toda a entrada é visitada
• T (n) = O (n log n) : limite de muitos problemas
• T (n) = O (n2) : quadrático
• T (n) = O (nk) : polinomial no tamanho da entrada
• T (n) = O (kn), O (n!), O (nn) : exponencial – ruim!
Teoremas
1. Comportamento assintótico da soma de duas
funções cujos comportamentos assintóticos
particulares são conhecidos:
Se f1(n) = O(g1(n)) e f2(n) = O(g2(n)), então:
f1(n) + f2(n) = O(max(g1(n)) , g2(n)))
2. O(k f(n)) = O(f(n))
3. O(f(n)) O(g(n)) = O(f(n) g(n))
Eficiência de um Algoritmo, mais um
exemplo
Três algoritmo para calcular
1 + 2 + … n para um n > 0
Eficiência de um Algoritmo
Número de operações necessárias
O(n) O(n2) O(1)
A notação
f(n) = 8n + 128 é O (n2)?
f(n) c.n2 ?
• Seja c =1
8n + 128 n2, então
0 n2 – 8n – 128
0 (n – 16)(n+8) n0 = 16
c =1, no = 16, f (n) c.n2 para todo n n0
A notação
• A função atua como um limite superior
assintótico da função f
– f = n2 -1 f = (n2)
– f = n2 -1 f = (n3)
– f = 403 f = (1)
– f = 5+2logn +3log2n f =
(log2n)
– f = 5+2 log n +3log2n f = (n)
– f = 5.2n +5n10 f = (2n)
Limite assintótico inferior
Limite superior que não é
assintoticamente apertado
Limite inferior que não é
assintoticamente apertado
Notações assintóticas em equações
Relações de Funções Assintóticas
Limites podem ser usados para
determinar a ordem de complexidade
c então f (n) = ( g (n)) se c > 0
se lim f (n) / g (n) = 0 or c > 0 então f (n) = ( g(n))
or c > 0então f (n) = ( g (n))n
Exemplo usando limites
22
3
2
3
23
3lim5lim35lim
,que dado )(35
n
n
n
n
n
nn
nnn
nnn
Regra de L’Hopital
Se f(x) e g(x) são ambas funções diferenciáveis
com derivadas f’(x) e g’(x), respectivamente, e
se
existe direita a limite o que sempre
)('
)('lim
)(
)(lim
então )(lim)(lim
xg
xf
xg
xf
xfxg
xx
xx
Exemplos usando limites
0
1
/1lim
)'(
)'(loglim
HopitalL' de Regra a Use?loglimloglim
,que dado )(log
103lim10lim310lim
,que dado )(310
2
2
33
3
3
3
33
n
n
n
n
n
n
nn
nOnn
n
n
n
n
n
nn
nnnn
e
n
e
n
e
n
e
nnn
Exemplo usando limites
lg ( )
lg ln
ln
lg )' ln
ln
lim lg lim (lg )'
'
lim
ln
n O n
n n n n
n
n
n
n nn n n
2 2
1
2
0
( '= 1
nln2
Exemplo usando limites
n O
e
e e
n kn
k k n k
k
n n
n n n n
n
k
n n
k
n
n
k
n n n k
)' ( ln
lim lim
ln
lim ( )
ln
... lim !
ln
ln
ln ln
n( )2
2
2 2 2
2 2 2
1
2 2 2 2
0
2
2 2
1
2
2
onde k é uma constante inteira positiva
( )'= ln2
Slide 1
Slide 2
Slide 3
Slide 4
Slide 5
Slide 6
Slide 7
Slide 8
Slide 9
Slide 10
Slide 11
Slide 12
Slide 13
Slide 14
Slide 15
Slide 16
Slide 17
Slide 18
Slide 19
Slide 20
Slide 21
Slide 22
Slide 23
Slide 24
Slide 25
Slide 26
Slide 27
Slide 28
Slide 29
Slide 30
Slide 31
Slide 32
Slide 33
Slide 34
Slide 35
Slide 36