Medida do Tempo de Execução de um Programa Bruno Hott Algoritmo e Etrutura de Dado I DECSI UFOP
Clae de Comportamento Aintótico Se f é uma função de complexidade para um algoritmo F, então O(f) é coniderada a complexidade aintótica ou o comportamento aintótico do algoritmo F. A relação de dominação aintótica permite comparar funçõe de complexidade. Entretanto, e a funçõe f e g dominam aintoticamente uma a outra, então o algoritmo aociado ão equivalente. Nete cao, o comportamento aintótico não erve para comparar o algoritmo
Clae de Comportamento Aintótico Por exemplo, conidere doi algoritmo F e G aplicado à mema clae de problema, endo que F leva trê veze o tempo de G ao erem executado, ito é, f(n) = 3g(n), endo que O(f(n)) = O(g(n)). Logo, o comportamento aintótico não erve para comparar o algoritmo e F e G, porque ele diferem apena por uma contante. Podemo avaliar programa comparando a funçõe de complexidade, negligenciando a contante de proporcionalidade.
Comparação de Programa Um programa com tempo de execução O(n) é melhor que outro com tempo O(n²) Porém, a contante de proporcionalidade podem alterar eta conideração Exemplo: um programa leva 100n unidade de tempo para er executado e outro leva 2n². Qual do doi programa é melhor? Depende do tamanho do problema. Para n < 50, o programa com tempo 2n² é melhor do que o que poui tempo 100n. Para problema com entrada de dado pequena é preferível uar o programa cujo tempo de execução é O(n²). Entretanto, quando n crece, o programa com tempo de execução O(n²) leva muito mai tempo que o programa O(n).
Principai Clae de Problema f(n) = O(1) Algoritmo de complexidade O(1) ão dito de complexidade contante. Uo do algoritmo independe de n. A intruçõe do algoritmo ão executada um número fixo de veze.
Principai Clae de Problema f(n) = O(log n) Um algoritmo de complexidade O(log n) é dito ter complexidade logarítmica. Típico em algoritmo que tranformam um problema em outro menore. Pode-e coniderar o tempo de execução como menor que uma contante grande. Quando n é mil, log2 n 10, quando n é 1 milhão, log 2 n 20. Para dobrar o valor de log n temo de coniderar o quadrado de n. A bae do logaritmo muda pouco ete valore: quando n é 1 milhão, o log 2 n é 20 e o log 10 n é 6.
Principai Clae de Problema f(n) = O(n) Um algoritmo de complexidade O(n) é dito ter complexidade linear Em geral, um pequeno trabalho é realizado obre cada elemento de entrada É a melhor ituação poível para um algoritmo que tem de procear/produzir n elemento de entrada/aída. Cada vez que n dobra de tamanho, o tempo de execução dobra.
Principai Clae de Problema f(n) = O(n log n) Típico em algoritmo que quebram um problema em outro menore, reolvem cada um dele independentemente e junta a oluçõe depoi. Quando n é 1 milhão, nlog2 n é cerca de 20 milhõe. Quando n é 2 milhõe, nlog2 n é cerca de 42 milhõe, pouco mai do que o dobro.
Principai Clae de Problema f(n) = O(n 2 ) Um algoritmo de complexidade O(n 2) é dito ter complexidade quadrática. Ocorrem quando o iten de dado ão proceado ao pare, muita veze em um anel dentro de outro. Quando n é mil, o número de operaçõe é da ordem de 1 milhão. Sempre que n dobra, o tempo de execução é multiplicado por 4. Útei para reolver problema de tamanho relativamente pequeno.
Principai Clae de Problema f(n) = O(n 3 ) Um algoritmo de complexidade O(n 3) é dito ter complexidade cúbica. Útei apena para reolver pequeno problema. Quando n é 100, o número de operaçõe é da ordem de 1 milhão. Sempre que n dobra, o tempo de execução fica multiplicado por 8.
Principai Clae de Problema f(n) = O(2 n ) Um algoritmo de complexidade O(2 n) é dito ter complexidade exponencial. Geralmente não ão útei ob o ponto de vita prático. Ocorrem na olução de problema quando e ua força bruta para reolvê-lo. Quando n é 20, o tempo de execução é cerca de 1 milhão. Quando n dobra, o tempo fica elevado ao quadrado.
Principai Clae de Problema f(n) = O(n!) Um algoritmo de complexidade O(n!) é dito ter complexidade exponencial, apear de O(n!) ter comportamento muito pior do que O(2 n ). Geralmente ocorrem quando e ua força bruta para na olução do problema. n = 20 20! = 2432902008176640000, um número com 19 dígito. n = 40 um número com 48 dígito.
Comparação de Funçõe de Complexidade f(n) n Tamanho n 10 20 30 40 50 60 0,00001 n 2 0,0001 n 3 0,001 n 5 0,1 2 n 0,001 3 n 0,059 0,00002 0,0004 0,008 3,2 1,0 58 min 0,00003 0,0009 0,027 24,3 17,9 min 6,5 ano 0,00004 0,0016 0,64 1,7 min 12,7 dia 3855 éc 0,00005 0,0025 0,125 5,2 min 35,7 ano 10 8 éc 0,00006 0,0036 0,316 13 min 366 éc 10 13 éc
Comparação de Funçõe de Complexidade Função de cuto de tempo Computador atual (tamanho) Computador 100 veze mai rápido Computador 1000 veze mai rápido n t 1 100 t 1 1000 t 1 n 2 t 2 10 t 2 31,6 t 2 n 3 t 3 4,6 t 3 10 t 3 2 n t 4 t 4 + 6,6 t 4 + 10 *t = tamanho do problema
Algoritmo Polinomial Algoritmo exponencial no tempo de execução tem função de complexidade O(c n ); c > 1. Algoritmo polinomial no tempo de execução tem função de complexidade O(p(n)), onde p(n) é um polinômio. A ditinção entre ete doi tipo de algoritmo torna-e ignificativa quando o tamanho do problema a er reolvido crece. Por io, o algoritmo polinomiai ão muito mai útei na prática do que o exponenciai.
Algoritmo Exponenciai x Polinomiai Algoritmo exponenciai ão geralmente imple variaçõe de pequia exautiva. Algoritmo polinomiai ão geralmente obtido mediante entendimento mai profundo da etrutura do problema. Um problema é coniderado: intratável: e não exite um algoritmo polinomial para reolvê-lo. bem reolvido: quando exite um algoritmo polinomial para reolvê-lo.
Algoritmo Exponenciai x Polinomiai - Exceçõe A ditinção entre algoritmo polinomiai eficiente e algoritmo exponenciai ineficiente poui vária exceçõe. Exemplo: um algoritmo com função de complexidade f(n) = 2 n é mai rápido que um algoritmo g(n) = n 5 para valore de n menore ou iguai a 20. Também exitem algoritmo exponenciai que ão muito útei na prática. Exemplo: o algoritmo Simplex para programação linear poui complexidade de tempo exponencial para o pior cao ma executa muito rápido na prática. Tai exemplo não ocorrem com freqüência na prática, e muito algoritmo exponenciai conhecido não ão muito útei.
Exemplo de Algoritmo Exponencial Um caixeiro viajante deeja viitar n cidade de tal forma que ua viagem inicie e termine em uma mema cidade, e cada cidade deve er viitada uma única vez Supondo que empre há uma etrada entre dua cidade quaiquer, o problema é encontrar a menor rota para a viagem. A figura ilutra o exemplo para quatro cidade c1, c2, c3, c4, em que o número no arco indicam a ditância entre dua cidade. O percuro <c 1, c 3, c 4, c 2, c 1 > é uma olução para o problema, cujo percuro total tem ditância 24.
Exemplo de Algoritmo Exponencial Um algoritmo imple eria verificar toda a rota e ecolher a menor dela. Há (n - 1)! rota poívei e a ditância total percorrida em cada rota envolve n adiçõe, logo o número total de adiçõe é n!. No exemplo anterior teríamo 24 adiçõe. Suponha agora 50 cidade: o número de adiçõe eria 50! 10 64. Em um computador que executa 109 adiçõe por egundo, o tempo total para reolver o problema com 50 cidade eria maior do que 10 45 éculo ó para executar a adiçõe. O problema do caixeiro viajante aparece com frequência em problema relacionado com tranporte, ma também aplicaçõe importante relacionada com otimização de caminho percorrido.
Técnica de Análie de Algoritmo Determinar o tempo de execução de um programa pode er um problema matemático complexo; Determinar a ordem do tempo de execução, em preocupação com o valor da contante envolvida, pode er uma tarefa mai imple. A análie utiliza técnica de matemática dicreta, envolvendo contagem ou enumeração do elemento de um conjunto: manipulação de oma produto, permutaçõe, fatoriai, coeficiente binomiai, olução de equaçõe de recorrência
Análie do Tempo de Execução Comando de atribuição, de leitura ou de ecrita: O(1). Sequência de comando: determinado pelo maior tempo de execução de qualquer comando da equência. Comando de decião: tempo do comando dentro do comando condicional, mai tempo para avaliar a condição, que é O(1). Anel: oma do tempo de execução do corpo do anel mai o tempo de avaliar a condição para terminação (geralmente O(1)), multiplicado pelo número de iteraçõe. Procedimento não recurivo: cada um deve er computado eparadamente um a um, iniciando com o que não chamam outro procedimento. Avalia-e então o que chamam o já avaliado (utilizando o tempo dee). O proceo é repetido até chegar no programa principal.
Exemplo 1 void exemplo1 (int n) { int i, a; a=0; for (i=0; i<n; i++) a+=i; }
Exemplo 2 void exemplo2 (int n){ int i,j,a; a=0; for (i=0; i<n; i++) for (j=n; j>i; j--) a+=i+j; exemplo1(n); }
Procedimento Não Recurivo Algoritmo para ordenar o n elemento de um conjunto A em ordem acendente. void ordena(vetor A, int n){ int i, j, min, aux; 1 for(i=0; i < n-1; i++){ n-1 2 min = i; 3 for(j=i+1; j < n; j++){ 4 if(a[j] < A[min]) min = j; 5 aux = A[min]; 6 A[min] = A[i]; 7 A[i] = aux; } } n-1 + n-2 + + 1 = (1+n-1)n-1/2 = n(n-1)/2 = n²/2 - n/2 O que faz a função? Como? Qual a ua complexidade?
Algoritmo de Ordenação Seleciona o menor elemento do conjunto. Troca ete com o primeiro elemento A[0]. Repita a dua operaçõe acima com o n - 1 elemento retante, depoi com o n - 2, até que rete apena um.
Análie do Procedimento Não Recurivo Anel Interno Contém um comando de decião, com um comando apena de atribuição. Ambo levam tempo contante para erem executado. Quanto ao corpo do comando de decião, devemo coniderar o pior cao, aumindo que erá empre executado. O tempo para incrementar o índice do anel e avaliar ua condição de terminação é O(1). O tempo combinado para executar uma vez o anel é O(max(1, 1, 1)) = O(1), conforme regra da oma para a notação O Como o número de iteraçõe é n-i-1, o tempo gato no anel é O((n-i-1) x 1) = O(n-i-1), conforme regra do produto para a notação O.
Análie do Procedimento Não Recurivo Anel Externo Contém, além do anel interno, quatro comando de atribuição. O(max(1, (n-i-1), 1, 1, 1)) = O(n-i-1). A linha (1) é executada n-1 veze, e o tempo total para executar o programa etá limitado ao produto de uma contante pelo omatório de (n-i-1): n 2 i=0 (n i 1)=n 1+n 2+...+1= n(n 1) = n2 2 2 n 2 =O(n2 ) Se coniderarmo o número de comparaçõe como a medida de cuto relevante, o programa faz n 2 /2 - n/2 comparaçõe para ordenar n elemento. Se coniderarmo o número de troca, o programa realiza exatamente n - 1 troca.
Exercício 1 // Conidere A, B e C vetore globai void p1 (int n){ int i, j, k; } for (i=0; i<n; i++){ for (j=0; j<n; j++){ C[i][j]=0; for (k=n-1; k>=0; k--) C[i][j]=C[i][j]+A[i][k]*B[k][j]; } }
Exercício 2 void p2 (int n){ int i, j, x, y; } x = y = 0; for (i=1; i<=n; i++){ for (j=i; j<=n; j++) x = x + 1; for (j=1; j<i; j++) y = y + 1; }
Exercício 3 void p3 (int n){ int i, j, x, y; } x = y = 0; for (i=1; i<=n; i++) for (j=i; j<=n; j++) x = x + 1;