Introdução a Análise de Complexidade de Algoritmos Prof. Alexandre Parra [email protected] Roteiro Introdução à Análise de Complexidade de Algoritmos Roteiro Introdução à Análise de Complexidade de Algoritmos Considerações sobre Análise de Complexidade O programador deve estar ciente aspectos que influenciam a eficiência. dos vários Objetivo: fazer uma opção “mais correta” quanto ao método de pesquisa e/ou ordenação a utilizar em um determinado cenário. Aspectos mais relevantes: O tempo que será gasto pelo programador para codificar determinado programa. O tempo necessário para executar o programa. Espaço de memória necessário para executar o programa. Aspecto: Codificação Se o algoritmo de pesquisa ou ordenação for executado poucas vezes e existirem tempo e espaço na máquina suficientes para executá-lo Não desperdiçar dias programando melhores métodos. Ressalva: O tempo de programação nunca deve ser uma desculpa válida para usar um algoritmo inadequado. Programador precisa conhecer os vários métodos de pesquisa e ordenação para uma escolha bem sucedida. Aspectos: Tempo e Espaço Na maioria dos programas, o programador deverá otimizar freqüentemente um desses aspectos à custa do outro. Interessado na variação do tempo imposta pela mudança no tamanho do repositório de dados. A eficiência de tempo é calculada pelo número de operações críticas efetuadas. Operações críticas: (1) comparação entre chaves, (2) troca de dois registros, (3) ou movimentação de ponteiros para registros. Tempo de Execução de Algoritmos (1/2) Em alguns casos pode-se calcular exatamente o tempo de execução de um algoritmo. Para repositório de dados volumosos, constantes multiplicativas e termos de mais baixa ordem podem ser desconsiderados. Exemplo: 0.01n2 + 10n = O(n2), onde n é o número de registros no arquivo a ser ordenado. Tempo de Execução de Algoritmos (2/2) 0.01n2 + 10n = O(n2) n a = 0.01n2 b = 10n Cálculo a+b Cálculo (a+b)/n2 Cálculo (a+b)/10n 10 1 100 101 1,0100 1,01 50 25 500 525 0,2100 1,05 100 100 1.000 1.100 0,1100 1,10 500 2.500 5.000 7.500 0,0300 1,50 1.000 10.000 10.000 20.000 0,0200 2,00 5.000 250.000 50.000 300.000 0,0120 6,00 10.000 1.000.000 100.000 1.100.000 0,0110 11,00 50.000 25.000.000 500.000 25.500.000 0,0102 51,00 100.000 100.000.000 1.000.000 101.000.000 0,0101 101,00 500.000 2.500.000.000 5.000.000 2.505.000.000 0,0100 501,00 1.000.000 10.000.000.000 10.000.000 10.010.000.000 0,0100 1001,00 Métodos de cálculo de complexidade (1/2) Formal (conceito de Ordem) Através deste conceito poderemos comparar vários métodos de pesquisa e ordenação quanto a eficiência. Métodos de pesquisa têm exigências de tempo que variam de O(log2 n) a O(n). Métodos de ordenação têm exigências de tempo que variam de O(nlog2 n) a O(n2). Métodos de cálculo de complexidade (2/2) Empírico Um segundo método é executar um programa de pesquisa e ordenação e avaliar sua eficiência (quer por unidade de tempo absoluto ou pelo nº de operações executadas). É necessário fazer o teste em vários exemplos de arquivo. Mesmo havendo uma estatística, a aplicação da pesquisa ou ordenação num arquivo específico pode não apresentar resultados que sigam o padrão.