analise algoritmos

29
Análise de Algoritmos Profa. Maria Inés Castiñeira, Dra. Unisul – Campus Grande Florianópolis Ciência da Computação

Upload: faculdade-politecnica-de-jundiai

Post on 14-Jun-2015

1.195 views

Category:

Education


4 download

TRANSCRIPT

Page 1: Analise Algoritmos

Análise de Algoritmos

Profa. Maria Inés Castiñeira, Dra.Unisul – Campus Grande FlorianópolisCiência da Computação

Page 2: Analise Algoritmos

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

Page 3: Analise Algoritmos

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

Page 4: Analise Algoritmos

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.

Page 5: Analise Algoritmos

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

Page 6: Analise Algoritmos

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

Page 7: Analise Algoritmos

Variáveis na análise de Algoritmos

TEMPO

Page 8: Analise Algoritmos

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

Page 9: Analise Algoritmos

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

Page 10: Analise Algoritmos

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

Page 11: Analise Algoritmos

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 .....

Page 12: Analise Algoritmos

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

Page 13: Analise Algoritmos

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.

Page 14: Analise Algoritmos

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.

Page 15: Analise Algoritmos

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

Page 16: Analise Algoritmos

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.

Page 17: Analise Algoritmos

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)

Page 18: Analise Algoritmos

Tamanho de problemas que podem ser resolvidos

f(n) 1 segundo 1 minuto

< 3 * 10^100n 1000000 60000000

1000 7700

20 26n! 10 11

ln(n)Math ERROR: Muito grande!

n2

2n

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.

Page 19: Analise Algoritmos

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

Page 20: Analise Algoritmos

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.

Page 21: Analise Algoritmos

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)

Page 22: Analise Algoritmos

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

Page 23: Analise Algoritmos

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)

Page 24: Analise Algoritmos

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

Page 25: Analise Algoritmos

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

Page 26: Analise Algoritmos

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

Page 27: Analise Algoritmos

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

Page 28: Analise Algoritmos

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 seguinteExistem problemas práticos onde estes algoritmos são competitivos relativamente aos algoritmos determinísticos

Page 29: Analise Algoritmos

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.