Sistemas Distribuídos: Princípios e Algoritmos Introdução à Análise de Complexidade de Algoritmos Francisco José da Silva e Silva Laboratório de Sistemas Distribuídos (LSD) Departamento de Informática / UFMA http://www.lsd.ufma.br 20 de agosto de 2012 Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 1 / 30
Agenda 1 Medindo Tempo de Execução 2 Classes de Complexidade 3 Definição e Manipulação da Notação Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 2 / 30
Medindo Tempo de Execução Medindo Tempo de Execução Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 3 / 30
Medindo Tempo de Execução Introdução à Complexidade Este conhecimento permite identificar os algoritmos mais eficientes para resolver vários problemas encontrados com frequência; É muito importante no desenvolvimento de softwares de alta qualidade; A notação assintótica permite comparar a eficiência de algoritmos de forma independente de diferenças de hardware nos quais eles são executados ou de linguagens de programação nas quais eles são implementados. Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 4 / 30
Medindo Tempo de Execução Ordenação por Seleção void selecao (int[] A) { int maxposition, temp, i, j; for (i = A.length-1; i>0; i--) { maxposition = i; for (j = 0; j < i; j++) { if (A[j] > A[maxPosition]) { maxposition = j; } } // troca A[i] com A[maxPosition] temp = A[i]; A[i] = A[maxPosition]; A[maxPosition] = temp; } } Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 5 / 30
Medindo Tempo de Execução Ordenação por Seleção: tempo de execução para 2000 inteiros (ms) Tipo de Computador Tempo microcomputador doméstico 51,915 estação de trabalho 11,508 minicomputador 2,382 mainframe 0,431 supercomputador 0,087 Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 6 / 30
Medindo Tempo de Execução Algumas Considerações... Os tempos de execução do algoritmo também variam de acordo com a linguagem de programação utilizada; Mesmo utilizando uma única linguagem, diferentes compiladores gerarão diferentes instruções em linguagem de máquina, gerando tempos de execução diferentes; Algoritmos consomem recursos (como tempo e espaço) que depende do tamanho do problema a ser resolvido; Chamemos de n o tamanho do problema. Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 7 / 30
Medindo Tempo de Execução Ordenação por Seleção: variando n (ms) Tamanho vetor (n) Comp Doméstico Estação Trab 125 12,5 2,8 250 49,3 11,0 500 195,8 43,4 1000 780,3 172,9 2000 3114,9 690,5 Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 8 / 30
Medindo Tempo de Execução Representação Gráfica dos Resultados Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 9 / 30
Medindo Tempo de Execução Considerações As curvas possuem a forma f(n) = an 2 +bn+c e a diferença entre elas são as constantes a,b,c; Se implementarmos o mesmo algoritmo em diferentes linguagens e executarmos em outras máquinas ele continuará a ter um comportamento quadrático em função do tamanho do vetor; Na análise de complexidade procuramos descobrir a curva que caracteriza o tempo de execução em função do tamanho do problema; Desprezaremos as constantes e termos não dominantes; Para a notação-o, a função f(n) = an 2 +bn+c é dita O(n 2 ): Focamos no termo dominante (an 2 ) e ignoramos o resto (bn+c); ignora-se também a constante a. Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 10 / 30
Medindo Tempo de Execução Contribuição do Termo n 2 n f(n) an 2 n 2 : % total 125 2,8 2,7 94,7 250 11,0 10,8 98,2 500 43,4 43,1 99,3 1000 172,9 172,4 99,7 2000 690,5 689,6 99,9 Tabela: Considerando a = 0,0001724, b = 0,0004 e c=0,1 Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 11 / 30
Classes de Complexidade Classes de Complexidade Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 12 / 30
Classes de Complexidade Classes de Complexidade Comuns Nome Notação-O constante O(1) logaritmo O(log n) linear O(n) nlogn O(nlogn) quadrática O(n 2 ) cúbica O(n 3 ) exponencial O(2 n ) exponencial O(10 n ) Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 13 / 30
Classes de Complexidade Exemplo Dado um algoritmo A, executado um computador de 1 MIPS, quanto tempo leva para calcular uma solução para diversos tamanhos do problema? Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 14 / 30
Classes de Complexidade Convertendo os Resultados... Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 15 / 30
Classes de Complexidade Necessidade Mais Usual Que tamanho n pode assumir para que o algoritmo A possa ser executado em um ano ou uma semana ou um dia? Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 16 / 30
Classes de Complexidade Considerações sobre as Classes de Complexidade Se pudermos substituir um algoritmo linear A por um algoritmo logarítmico B, um problema que levaria uma hora para ser solucionado por A levaria apenas 31,75 micro-segundos para que B o solucionasse... Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 17 / 30
Classes de Complexidade Pior Caso, Caso Médio e Melhor Caso Nem sempre um algoritmo leva o mesmo tempo para resolver problemas de um dado tamanho, independentemente de seus dados de entrada; Isto leva à necessidade de analisarmos o melhor caso, pior caso e o caso médio da execução do algoritmo; O QuickSort, por exemplo, custa em média O(nlogn) mas seu pior caso é O(n 2 ). Pior caso do Quicksort: vetor já ordenado: particionamento gerará uma região com n 1 elementos e outra com apenas 1 elemento. Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 18 / 30
Classes de Complexidade Lembrando o Funcionamento do QuickSort Dividir: O vetor A[p..r] é particionado em dois sub-vetores A[p..q] e A[q +1..r], onde cada elemento de A[p..q] é menor ou igual a qualquer elemento de A[q +1..r]. Conquistar: Os sub-vetores A[p..q] e A[q + 1..r] são ordenados por chamadas recursivas a QuickSort. Combinar: os vetores são ordenados no próprio vetor A, não é necessário trabalho adicional para combiná-los. Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 19 / 30
Classes de Complexidade Alguns Exemplos: Algoritmos de Pesquisa Algoritmo Complexidade busca sequencial O(n) busca binária O(log n) tabela de espalhamento a O(1) árvore binária de busca O(log n) a sob certas condições: colisões Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 20 / 30
Classes de Complexidade Alguns Exemplos: Algoritmos de Ordenação Algoritmo Complexidade Seleção, Inserção O(n 2 ) QuickSort, HeapSort, MergeSort O(n log n) RadixSort a O(n) a ordenação sem comparações entre os elementos de entrada. Exige que os elementos estejam em uma faixa 1 a k, para algum inteiro k. Quando k = O(n), a ordenação é executada em tempo linear. Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 21 / 30
Classes de Complexidade Outros Exemplos Algoritmo Complexidade problema do caixeiro viajante a exponencial jogos como xadrez exponencial algoritmo simples para a multiplicação O(n 3 ) de duas matrizes quadradas a dado um mapa com cidades e o custo para viajar entre elas (quando possível), encontrar a rota de menor custo que faça o caixeiro passar exatamente uma vez em cada cidade Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 22 / 30
Definição e Manipulação da Notação Definição e Manipulação da Notação Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 23 / 30
Definição e Manipulação da Notação Definição da Notação-O Dizemos que f(n) é O(g(n)) se existem constantes positivas K e n 0 tal que f(n) g(n) para todo n n 0. Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 24 / 30
Definição e Manipulação da Notação Definição da Notação-O Figura: Θ(), O(), Ω() Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 25 / 30
Definição e Manipulação da Notação Exemplo de Prova Formal Suponha que um algoritmo A ordene uma sequência de n números, colocando-os em um vetor em ordem ascendente e que o número exato de passos que ele realiza é f(n) = 3+6+9+ +3n. Provemos que este algoritmo é O(n 2 ): f(n) = 3+6+9+ +3n = 3(1+2+ +n) = 3n(n+1) 2 Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 26 / 30
Definição e Manipulação da Notação Exemplo de Prova Formal Se escolhermos K = 3, n 0 = 1 e g(n) = n 2, substituindo na definição formal da notação-o, podemos demonstrar que f(n) g(n) para todo n n 0 e que a desigualdade vale para todo n 1: 3n(n +1) 3n 2 2 n 2 +n 2n 2 n n 2 1 n O que claramente vale para todo n 1. Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 27 / 30
Definição e Manipulação da Notação Dicas Práticas Para simplificar as provas, utiliza-se atalhos que normalmente compreendem separar a expressão f(n) em um termo determinante e outros termos menores e eliminar estes últimos. Para isto, podemos classificar as funções: O(1) < O(logn) < O(n) < O(nlogn) < O(n 2 ) < O(n 3 ) < O(2 n ) < O(10 n ) Exemplo: O(6n 3 15n 2 +3nlogn) = O(6n 3 ) = O(n 3 ) Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 28 / 30
Definição e Manipulação da Notação Base de Logaritmos Não escrevemos a base de logaritmos dado que para mudar a base basta multiplica-lo por uma constante; Exemplo: para mudar um logaritmo da base 2 para a base 10 podemos utilizar a seguinte fórmula: Mas como log 10 n = log 2n log 2 10 1 log 2 10 = 0,3010 Poderíamos ter escrito a fórmula de conversão como: log 10 n = 0,3010 log 2 n Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 29 / 30
Definição e Manipulação da Notação Considerações finais De acordo com a definição formal, se f(n) é O(n) então é também O(n 2 ),O(n 3 ),... No entanto, o limite que falamos é o mais próximo conhecido; Para problemas pequenos, as constantes podem assumir um papel determinante no desempenho do algoritmo; Portanto, a notação-o não necessariamente é válida para problemas pequenos. Francisco Silva (UFMA/LSD) SD: Princípios e Algoritmos 20 de agosto de 2012 30 / 30