Professional Documents
Culture Documents
Slides adaptados dos materiais dos professores: Nivio Ziviani, Antnio Loureiro e Raquel Mini Mnica Machado
O que um algoritmo?
Qualquer procedimento computacional bem definido que toma algum valor ou conjunto de valores como entrada e produz algum valor ou conjunto de valores como sada. Sequncia de passos computacionais que transformam a entrada na sada. Sequncia de aes executveis para a obteno de uma soluo para um determinado tipo de problema. Descrio de um padro de comportamento, expresso em termos de um conjunto finito de aes. Sequncia no ambgua de instrues que executada at que determinada condio se verifique.
Anlise de algoritmos
Analisar a complexidade computacional de um algoritmo significa prever os recursos de que o mesmo necessitar: Memria Largura de banda de comunicao Hardware Tempo de execuo Geralmente existe mais de um algoritmo para resolver um problema. A anlise de complexidade computacional fundamental no processo de definio de algoritmos mais eficientes para a sua soluo. Em geral, o tempo de execuo cresce com o tamanho da entrada.
Aumento na velocidade computacional tem pouco efeito no tamanho das instncias resolvidas por algoritmos ineficientes
Novo algoritmo oferece uma melhoria maior que a compra da nova mquina
Funo de complexidade
Para medir o custo de execuo de um algoritmo comum definir uma funo de custo ou funo de complexidade T. T(n) a medida do tempo necessrio para executar um algoritmo para um problema de tamanho n. Funo de complexidade de tempo: T(n) mede o tempo necessrio para executar um algoritmo para um problema de tamanho n. Na realidade, a complexidade de tempo no representa tempo diretamente, mas o nmero de vezes que determinada operao considerada relevante executada. Obs.: Alguns autores utilizam a notao f(n).
package cap1; public class Max { public static int max ( int v [ ] , int n) { int max = v[0] ; for ( int i = 1; i < n; i++) if (max < v[ i ] ) max = v[ i ] ; return max; } }
Pior caso:
Maior tempo de execuo sobre todas as entradas de tamanho n. Se T uma funo de complexidade baseada na anlise de pior caso, o custo de aplicar o algoritmo nunca maior do que T(n).
Seja T(n) o nmero de comparaes entre os elementos de A, se A tiver n elementos. Logo T(n) = 2(n 1), para n > 0, para o melhor caso, pior caso e caso mdio.
Melhor caso: quando os elementos esto em ordem crescente; T(n) = n 1 Pior caso: quando os elementos esto em ordem decrescente; T(n) = 2(n 1) Caso mdio: No caso mdio, A[i] / v[i] maior do que Max a metade das vezes. T(n) = n 1 + (n 1)/2 = 3n/2 3/2
Comparao 1
Dominao assinttica
A anlise de um algoritmo geralmente conta com apenas algumas operaes elementares. A medida de custo ou medida de complexidade relata o crescimento assinttico da operao considerada.
O valor da constante m mostrado o menor valor possvel, mas qualquer valor maior tambm vlido.
Sejam g(n) = (n+1)2 e f(n) = n2. As funes g(n) e f(n) dominam assintoticamente uma a outra, desde que: |(n+1) 2| 4|n2| para n 1
|g(n)| c|f(n)| para nm; c=4 e m=1 g(n) = O(f(n))
Seja g(n) = (n+1)2. Logo, g(n) O(n2), quando m=1 e c=4. Isso porque: (n+1) 2 4n2 para n 1. Sejam g(n) = n e f(n) = -n2 Temos que |n| c|-n2|, fazendo c=1e m=0, a definio anterior satisfeita. Desta forma, f(n) domina assintoticamente g(n). g(n) = O(f(n)) Observe que g(n) no domina assintoticamente f(n) porque |-n2| > c|n|, qualquer que seja o valor de c, para todo n>1. A funo g(n) = 3n3 + 2n2 + n O(n3). Basta mostrar que 3n3 + 2n2 + n 6n3, para n 0.
Comparao de Programas
Podemos avaliar programas comparando as funes de complexidade, negligenciando as constantes de proporcionalidade. Um programa com tempo de execuo O(n) melhor que outro com tempo O(n2). Porm, as constantes de proporcionalidade podem alterar esta considerao.
Exemplo: um programa leva 100n unidades de tempo para ser executado e outro leva 2n2. Qual dos dois programas melhor?
Comparao de Programas
Qual dos dois programas melhor? depende do tamanho do problema. Para n < 50, o programa com tempo 2n2 melhor do que o que possui tempo 100n. (Calcule n=40, n=49, n=50 e n=51)
2n2 100n n=40 -> 3200 n=40-> 4000 n=49->4802 n=49->4900 n=50->5000 n=50->5000 n=51->5202 n=51->5100
Para problemas com entrada de dados pequena prefervel usar o programa cujo tempo de execuo O(n2). Entretanto, quando n cresce, o programa com tempo de execuo O(n2) leva muito mais tempo que o programa O(n).
Quando n 1 milho, nlog2n cerca de 20 milhes. Quando n 2 milhes, nlog2n cerca de 42 milhes Exemplo: Algoritmo de ordenao MergeSort
Algoritmos Polinomiais
Algoritmo polinomial no tempo de execuo tem funo de complexidade O(p(n)), onde p(n) um polinmio. Algoritmo exponencial no tempo de execuo tem funo de complexidade O(cn), c > 1, so geralmente simples variaes de pesquisa exaustiva. A distino entre estes dois tipos de algoritmos torna-se significativa quando o tamanho do problema a ser resolvido cresce. Por isso, os algoritmos polinomiais so muito mais teis na prtica do que os exponenciais. A distino entre algoritmos polinomiais eficientes e algoritmos exponenciais ineficientes possui excees.
Exemplo: um algoritmo com funo de complexidade f(n) = 2n mais rpido que um algoritmo g(n) = n5 para valores de n menores ou iguais a 20.
Hierarquias de funes
A seguinte hierarquia de funes pode ser definida do ponto de vista assinttico:
Hierarquias de funes
Hierarquias de funes
Seja T(n) uma funo de complexidade que represente o nmero de inspees nos n elementos do conjunto. O custo de execuo das linhas (1) e (2) O(1) e da linha (3) O(n)
Se n <= 1 faz uma operao de custo constante. Se n > 1 faz uma operao de custo constante e chama recursivamente a funo.
Perguntas ?
Referncias
Ziviani Laudon Nivio. Projeto de Algoritmos com implementaes em Java e C++, 2007. Ziviani Laudon Nivio. Projeto de Algoritmos com implementaes em Pascal e C, 2003.