Upload
internet
View
106
Download
2
Embed Size (px)
Citation preview
PPGI/2009
Prof. Lucídio Cabral - Estrutura de Dados e Complexidade de Algoritmos
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 1m4s32 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
n22n
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!
Teoremas1. 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
3lim
5lim
35lim
,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
01
/1lim
)'(
)'(loglim
HopitalL' de Regra a Use?log
limlog
lim
,que dado )(log
103
lim10
lim310
lim
,que dado )(310
2
2
33
3
3
3
33
n
n
nn
n
n
nn
nOnn
n
n
n
n
n
nn
nnn
n
e
n
e
n
e
n
e
nnn
Exemplo usando limites
lg ( )
lgln
lnlg )'
ln
ln
limlg
lim(lg )'
'lim
ln
n O n
nn
nn
n
n
n
n nn n n
2 2
1
20
( '=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 limln
lim( )
ln... lim
!
ln
ln
ln ln
n( )2
2
2 2 2
2 2 2
1
2 2 2 20
2
2 2
1
2
2
onde k é uma constante inteira positiva
( )'= ln2