Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptx
Analise Algoritmos
1. Análise de
Algoritmos
Profa. Maria Inés Castiñeira, Dra.
Unisul – Campus Grande Florianópolis
Ciência da Computação
2. O que é um algoritmo?
Algoritmo: Sequência finita e ordenada de
instruções necessárias para a resolução
de um problema bem formulado, possível
de ser implementado em computador,
que sempre termina num determinado
período de tempo, produzindo o resultado
ou indicando a impossibilidade de
obtenção do mesmo.
Estruturas de Dados: forma ou processo
de guardar informação
3. Algoritmos e Estruturas de
Dados
Algoritmos são métodos para resolver problemas
problemas têm dados
dados são tratados (neste contexto)
computacionalmente
O Processo de organização dos dados pode
determinar a eficiência do algoritmo
algoritmos simples podem requerer estruturas de
dados complexas
algoritmos complexos podem requerer estruturas de
dados simples
Para maximizar a eficiência de um algoritmo as
estruturas de dados utilizadas têm de ser projetadas
em simultâneo com o desenvolvimento do algoritmo
4. Algoritmos: área de estudo e
pesquisa
Suficientemente antiga que os conceitos básicos e a
informação essencial são bem conhecidos
Suficientemente nova de forma a permitir novas
descobertas e novos resultados
Imensas áreas de aplicação:
Ciência (Ex: Genoma humano)
Engenharia (problemas de otimização)
Comerciais (e-commerce, logística)
Saúde (Política:distribuição de recursos escasos;
Análise e tratamento de imagens para
diagnóstico, ...)
Internet: definição de roteamento (grafos), algoritmos
de busca e indexação.
5. Porquê estudar
complexidade?
Serve para escolher entre vários algoritmos o mais
eficiente
Desenvolver algoritmos novos e mais eficazes para
problemas que já tem solução
Melhorar os algoritmos existentes
Permite saber se para um determinado problema é
viável obter o resultado com um dado algoritmo
Permite saber se para um dado problema é viável
obter o resultado para um certo número de valores de
entrada e um algoritmo determinado
6. Como analisar Algoritmos?
Para avaliar e comparar algoritmos
diversas características podem ser
utilizadas:
Tempo de execução
Memória usada (espaço)
Linhas de código
Robustez (comportamento com dados
não esperados)
Correta obtenção do resultado
Qualidade do código
8. Análise temporal
È a forma mais utilizada
Pode ser realizada de dois formas:
Tempo real: necessário para execução
do algoritmo. Como medir?
Número de instruções necessárias à
execução
9. Análise de Algoritmos
Análise precisa do tempo (medindo durante a
execução) é uma tarefa complicada:
algoritmo é implementado numa dada linguagem
linguagem é compilada e programa é executado
num dado computador
difícil prever tempos de execução de cada instrução
e antever otimizações
muitos algoritmos são "sensíveis" aos dados de
entrada
muitos algoritmos não são bem compreendidos
Medidas de análise devem ser independentes da
tecnologia (hardware/software)
Para prever o tempo de execução de um programa
apenas é necessário um pequeno conjunto de
ferramentas matemáticas
10. Complexidade de Algoritmos
A análise de algoritmos (complexidade do algoritmo)
serve para medir a quantidade de trabalho realizada
pelo algoritmo.
Essa quantidade é expressa em função de operações
fundamentais, as quais variam de acordo com o
algoritmo, e em funçao do volume de dados
Exemplo: Exiba mensagem inicial;
Abra arquivo X; Crie arquivo Xbis;
Enquanto (not FinalArquivo X ) faça:
{ Leia w em X;
Escreva w em Xbis;
}
Feche X; Feche Xbis.
Operações fundamentais? Leia w e/ou Escreva w
11. Operações primitivas ou
fundamentais
Atribuição de valor a uma variável;
Chamada de métodos
Operações aritméticas;
Comparação de dois números;
Acesso a um elemento de um array
Retorno de um método
.....
12. Análise de Algoritmos
Que dados usar?
dados reais: verdadeira medida do custo de
execução
dados aleatórios: assegura-nos que as
experiências testam o algoritmo e não
apenas os dados específicos – Caso médio
dados perversos: mostram que o
algoritmo funciona com qualquer tipo de
dados. – Pior caso!
dados benéficos: – Melhor caso
13. Dados de entrada: Pior caso
Por que é importante estudar o pior caso na
análise de algoritmos?
ele é um limite superior, nunca vai ser pior
do que isso!
Ele ocorre com bastante frequência em
alguns algoritmos (pesquisa de um item em
uma lista sendo que o item não se encontra
na lista)
Muitas vezes o caso médio é tão ruim
quanto o pior caso.
14. Medida do Tempo de
Execução de um Programa
• O projeto de algoritmos é fortemente influenciado pelo
estudo de seus comportamentos.
• Depois que um problema é analisado e decisões de
projeto são finalizadas, é necessário estudar as várias
opções de algoritmos a serem utilizados,
considerando os aspectos de tempo de execução e
espaço ocupado.
• Muitos desses algoritmos são encontrados em áreas
como pesquisa operacional, otimização, teoria dos
grafos, estatística, probabilidades, entre outras.
15. Análise: Crescimento de
Funções
O tempo de execução geralmente dependente de
um único parâmetro N
ordem de um polinômio
tamanho de um arquivo a ser processado, ordenado,
etc, ou,
medida abstrata do tamanho do problema a
considerar (usualmente relacionado com o
número de dados a processar)
Quando há mais de um parâmetro
procura-se exprimir todos os parâmetros em função
de um só
faz-se uma análise em separado para cada
parâmetro
16. Análise: Crescimento de
Funções
Os Algoritmos têm tempo de execução
proporcional a
1 - muitas instruções são executadas uma só vez ou
poucas vezes (se isto for verdade para todo o
programa diz-se que o seu tempo de execução é
constante)
logN - tempo de execução é logarítmico (cresce
ligeiramente à medida que N cresce) (quando N
duplica log N aumenta mas muito pouco; apenas
duplica quando N aumenta para N^2)
N - tempo de execução é linear. Típico quando algum
processamento é feito para cada dado de entrada.
Situação ótima quando é necessário processar N
dados de entrada, ou produzir N dados na saída.
17. Análise: Crescimento de
Funções
N log N - típico quando se reduz um problema em
sub-problemas, se resolve estes separadamente e se
combinam as soluções (se N é 1 milhão N log N é
perto de 20 milhões)
N2 - tempo de execução quadrático (típico quando é
preciso processar todos os pares de dados de
entrada) (prático apenas em pequenos problemas, ex:
produto matriz - vetor)
N3 - tempo de execução cúbico (para N = 100,
N^3 = 1 milhão, ex: produto de matrizes)
2N - tempo de execução exponencial (provavelmente de
pouca aplicação prática; típico em soluções de força
bruta) (para N = 20, 2^N = 1 milhão; N duplica,
tempo passa a ser o quadrado)
18. Tamanho de problemas que
podem ser resolvidos
Seja n a quantidade de dados que um algoritmo pode
processar. Esse algoritmo demora f(n) microssegundos (µs)
para resolver o problema.
A tabela apresenta o maior tamanho n de um problema que
pode ser resolvido no tempo t=1 segundo e tempo =1 minuto.
f(n) 1 segundo 1 minuto
Math ERROR:
ln(n) < 3 * 10^100 Muito grande!
n 1000000 60000000
n2 1000 7700
2n 20 26
n! 10 11
19. Notação "O grande"
Notação matemática que nos permite
suprimir detalhes na análise de algoritmos
g(n)=O(f(n))
g(n) é da ORDEM de
f(n)
c0.f(n) é um limite
superior para g(n) a
partir de um valor n0
20. Notação "O grande"
Definição: uma função g(N) diz-se ser
O(f(N)) se existem constantes c0 e N0 tais
que g(N) < c0 f(N) para qualquer N > N0
A notação é usada com três objetivos:
1. limitar o erro que é feito ao ignorar os
termos menores nas fórmulas matemáticas
2. limitar o erro que é feito na análise ao
desprezar parte de um programa que
contribui de forma mínima para o
custo/complexidade total
3. permitir-nos classificar algoritmos de
acordo com limites superiores no seu
tempo de execução.
21. Forma para determinação de
complexidade
Suponha o seguinte código
for (i = 0; i < N; i++) { instruções; }
contabilização do número de instruções é simples: N iterações e
em cada uma são executadas um numero constante de
instruções: O(N)
Suponha o código seguinte:
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
instruções;
}
}
contabilização do número de instruções é ainda simples: loop
interno é O(N) e é executado N vezes: O(N2)
22. Como melhorar o
desempenho?
Se existe um algoritmo A de ordem
O(n)=n e outro B de ordem O(n)=n!
então é preferível utilizar A.
Se não temos ou conhecemos o
algoritmo apropriado?
Usar técnicas de projeto de algoritmos
23. Técnicas de Projeto de
Algoritmos
Dividir para conquistar (Divide-and-
Conquer)
Programação dinámica (otimização)
Procura ganânciosa-gulosa (Greedy -
otimização)
Branch-and-bound ( Pruning)
Aprendizagem (Machine Learning)
Aleatórios (Randomized)
Procura exaustiva ou força bruta (Brute
Force ou Backtraking)
24. Técnicas de Projeto
Dividir para conquistar (Divide-and-
Conquer)
Resolver um problema grande pode ser
muito difícil, mas resolver dois problemas
menores pode se tornar significativamente
mais simples
Divide o problema em problemas menores e
resolve cada um de uma forma
independente
Combina as soluções de todos os
subproblemas para obter a solução do
problema original
A etapa de recombinação das soluções é
normalmente crítica e dispendiosa em
termos de tempo
25. Técnicas de projeto de Alg.
Programação dinâmica (otimização)
Uma série de escolhas deve ser feita
para atingir a solução ótima
A medida que as escolhas são
realizadas surgem subproblemas da
mesma forma, que podem aparecer
repetidamente.
A idéia é guardar a solução para
cada um desses subproblemas.
Tempo exponencial pode ser
transformado em polinomial
26. Técnicas de projeto de Alg.
Procura ganânciosa (Greedy, otimização)
Muitos algoritmos têm procedimentos
iterativos e escolhem em cada iteração um
número de possíveis alternativas
Escolhe as alternativas mais atrativas,
algumas podem levar à solução, outras
não.
Pode não levar à solução correta
27. Técnicas de projeto de Alg.
Procura exaustiva ou força bruta (Brute
Force)
O algoritmo examina todas as alternativas
possíveis para encontrar uma solução
particular.
Pode não encontrar uma solução em tempo
útil, mas garante que a encontra
Branch-and-bound ( Pruning)
Ignora um conjunto de alternativas
desnecessárias
Menor tempo de execução e garante que
encontra a solução
28. Técnicas de Projeto
Aprendizagem (Machine Learning)
Baseiam a sua estratégia na análise
computacional de dados previamente
colecionados
Aleatórios (Randomized)
Em cada passo pode ser atirada uma
moeda ao ar para decidir o passo seguinte
Existem problemas práticos onde estes
algoritmos são competitivos relativamente
aos algoritmos determinísticos
29. Referências
CORMEN, T.H et al. Algoritmos: Teoria e
prática. 2a Ed. Campus, RJ, 2002.
FREITAS, Ana Teresa. Análise de
Algoritmos. Material didático (.pdf),
INESC-ID/IST, 2005.