28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Universidade Federal do Espírito Santo Centro de Ciências Exatas, Naturais e de Saúde – CCENS-UFES Departamento de Computação Análise de Algoritmos Estrutura de Dados II Estrutura de Dados II COM10078 – 2017-I Prof. Marcelo Otone Aguiar [email protected] www.marceloaguiar.pro.br Universidade Federal do Espírito Santo - CCENS-UFES Conteúdo Programático da Disciplina - Análise de Algoritmos ‣Introdução; ‣Contando instruções; ‣Comportamento Assintótico; ‣Tipos de Análise Assintótica; ‣Notação Grande O; ‣Classes de Problemas; 2 C.H. Prevista 2 horas Universidade Federal do Espírito Santo CCENS-UFES 1 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Análise de Algoritmos “Análise de Algoritmos” • • Em ciência da computação, é a área de pesquisa cujo foco são os algoritmos. Busca responder a seguinte pergunta: “podemos fazer um algoritmo mais eficiente?” Universidade Federal do Espírito Santo CCENS-UFES 3 Universidade Federal do Espírito Santo - CCENS-UFES Análise de Algoritmos • Podemos resolver um problema de várias maneiras diferentes, isto é, podemos utilizar algoritmos diferentes para um mesmo problema. • • Essas diferenças de eficiência podem ser • • 4 Algoritmos diferentes, mas capazes de resolver o mesmo problema, não necessariamente o fazem com a mesma eficiência. “irrelevantes” para um pequeno número de elementos processados “crescer proporcionalmente” com o número de elementos processados Universidade Federal do Espírito Santo CCENS-UFES 2 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Análise de Algoritmos • • Para comparar a eficiência dos algoritmos foi criada uma medida chamada de “complexidade computacional” Basicamente, ela indica o “custo” ao se aplicar um algoritmo, sendo “custo = memória + tempo” Em que o item • • “memória”: quanto de espaço o algoritmo vai consumir “tempo”: a duração de sua execução Universidade Federal do Espírito Santo CCENS-UFES 5 Universidade Federal do Espírito Santo - CCENS-UFES Análise de Algoritmos • Para determinar se um algoritmo é o mais eficiente, podemos utilizar duas abordagens • • 6 “Análise empírica”: comparação entre os programas “Análise matemática”: estudo das propriedades do algoritmo Universidade Federal do Espírito Santo CCENS-UFES 3 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Análise de Algoritmos “Análise empírica” • Avalia o custo (ou complexidade) de um algoritmo a partir da avaliação da execução do mesmo quando implementado • Ou seja, um algoritmo é analisado pela execução de seu programa correspondente “Vantagens” • • • • Avaliar o desempenho em uma determinada configuração de computador / linguagem Considerar custos não aparentes (ex: o custo da alocação de memória) Comparar computadores Comparar linguagens Universidade Federal do Espírito Santo CCENS-UFES 7 Universidade Federal do Espírito Santo - CCENS-UFES Análise de Algoritmos “Análise empírica” “Desvantagens” • Necessidade de implementar o algoritmo. Isso depende da habilidade do programador; • • Resultado pode ser mascarado pelo hardware (computador utilizado) ou software (eventos ocorridos no momento da avaliação) Qual a natureza dos dados: • • • 8 Dados reais Aleatórios (avaliam o desempenho médio) Perversos (pior caso) Universidade Federal do Espírito Santo CCENS-UFES 4 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Análise de Algoritmos “Análise matemática” • • • Permite um estudo formal de um algoritmo ao nível “ideia” por trás do algoritmo Faz uso de um computador idealizado e simplificações que buscam considerar somente os custos dominantes do algoritmo A medição do tempo gasto é feita de maneira independente do “hardware” ou da “linguagem” usada na sua implementação Universidade Federal do Espírito Santo CCENS-UFES 9 Universidade Federal do Espírito Santo - CCENS-UFES Análise de Algoritmos “Análise matemática” “Vantagens” • • 10 Detalhes de baixo nível, como a linguagem de programação utilizada, o hardware no qual o algoritmo é executado, ou o conjunto de instruções da CPU, são ignorados Permite entender como um algoritmo se comporta à medida que o conjunto de dados de entrada cresce. Assim, podemos expressar a relação entre o conjunto de dados de entrada. Universidade Federal do Espírito Santo CCENS-UFES 5 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES CONTANDO INSTRUÇÕES Universidade Federal do Espírito Santo CCENS-UFES 11 Universidade Federal do Espírito Santo - CCENS-UFES Contando Instruções “Análise matemática” “Contando instruções de um algoritmo” • Este algoritmo procura o maior valor presente em um array “A” contendo “n” elementos e o armazena na variável “M” int M = A[0]; for (i = 0; i < n; i++) { if (A[i] >= M) { M = A[i]; } } 12 Universidade Federal do Espírito Santo CCENS-UFES 6 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Contando Instruções • • • • Vamos contar quantas “instruções simples” ele executa Uma “instrução simples” é uma instrução que pode ser executada diretamente pelo CPU, ou algo muito perto disso Tipos de instruções: Atribuição de um valor a uma variável Acesso ao valor de um determinado elemento do array Comparação de dois valores Incremento de um valor Operações aritméticas básicas, como adição e multiplicação • • • • • Vamos assumir que: As instruções possuem o mesmo “custo” “comandos de seleção” possuem custo zero • • Universidade Federal do Espírito Santo CCENS-UFES 13 Universidade Federal do Espírito Santo - CCENS-UFES Contando Instruções /*1*/ int M = A[0]; /*2*/ for (i = 0; i < n; i++) { /*3*/ if (A[i] >= M) { /*4*/ M = A[i]; /*5*/ } /*6*/} O custo da “linha 1” é de “1 instrução” Na “linha 1”, o valor da primeira posição do array é copiado para a variável “M” Acessar o valor “A[0]” é atribuir a “M” • • • 14 Universidade Federal do Espírito Santo CCENS-UFES 7 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Contando Instruções /*1*/ int M = A[0]; /*2*/ for (i = 0; i < n; i++) { /*3*/ if (A[i] >= M) { /*4*/ M = A[i]; /*5*/ } /*6*/} O custo da inicialização do laço “for” (“linha 2”) é de “2 instruções” O comando “for” precisa ser inicializado: “1 instrução” (“i = 0”) Mesmo que o array tenha tamanho zero, ao menos uma comparação será executada (“i < n”), o que custa mais “1 instrução” • • • Universidade Federal do Espírito Santo CCENS-UFES 15 Universidade Federal do Espírito Santo - CCENS-UFES Contando Instruções • • O custo para executar o comando de laço “for” (“linha 2”) é de “2n instruções” Ao final de cada iteração do laço “for”, precisamos executar uma instrução de Incremento (“i++”) Comparação para verificar se vamos continuar no laço “for” (“i < n”) O laço “for” será executado “n” vezes. Assim, essas “2” instruções também serão executadas “n” vezes: “2n” instruções • • • /*1*/ int M = A[0]; /*2*/ for (i = 0; i < n; i++) { /*3*/ if (A[i] >= M) { /*4*/ M = A[i]; /*5*/ } /*6*/} 16 Universidade Federal do Espírito Santo CCENS-UFES 8 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES • Custo Dominante ou Pior caso do Algoritmo Ignorando os comandos contidos no corpo do laço “for”, teremos que o algoritmo precisa executar “3 + 2n” instruções: 3 instruções antes de iniciar o laço “for” 2 instruções ao final de cada laço “for”, o qual é executado “n” vezes • • • 17 Assim, considerando um “laço vazio”, podemos definir uma função matemática que representa o custo do algoritmo em relação ao tamanho do array de entrada: “f(n) = 2n + 3” Universidade Federal do Espírito Santo CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES Custo Dominante ou Pior caso do Algoritmo “Contando as instruções restantes do for” Comando “if”. “1 instrução”: acesso ao valor do array e a sua comparação (“A[i] >= M”) Dentro do “if”. “1 instrução”: acessa o valor do array e o atribui a outra variável (“M = A[i]”). Porém, sua execução depende do resultado da comparação feita pelo “if”. • • “Problema” As instruções vistas anteriormente eram sempre executadas As instruções dentro do “for” podem ou não ser executadas • • 18 Universidade Federal do Espírito Santo CCENS-UFES 9 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES • • • • Custo Dominante ou Pior caso do Algoritmo Antes, bastava saber o tamanho do array, “n”, para definir a função de custo “f(n)”. Agora temos que considerar também o conteúdo do array. Exemplo: dois arrays de mesmo tamanho A1 = {1, 2, 3, 4} A2 = {4, 3, 2, 1} Array “A1”: mais instruções -> o comando “if” é sempre “verdadeiro” Array “A2”: atribuição nunca é executada pois o comando “if” é sempre “falso” Universidade Federal do Espírito Santo CCENS-UFES 19 Universidade Federal do Espírito Santo - CCENS-UFES • • • Custo Dominante ou Pior caso do Algoritmo Ao analisarmos um algoritmo, é muito comum considerarmos o “pior caso” possível “Pior caso”: maior número de instruções executadas No nosso algoritmo o “pior caso” ocorre quando o array possui valores em ordem crescente. O valor de “M” é sempre substituído: Maior número de instruções O laço “for” sempre executa as 2 instruções • • • Assim, a função custo do algoritmo será “f(n) = 3 + 2n + 2n” ou “f(n) = 4n + 3”. Essa função representa o custo do algoritmo em relação ao tamanho do array (“n”) de entrada no “pior caso” 20 Universidade Federal do Espírito Santo CCENS-UFES 10 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES COMPORTAMENTO ASSINTÓTICO 21 Universidade Federal do Espírito Santo CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES Comportamento Assintótico • Vimos que o custo para o algoritmo abaixo é dado pela função: “f(n) = 4n + 3” /*1*/ int M = A[0]; /*2*/ for (i = 0; i < n; i++) { /*3*/ if (A[i] >= M) { /*4*/ M = A[i]; /*5*/ } /*6*/} • Essa é a função de complexidade de tempo. Ela nos dá uma ideia do custo de execução do algoritmo para um problema de tamanho “n”. 22 Universidade Federal do Espírito Santo CCENS-UFES 11 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Comportamento Assintótico “Dúvida” Será que todos os termos da função “f” são necessários para termos noção do custo? • • • • De fato, nem todos os termos são necessários Podemos descartar certos termos na função e manter apenas os que nos dizem o que acontece com a função quando o tamanho dos dados de entrada (“n”) cresce muito. Se um algoritmo é mais rápido do que outro para um grande conjunto de dados de entrada, é muito provável que ele continue sendo também mais rápido em um conjunto de dados menor Universidade Federal do Espírito Santo CCENS-UFES 23 Universidade Federal do Espírito Santo - CCENS-UFES Comportamento Assintótico • • • • • • 24 Podemos descartar todos os termos que crescem lentamente e manter apenas os que crescem mais rápido à medida que o valor de “n” se torna maior A função, “f(n) = 4n + 3”, pois dois termos: “4n” “3” • • O termo “3” é uma “constante de inicialização” Não se altera à medida que “n” aumenta Assim, nossa função pode ser reduzida para “f(n) = 4n” Universidade Federal do Espírito Santo CCENS-UFES 12 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Comportamento Assintótico • Constantes que multiplicam o termo “n” da função também devem ser descartadas Isso faz sentido se pensarmos em diferentes linguagens de programação. Por exemplo, a seguinte linha de código em Pascal M := A[i]; Equivale ao seguinte código em linguagem C if (i >= 0 && i < n) M = A[i]; • • 25 O acesso a um elemento do array Pascal: 3 instruções (etapa de verificação) C: 1 instrução (sem etapa de verificação) • • Universidade Federal do Espírito Santo CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES Comportamento Assintótico • Ignorar essas constantes de multiplicação equivale a ignorar as particularidades de cada linguagem e compilador e analisar apenas a ideia do algoritmo • Assim, nossa função pode ser reduzida para “f(n) = n” Descartando todos os termos constantes e mantendo apenas o de maior crescimento, obtemos o “comportamento assintótico” Trata-se do comportamento de uma função “f(n)” quando “n” tende ao infinito Isso acontece porque o termo que possui o maior expoente domina o comportamento da função “f(n)” quando “n” tende ao infinito • • • 26 Universidade Federal do Espírito Santo CCENS-UFES 13 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Comportamento Assintótico • Para entender melhor, considere duas funções: “g(n) = 1000n + 500” “h(n) = n^2 + n + 1” Apesar da função “g(n)” possuir constantes maiores multiplicando seus termos, existe um valor de “n” a partir do qual o resultado de “h(n)” é sempre maior do que “g(n)”, tornando os demais termos e constantes pouco importantes 27 Universidade Federal do Espírito Santo CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES Comportamento Assintótico 1000n + 500 n^2 + n + 1 28 Universidade Federal do Espírito Santo CCENS-UFES 14 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Comportamento Assintótico • Podemos então suprimir os termos menos importantes da função e considerar apenas o termo de maior grau Assim, podemos descrever a complexidade usando somente o seu custo dominante: “n” para a função “g(n)” “n^2” para a função “h(n)” • 29 Universidade Federal do Espírito Santo CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES Comportamento Assintótico • • Abaixo podemos ver alguns exemplos de função de custo juntamente com o seu comportamento assintótico Se a função não possui nenhum termo multiplicativo por “n”, seu comportamento assintótico é constante (1) Função de custo f(n) = 105 f(n) = 15n+2 f(n) = n2+5n+2 f(n) = 5n3+200n2+112 30 Comportamento Assintótico f(n) = 1 f(n) = n f(n) = n2 f(n) = n3 Universidade Federal do Espírito Santo CCENS-UFES 15 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Comportamento Assintótico • De modo geral, podemos obter a função de custo de um programa simples apenas contando os comandos de laços aninhados “Exemplos” Algoritmo sem laço: número constante de instruções (exceto se houver recursão), ou seja, “f(n) = 1” Com um laço indo de 1 a “n” será “f(n) = n” (ou seja, um conjunto de instruções constantes antes e/ou depois do laço e um conjunto de instruções constantes dentro do laço) Dois comandos de laço aninhados será “f(n) = n2”, e assim por diante • • • 31 Universidade Federal do Espírito Santo CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES TIPOS DE ANÁLISE ASSINTÓTICA 32 Universidade Federal do Espírito Santo CCENS-UFES 16 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Tipos de Análise Assintótica • A seguir, são matematicamente descritas outras formas de análise assintótica • • • • • 33 “Notação Grande-Omega” “Notação Grande-O” “Notação Grande-Theta” “Notação Pequeno-o” “Notação Pequeno-omega” Universidade Federal do Espírito Santo CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES Notação Grande-Omega • • • • 34 Descreve o “limite assintótico inferior” de um algoritmo É a notação utilizada para analisar o “melhor caso” do algoritmo. A notação (n2) nos diz que o custo do algoritmo é, assintoticamente, maior ou igual a n2 Em outras palavras, o custo do algoritmo original é no “mínimo” tão ruim quanto n2 Universidade Federal do Espírito Santo CCENS-UFES 17 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Notação Grande-O • • • • 35 Descreve o “limite assintótico superior” de um algoritmo É a notação utilizada para analisar o “pior caso” do algoritmo. A notação O(n2) nos diz que o custo do algoritmo é, assintoticamente, menor ou igual a n2 Em outras palavras, o custo do algoritmo original é no “máximo” tão ruim quanto n2 Universidade Federal do Espírito Santo CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES Notação Grande-Theta • • • • 36 Descreve o “limite assintótico firme” ou “estreito” de um algoritmo É a notação utilizada para analisar o limite “inferior” e “superior” do algoritmo. A notação (n2) nos diz que o custo do algoritmo é, assintoticamente, igual a n2 Em outras palavras, o custo do algoritmo original é n2 dentro de um fator constante “acima” e “abaixo” Universidade Federal do Espírito Santo CCENS-UFES 18 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Notação Pequeno-o e Pequeno-omega • • • Parecidas com as notações “Grande-O” e “GrandeOmega” As notações “Grande-O” e “Grande-Omega” possuem uma relação de “menor ou igual” e “maior ou igual” As notações “Pequeno-o” e “Pequeno-omega” possuem uma relação de “menor” e “maior” • Ou seja, não representam limites próximos da função, mas apenas estritamente • • 37 “Superiores”: sempre maior “Inferiores”: sempre menor Universidade Federal do Espírito Santo CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES NOTAÇÃO GRANDE-O 38 Universidade Federal do Espírito Santo CCENS-UFES 19 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Notação Grande-O • • • • • 39 Universidade Federal do Espírito Santo - CCENS-UFES • • • Existem várias formas de análise assintótica A mais conhecida e utilizada é a notação “Grande-O”, “O” Representa o custo (seja de tempo ou de espaço) do algoritmo no pior caso possível para todas as entradas de tamanho “n” Ou seja, ela analisa o limite superior de entrada Desse modo, podemos dizer que o comportamento do nosso algoritmo não pode nunca ultrapassar um certo limite Universidade Federal do Espírito Santo CCENS-UFES Exemplo: ordenação usando SelectionSort Dado um array “y” de tamanho “n”, procurar o menor valor (posição “me”) e colocar na primeira posição Repetir processo para a segunda posição, depois para a terceira, etc. Para quando o array estiver ordenado void selectionSort(int *V, int n) { int i, j, me, troca; for (i=0; i<n-1; i++) { me = i; for (j=i+1; j<n; j++) { if (V[j] < V[me]) me = j; } if (i != me) { troca = V[i]; V[i] = V[me]; V[me] = troca; } } } Universidade Federal do Espírito Santo 40 CCENS-UFES 20 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Exemplo: ordenação usando SelectionSort • • • Temos dois comandos de laço Laço externo: executando “n” vezes Laço interno: número de execuções Depende do valor do índice do laço externo (n-1, n-2..., 2, 1) void selectionSort(int *V, int n) { int i, j, me, troca; for (i=0; i<n-1; i++) { me = i; for (j=i+1; j<n; j++) { if (V[j] < V[me]) me = j; } if (i != me) { troca = V[i]; V[i] = V[me]; V[me] = troca; } } } Universidade Federal do Espírito Santo 41 CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES Exemplo: ordenação usando SelectionSort • Para calcularmos o custo do “selection sort” temos que calcular o resultado da soma “1 + 2 + .... + (n – 1) + n” Essa soma representa o número de execuções do laço interno, algo que não é tão simples de se calcular • • Dependendo do algoritmo, calcular o seu custo exato pode ser uma tarefa muito complicada No nosso caso, a soma “1 + 2 + .... + (n – 1) + n” equivale a soma dos “n” termos de uma “progressão aritmética” de razão 1 n(1+n) “1 + 2 + .... + (n – 1) + n” => • 2 42 Universidade Federal do Espírito Santo CCENS-UFES 21 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES • • • • Exemplo: ordenação usando SelectionSort Sabemos agora que o número de execuções do laço interno é “(n(1 + n))/2” Uma alternativa mais simples seria estimar um “limite superior” A ideia é alterar o algoritmo para algo “menos eficiente” do que temos Assim, saberemos que o algoritmo original é no máximo tão ruim, ou talvez melhor, que o novo algoritmo Universidade Federal do Espírito Santo CCENS-UFES 43 Universidade Federal do Espírito Santo - CCENS-UFES • • • Exemplo: ordenação usando SelectionSort Podemos diminuir a eficiência do “selection sort” trocando o laço interno (que muda de tamanho a cada execução do laço externo) por um laço que seja executado sempre “n vezes” Isso simplifica a análise do custo do algoritmo e também piora o seu desempenho já que algumas execuções do laço interno serão inúteis. Agora temos dois comandos de laço aninhados sendo executados “n” vezes cada A função de custo passa a ser f(n) = n2 Utilizando a notação “grande-O”, podemos dizer que o custo do algoritmo no pior caso é O(n2) • • 44 Universidade Federal do Espírito Santo CCENS-UFES 22 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Exemplo: ordenação usando SelectionSort “Notação Grande-O” A notação O(n2) nos diz que o custo do algoritmo não é, assintoticamente, pior do que n2 Em outras palavras, o custo do algoritmo original é no máximo tão ruim quanto n2 Pode ser melhor, mas nunca pior • • • • • 45 Assim, com a notação “grande-O” podemos estabelecer o “limite superior” para a complexidade real de um algoritmo Isso significa que o nosso programa nunca vai ser mais lento do que um determinado limite Universidade Federal do Espírito Santo CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES CLASSES DE PROBLEMAS 46 Universidade Federal do Espírito Santo CCENS-UFES 23 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Classes de Problemas • • • • Algumas classes de complexidade de problemas são mais comumente usadas. “O(1): ordem constante” • As instruções são executadas um número fixo de vezes. Não depende do tamanho dos dados de entrada “O(log(n)): ordem logarítmica” • Típica de algoritmos que resolvem um problema transformando-o em problemas menores “O(n): ordem linear” • Em geral, uma certa quantidade de operações é realizada sobre cada um dos elementos de entrada Universidade Federal do Espírito Santo CCENS-UFES 47 Universidade Federal do Espírito Santo - CCENS-UFES Classes de Problemas • • 48 “O(nlog(n)): ordem log linear” • Típica de algoritmos que trabalham com particionamento dos dados. Esses algoritmos resolvem um problema transformando-o em problemas menores, que são resolvidos de forma independente e depois unidos (ex: Quicksort) “O(n2): ordem quadrática” • Normalmente ocorre quando os dados são processados aos pares. Uma característica deste tipo de algoritmos é a presença de um aninhamento de dois comandos de repetição Universidade Federal do Espírito Santo CCENS-UFES 24 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Classes de Problemas • • • “O(n3): ordem cúbica” • É caracterizado pela presença de três estruturas de repetição aninhadas “O(2n): ordem exponencial” • Geralmente ocorre quando se usa uma solução de “força bruta”. Não são úteis do ponto de vista prático “O (n!): ordem fatorial” • Geralmente ocorre quando se usa uma solução de “força bruta”. Não são úteis do ponto de vista prático. Possui um comportamento muito pior que o exponencial Universidade Federal do Espírito Santo CCENS-UFES 49 Universidade Federal do Espírito Santo - CCENS-UFES Classes de Problemas • Comparação no tempo de execução. Considerando que o computador hipotético seja capaz de executar um milhão de operações por segundo f(n) n n log n n2 n3 2n 3n 50 n = 10 1,0E-05 segundos 3,3E-05 segundos 1,0E-04 segundos 1,0E-03 segundos 1,0E-03 segundos 5,9E-02 segundos n = 20 2,0E-05 segundos 8,6E-05 segundos 4,0E-04 segundos 8,0E-03 segundos 1,0 segundo n = 30 4,0E-05 segundos 2,1E-04 segundos 1,6E-03 segundos 6,4E-02 segundos 2,8 dias n = 50 5,0E-05 segundos 2,8E-04 segundos 2,5E-03 segundos 0,13 segundos 35,7 anos 58,1 minutos 3855,2 séculos 2,3E+08 séculos n = 100 6,0E-05 segundos 3,5E-04 segundos 3,6E-03 segundos 0,22 segundos 365,6 séculos 1,3E+13 séculos Universidade Federal do Espírito Santo CCENS-UFES 25 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Classes de Problemas • • Na análise assintótica as constantes de multiplicação são consideradas irrelevantes e descartadas. Porém, elas podem ser relevantes na prática, principalmente se o tamanho da entrada é pequeno “Exemplo” f(n) = 10100n • • • 51 e g(n) = 10n log n Análise assintótica: o primeiro é mais eficiente, complexidade “O(n)” enquanto o outro é “O(n log n)” No entanto, 10100 é um número muito grande.neste caso, 10n log n > 10100n apenas para n > 210 99 Para qualquer valor menor de “n” o algoritmo de complexidade “O(n\log n)” será melhor Universidade Federal do Espírito Santo CCENS-UFES Universidade Federal do Espírito Santo - CCENS-UFES Exercício • • 52 Forneça uma descrição em pseudocódigo de um algoritmo de tempo O(n) para calcular a função potência p(x, n). Desenhe também o rastreamento recursivo deste algoritmo para o cálculo de p(2, 5). Universidade Federal do Espírito Santo CCENS-UFES 26 28/03/2017 Universidade Federal do Espírito Santo - CCENS-UFES Exercício função p(x, n) se (n = 0) entao retorna 1 senao retorna x * p(x, n-1) X 2 2 2 2 2 2 N 5 4 3 2 1 0 Retorno 32 16 8 4 2 1 Universidade Federal do Espírito Santo CCENS-UFES 53 Universidade Federal do Espírito Santo - CCENS-UFES Próximo Conteúdo - Busca em memória primária ‣Busca sequencial; ‣Busca binária; 54 C.H. Prevista 4 horas Universidade Federal do Espírito Santo CCENS-UFES 27