Introdução à Computação II 5952011 2. Complexidade de Algoritmos Prof. Renato Tinós Depto. de Computação e Matemática (FFCLRP/USP) 1
Principais Tópicos 2.1. Introdução 2.1.1. Revisão de Pseudo-Código 2.1.2. Uma Rápida Revisão Matemática 2.2. Análise de Algoritmos 2.2.1. Análise por Operações Primitivas 2.2.2. Análise do Pior Caso e e do Caso Médio 2.3. Notação Assintótica 2.3.1. Notação O 2.3.2. Notação 2.3.3. Notação 2.3.4. Outras Notações 2.4. Análise Assintótica 2
2.1.1. Revisão de Pseudo-Código Pseudo-Código Descrição em alto nível que combina» Linguagem natural» Estruturas familiares de linguagem de programação Escrito para ser interpretado por um ser-humano, e não por um computador Mais compacto que o código na linguagem de programação Facilita a análise das estruturas de dados ou dos algoritmos 3
2.1.1. Revisão de Pseudo-Código Exemplo 2.1. Pseudo-Código Algoritmo maxelemento(): Entrada: vetor A com n inteiros Saída: elemento máximo de A maximo A[0] para i 1 até n-1 faça se A[i] > maximo então maximo A[i] fim se fim para retorne maximo 4
2.1.1. Revisão de Pseudo-Código Estruturas de linguagem de programação utilizadas Expressões» Atribuição:» Relação de igualdade: = Declarações de Rotinas: Algoritmo (par1,...) Chamadas de sub-rotinas: subrotina (par1,...) Retorno de sub-rotinas: retorne... (em inglês: return...) 5
2.1.1. Revisão de Pseudo-Código (continuação) Estruturas de Decisão: se...então...senão... (em inglês: if...then...else... ) Loops» enquanto...faça... (em inglês: while...do... )» repita...até que... (em inglês: repeat...until... )» para...faça... (em inglês: for...do... ) Indexação: A [ i ] 6
Logaritmos e Expoentes 2.1.2. Revisão Matemática log b a = c a = b c Obs: em computação, é comum não escrever o valor da base quando b=2 (Exemplo: log 1024 = 10) 7
8 2.1.2. Revisão Matemática Algumas propriedades de somatórios Proposição 2.1. Para: dois inteiros nm0, duas funções f(i) e g(i) e uma constante c, n m i n m i n m i i g i f i g i f ) ( ) ( ) ( ) ( 1 1 m n n m i n m i n m i i f c i f c
9 2.1.2. Revisão Matemática Série Aritmética Proposição 2.2. Para qualquer inteiro n1, 6 1 2 1 1 2 n n n i n i 2 1 1 n n i n i 4 1 2 2 1 3 n n i n i
Série Geométrica 2.1.2. Revisão Matemática Proposição 2.3. Para qualquer inteiro n0 e qualquer número real 0 < a 1, então n n i 1 a a 1 a i0 1 10
2.1.2. Revisão Matemática Definições x : maior inteiro menor ou igual a x (piso ou chão) x : menor inteiro maior ou igual a x (teto) 11
2.2. Análise de Algoritmos Análise de algoritmos: prever os recursos de que o algoritmo vai necessitar Exemplos» Memória» Largura da banda de comunicação» Hardware» Tempo de execução O tempo de execução pode ser estudado através da análise experimental 12
2.2. Análise de Algoritmos o : computador 1 + : computador 2 Figura 2.1. Resultados de um estudo experimental do tempo de execução (t) para diferentes entradas (n) 13
Desvantagens dos estudos experimentais Limitado conjunto de entradas para teste Dificuldade de comparar a eficiência de dois ou mais algoritmos Necessidade de implementar e executar o algoritmo Existe outro método? Método analítico 2.2. Análise de Algoritmos» Independe do computador utilizado 14
2.2.1. Análise por Operações Primitivas Pode ser implementada em Pseudo- Código Independe da linguagem de programação Independe do hardware 15
2.2.1. Análise por Operações Primitivas Operações Primitivas Atribuição Chamada de uma sub-rotina Operação aritmética Operação lógica Indexação em um vetor Retorno de uma sub-rotina Referência a um objeto 16
2.2.1. Análise por Operações Primitivas Exemplo 2.2. Faça a análise por operações primitivas dos algoritmos apresentados abaixo a) Algoritmo fnum(a,b): Entrada: inteiros a e b Saída: valor da operação matemática soma a + b soma 0.8 * soma retorne soma 17
2.2.1. Análise por Operações Primitivas Exemplo 2.2. Faça a análise por operações primitivas dos algoritmos apresentados abaixo b) Algoritmo impvetor(a): Entrada: vetor A com n inteiros para i 0 até n-1 faça fim para retorne imprime ( A[ i ] ) 18
2.2.1. Análise por Operações Primitivas Exemplo 2.2. Faça a análise por operações primitivas dos algoritmos apresentados abaixo c) Algoritmo maxnum(a,b): Entrada: inteiros a e b Saída: elemento máximo entre a e b maximo a se a < b então fim se maximo b retorne maximo 19
2.2.1. Análise por Operações Primitivas Exemplo 2.2. Faça a análise por operações primitivas dos algoritmos apresentados abaixo d) Algoritmo maxelemento(a): Entrada: vetor A com n inteiros Saída: elemento máximo de A maximo A[0] para i 1 até n-1 faça se A[i] > maximo então maximo A[i] fim se fim para retorne maximo 20
2.2.1. Análise por Operações Primitivas Exercício 2.1. Escreva, utilizando pseudo-código, um algoritmo que imprima a média aritmética de n números digitados pelo usuário. Exercício 2.2. Faça a análise por operações primitivas do algoritmo criado no Exercício 2.1. Exercício 2.3. Escreva, utilizando pseudo-código, um algoritmo que tenha como entrada um vetor de inteiros com tamanho n e que verifique se um determinado número digitado pelo usuário está presente. Exercício 2.4. Faça a análise por operações primitivas do algoritmo criado no Exercício 2.3. 21
2.2.1. Análise por Operações Primitivas Exercício 2.5. Escreva, utilizando pseudocódigo, uma função que receba duas matrizes reais quadradas (com n linhas) e gere a sua soma. Exercício 2.6. Faça a análise por operações primitivas do algoritmo criado no Exercício 2.1 22
2.2.2. Análise do Pior Caso e do Caso Médio Complexidade Definição 2.1. seja A um algoritmo, {E 1,..., E m } o conjunto de todas as entradas possíveis de A. Denote por t i o número de passos efetuados por A, quando a entrada for E i. Definemse Complexidade do pior caso = Complexidade do melhor caso = Complexidade do caso médio =. max t i t na qual p i é a probabilidade de ocorrência da entrada E i E i min m i1 E E p i t i i E i 23
2.2.2. Análise do Pior Caso e do Caso Médio pior caso caso médio? melhor caso 24
2.2.2. Análise do Pior Caso e do Caso Médio Análise do caso médio e do pior caso Análise do tempo médio requer conhecimento das distribuições de probabilidades das entradas A análise do pior caso é geralmente utilizada 25
2.2.2. Análise do Pior Caso e do Caso Médio Analisando detalhadamente o tempo de execução, surgem as seguintes questões Este nível de detalhamento é realmente importante? Será tão importante definir o número exato de operações primitivas executadas pelo algoritmo? Quão cuidadosamente deve-se definir o conjunto de operações primitivas? Exemplo: y = a*x + b 26
2.3. Notação Assintótica Simplificação da análise Análise da taxa de crescimento Ex.: o algoritmo maxelemento» pior caso: 8n-2» cresce proporcionalmente a n Despreza os fatores constantes Ex.: n 2 c 1 n 2 c 2 27
2.3. Notação Assintótica Utilizadas para analisar o tempo de execução Notação O : limite assintótico superior» Pior caso Notação : limite assintótico inferior Notação : limite assintótico restrito 28
2.3.1. Notação O Definição 2.2. Sejam f(n) e g(n) duas funções mapeando inteiros não-negativos para números reais. Então f(n) é O(g(n)) se existem uma constante real c>0 e uma constante inteira n 0 1 tal que: 0 f(n) c g(n) para todo n n 0 29
Tempo de Execução Ilustração da Notação O 2.3.1. Notação O c g(n) f(n) n o 30
2.3.1. Notação O Exemplo 2.3. 8n 2 é O(n)? 31
2.3.1. Notação O Permite dizer que uma função de n é menor que ou igual a outra função Até um fator constante no sentido assintótico, já que n cresce para o infinito Fornece um limite assintótico superior para o tempo de execução 32
2.3.1. Notação O Proposição 2.3. O tempo de execução do algoritmo maxelemento para a computação do máximo elemento em um vetor de n inteiros é O(n) Justificativa: - O número de operações primitivas para o pior caso (Exemplo 1) é 8n-2 - Considerando que existe uma constante k dependente do tempo de execução, o tempo de execução do algoritmo é k(8n-2) -Considerando que c=8k e n 0 =1, o tempo de execução do algoritmo maxelemento é O(n). 33
2.3.1. Notação O Exemplo 2.4. Mostre que 20n 3 + 10n (log n) + 5 é O(n 3 ) De fato, qualquer polinômio a k n k + a k-1 n k-1 +...+a 0 é sempre O(n k ) 34
2.3.1. Notação O Exercício 2.7. Mostre que a) 3 (log n) + 5 ( log (log n) ) é O(log n) b) 5/n é O(1/n ) c) 2 100 é O(1) d) (n+1) 5 é O(n 5 ) 35
2.3.1. Notação O Terminologia para classes de funções Logarítmica: O(log n) Linear: O(n) Quadrática: O(n 2 ) Polinomial: O(n k ) (k1) Exponencial: O(a n ) (a>1) Fatorial: O(n!) 36
2.3.1. Notação O log 2 n n n log 2 n n 2 n 3 2 n 0 1 0 1 1 2 1 2 2 4 8 4 2 4 8 16 64 16 3 8 24 64 512 256 4 16 64 256 4096 65536 5 32 160 1024 32768 4294967296 6 64 384 4096 262144 1,84467E+19 7 128 896 16384 2097152 3,40282E+38 65536 32768 16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1 2 n n 3 n 2 n log 2 n n log 2 n 1 2 4 8 16 32 64 128 256 37
2.3.2. Notação Definição 2.3. Sejam f(n) e g(n) duas funções mapeando inteiros não-negativos para números reais. Então f(n) é (g(n)) se existem uma constante real c>0 e uma constante inteira n 0 1 tal que: 0 c g(n) f(n) para todo n n 0 38
Tempo de Execução Ilustração da Notação 2.3.2. Notação f(n) c g(n) n o 39
2.3.2. Notação Permite dizer que uma função de n é maior que ou igual a outra função Até um fator constante e no sentido assintótico já que n cresce para o infinito Fornece um limite assintótico inferior para o tempo de execução 40
2.3.3. Notação Definição 2.4. Sejam f(n) e g(n) duas funções mapeando inteiros não-negativos para números reais. Então f(n) é (g(n)) se existem constantes reais c 1 >0 e c 2 >0 e uma constante inteira n 0 1 tal que: 0 c 1 g(n) f(n) c 2 g(n) para todo n n 0 41
Tempo de Execução 2.3.3. Notação Ilustração da Notação c 2 g(n) f(n) c 1 g(n) n o 42
2.3.3. Notação Permite dizer que duas funções são assintoticamente iguais até um fator constante Fornece um limite assintótico restrito para o tempo de execução 43
2.3.4. Outras Notações Notações o e Parentes, respectivamente, das notações O e Denotam limites que não são assintoticamente restritos (n 0 >0)» Exemplo: o 0 f(n) < c g(n) para todo n n 0 44
2.4. Análise Assintótica Permite analisar os tempos de execução dos algoritmos por meio das Notações Assintóticas Determinação da ordem de crescimento (em função do tamanho das entradas) do tempo de execução de um programa» sem haver preocupação com o valor das constantes envolvidas 45
2.4. Análise Assintótica Utiliza técnicas de matemática discreta Envolvendo contagem dos elementos que possuam uma propriedade comum Infelizmente, não existe um conjunto completo de regras para a análise de programas No entanto, podemos enumerar alguns princípios a serem seguidos 46
2.4. Análise Assintótica Princípios para a análise de algoritmos 1. O tempo de execução de um comando simples de atribuição, leitura ou escrita pode ser considerado como O(1) 2. O tempo de execução de um bloco de comandos é determinado pelo maior tempo de execução de um comando deste bloco 3. O tempo de execução de um comando de decisão é composto pelo tempo de execução de seu bloco de comandos condicionais, mais o tempo para avaliar as suas condições (que geralmente Introdução à Computação são O(1) II 5952011 ) 47
2.4. Análise Assintótica Princípios para a análise de algoritmos 4. O tempo para executar um anel (loop) é a soma do tempo de execução do bloco de comandos (corpo) do anel mais o tempo para avaliar a condição de parada, multiplicado pelo número de iterações deste anel 5. Quando o programa possui procedimentos nãorecursivos, o tempo de execução de cada procedimento deve ser computado separadamente, iniciando com os procedimentos que não chamam outros procedimentos 48
Exemplo 2.5. Análise Assintótica 2.4. Análise Assintótica Algoritmo prefixmedia1(x): Entrada: vetor X com n números Saída: vetor A com n números tal que A[i] é a média dos elementos X[0],...,X[i] Seja A um vetor com n números. para i 0 até n-1 faça a 0 0+1+2+...+n-1=n(n-1)/2 para j 0 até i faça a a+x[j] fim para A[i] a/(i+1) fim para retorne A 49
Exemplo 2.6. Análise Assintótica Algoritmo prefixmedia2(x): Entrada: vetor X com n números Análise Assintótica Saída: vetor A com n números tal que A[i] é a média dos elementos X[0],...,X[i] Seja A um vetor com n números. s 0 para i 0 até n-1 faça n s s+x[i] A[i] s/(i+1) fim para retorne A 50
Exemplo 2.6. Análise Assintótica (continuação) Análise Assintótica O tempo de execução do algoritmo prefixmedia1() é O(n 2 ) enquanto que o do algoritmo prefixmedia2() é O(n) Assim, levando-se em conta a análise assintótica do tempo de execução, o algoritmo prefixmedia2() é mais interessante que o do algoritmo prefixmedia1() 51
Exercícios Exercício 2.8. Faça a análise assintótica (Notação O ) do tempo de execução do Algoritmo maxelemento() apresentado no Exemplo 2.1. Exercício 2.9. Faça a análise por operações primitivas e análise assintótica de um algoritmo que verifique se um determinado valor digitado pelo usuário está presente em uma matriz n x m 52
Exercícios Exercício 2.10. Implemente os algoritmos desenvolvidos nos Exercícios 2.1, 2.3 e 2.5, e Obtenha os tempos de execução para n=3000, n=10000 e n=30000 Faça a análise assintótica 53