Buscar

Análise de Algoritmos (intro)

Prévia do material em texto

04/05/2020
1
ANÁLISE DE
ALGORITMOS
Aspectos Teóricos da 
Computação
Prof. Leandro Fernandes
Baseado nos materiais de
- Souza, Silva, Lee, Rezende, Miyazawa (Unicamp), - Ribeiro (FCUP) e - Mariani (UFSC)
Motivações 
para realizar 
Análise de 
Algoritmos
• Provar a “corretude” de um algoritmo.
• Estimar a quantidade de recursos 
(tempo, memória) necessária a 
execução do algoritmo (tarefa da análise 
de complexidade).
• Aprender técnicas e ideias gerais sobre 
o projeto de algoritmos.
• Estratégias: divisão e conquista, algoritmos 
gulosos, programação dinâmica, ...
• Compreender melhor um tema 
recorrente, que é a natureza recursiva 
de vários problemas diferentes.
• Entender a dificuldade intrínseca a 
inúmeros problemas, que implica na 
inexistência de soluções eficientes para 
eles.
1
2
04/05/2020
2
Os custos de um algoritmo ...
• Pode se relacionar a diversos 
fatores:
• Tempo de execução
• Utilização de memória principal
• Utilização de disco
• Consumo de energia
• etc...
• Medidas importantes em outros 
contextos:
• Legibilidade do código
• Custo de implementação
• Portabilidade
• Extensibilidade
• etc...
Análise de Complexidade de Algoritmos
Problemas 
Tratáveis e 
Intratáveis
• Dizemos que um algoritmo resolve um 
determinado problema quando, para 
qualquer entrada, produz uma resposta 
correta.
• Observe que mesmo sendo capaz de resolver 
o problema, um algoritmo pode não ser 
aceitável em termos práticos por demandar 
muito espaço e/ou tempo.
• Um problema é considerado intratável se não 
existir um algoritmo para ele cuja demanda 
de recursos computacionais seja razoável.
3
4
04/05/2020
3
Algoritmos
O que é um algoritmo 
(computacional)?
• Informalmente, um algoritmo é um 
procedimento computacional bem 
definido que:
• recebe um conjunto de valores como 
entrada,
• produz um conjunto de valores como 
saída,
• através de uma sequência de passos 
em um modelo computacional.
• Equivalentemente, um algoritmo é 
uma ferramenta para resolver um 
problema computacional. Este 
problema define a relação precisa 
que deve existir entre a entrada e a 
saída do algoritmo.
Exemplos de problemas e suas instâncias
Problema: Teste de Primalidade
• Tarefa: Determinar se um dado 
número é primo.
• Entrada: 9411461
• Saída: é primo.
• Entrada: 8411461
• Saída: não é primo.
Problema: Ordenação
• Tarefa: Um vetor 𝐴[1…𝑛] é 
crescente se 𝐴[1] ≤ ⋯ ≤ 𝐴[𝑛]. 
Rearranjar um vetor 𝐴[1…𝑛] de 
modo que fique crescente.
• Entrada:
1 n
[33|55|33|44|33|22|11|99|22|55|77]
• Saída:
1 n
[11|22|22|33|33|33|44|55|55|77|99]Uma instância de um problema é um 
conjunto de valores que servem como 
entrada para ele
5
6
04/05/2020
4
Problemas reais de interesse atual...
• Calcular as rotas dos caminhões de entrega de uma 
distribuidora de produtos no estado de São Paulo, 
minimizando os custos de transporte (vehicle routing).
• Calcular o número mínimo de containers necessários 
para transportar um conjunto de caixas com produtos 
(bin packing 3D).
• Calcular a localização e a quantidade mínima de antenas 
de celulares de modo a garantir a cobertura de sinal 
uma certa região geográfica (facility location).
• Dentre vários outros... É importante identificar quando estamos 
lidando com algum problema NP-Difícil.
Algoritmos e Tecnologia
Condição ideal:
• Os computadores têm 
velocidade de processamento e 
capacidade de memória 
infinitos.
• Neste caso, qualquer algoritmo 
é igualmente bom e, por 
conseguinte, esta disciplina seria 
inútil.
O mundo real:
• Há computadores com 
velocidade de processamento na 
ordem de bilhões de instruções 
por segundo e trilhões de bytes 
em memória.
• Mas ainda assim há um limite na 
velocidade de processamento e 
de memória nos computadores.
• Desta forma faz muita diferença ter um bom algoritmo. ô.Ô
7
8
04/05/2020
5
Algoritmos e Tecnologia
• Problema: Ordenação de um vetor de 𝑛 elementos.
• Considere dois computadores, C1 e C2, tal que:
• C1 executa 1 bilhão de instruções por segundo (10
9);
• C2 executa 10 milhões de instruções por segundo (10
7). 
• Suponha dois algoritmos de ordenação:
• Algoritmo 1: implementado por um excelente programador em linguagem de 
máquina (ultrarrápida) para rodar em C1. O código resultante executa 2𝑛
2 instruções.
• Algoritmo 2: implementado por um programador mediano, em linguagem de alto 
nível e usando um compilador “meia-boca” para rodar em C2. O código resultante 
executa 50𝑛 log 𝑛 instruções.
• O que esperar quando ordenamos um vetor de um milhão de elementos? 
Algoritmos e Tecnologia
Algo1 (ling. ultrarrápida) em C1 (+veloz)
• Dados:
• A1: executa 2𝑛
2 instr.
• C1: realiza 10
9 instr/s
• Tempo:
• 𝐴1 =
2(106)2 𝑖𝑛𝑠𝑡𝑟
109 𝑖𝑛𝑠𝑡𝑟/𝑠
= 2. 103𝑠
Algo2 (mediano, poo) em C2 (+lenta)
• Dados:
• A2: executa 50𝑛 log 𝑛 instr.
• C2: realiza 10
7 instr/s
• Tempo:
• 𝐴2 =
50.106 log 106 𝑖𝑛𝑠𝑡𝑟
107 𝑖𝑛𝑠𝑡𝑟/𝑠
= 30𝑠
• Com 10 milhões de números e utilizando o computador mais rápido (C1), o 
algoritmo A1 demoraria 2,3 dias processando, enquanto o algoritmo A2
levaria apenas 20 minutos para concluir esse mesmo trabalho.
9
10
04/05/2020
6
Os custos de um algoritmo ...
• Consideremos um computador com velocidade de 1 THz (terahertz)
• i.e, 1024 vezes mais rápido que um computador de 1 GHz
f(n) n = 20 n = 40 n = 60 n = 80 n = 100
n 2,0x10−11 seg 4,0x10−11 seg 6,0x10−11 seg 8,0x10−11 seg 1,0x10−10 seg
n2 4,0x10−10 seg 1,6x10−9 seg 3,6x10−9 seg 6,4x10−9 seg 1,0x10−8 seg
n3 8,0x10−9 seg 6,4x10−8 seg 2,2x10−7 seg 5,1x10−7 seg 1,0x10−6 seg
n5 2,2x10−6 seg 1,0x10−4 seg 7,8x10−4 seg 3,3x10−3 seg 1,0x10−2 seg
2n 1,0x10−6 seg 1,0 seg 13,3 dias 1,3x105 séc 1,4x1011 séc
3n 3,4x10−3 seg 140,7 dias 1,3x107 séc 1,7x1019 séc 5,9x1028 séc
Muito investimento, pouco retorno!
• Considere o tempo como um elemento fixo, quanto mais podemos 
computar aumentando a velocidade de processamento da máquina?
• A hipótese é perfeitamente plausível, afinal o dia só tem 24 horas!
f(n) Comp. atual 100x mais rápido 1000x mais rápido
n N1 100 x N1 1000 x N1
n2 N2 10 x N2 31,6 x N2
n3 N3 4,64 x N3 10 x N3
n5 N4 2,5 x N4 3,98 x N4
2n N5 N5 + 6,64 N5 + 9,97
3n N6 N6 + 4,19 N6 + 6,29
11
12
04/05/2020
7
Algoritmos e Tecnologia (Conclusões)
• O uso de um algoritmo adequado pode levar a ganhos extraordinários 
de desempenho.
• Isso pode ser tão importante quanto o projeto de hardware.
• A melhora obtida pode ser tão significativa que não poderia ser 
obtida simplesmente com o avanço da tecnologia.
• As melhorias nos algoritmos produzem avanços em outros 
componentes básicos das aplicações (pense nos compiladores, 
buscadores na internet, datamining, visão computacional, games, 
simuladores, etc).
Curvas de 
funções e 
taxas de 
crescimento
0
2
4
6
8
10
12
14
16
18
20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
cte
log n
n½
n
n . log n
n²
n³
13
14
04/05/2020
8
Funções e Taxas de crescimento (por grupos)
0
2
4
6
8
10
12
14
16
18
20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Funções sublineares
cte
log n
n½
n
0
10
20
30
40
50
60
70
80
90
100
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Funções Superlineares
n
n . log n
n²
n³
15

Continue navegando