1 / 41

Análise Algorítmica (Notação Assintótica)

UPE – Caruaru – Sistemas de Informação Disciplina: Estrutura de Dados e Arquivo Prof.: Paulemir G. Campos. Análise Algorítmica (Notação Assintótica). Comportamento Assintótico de Funções. A análise de algoritmos para solucionar um problema de tamanho n é realizada para valores grandes de n.

tanuja
Download Presentation

Análise Algorítmica (Notação Assintótica)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. UPE – Caruaru – Sistemas de InformaçãoDisciplina: Estrutura de Dados e ArquivoProf.: Paulemir G. Campos Análise Algorítmica (Notação Assintótica) EDA - Prof. Paulemir Campos

  2. Comportamento Assintóticode Funções • A análise de algoritmos para solucionar um problema de tamanho n é realizada para valores grandes de n. • Para tanto, estuda-se o comportamento assintótico das funções de custo ou de complexidade do algoritmo. • O comportamento assintótico de f(n) representa o limite do custo quando n cresce. EDA - Prof. Paulemir Campos

  3. Comportamento Assintóticode Funções • Definição: Uma função f(n) domina assintoticamente outra função g(n) se existem duas constantes positivas c e m tais que, para n  m, temos |g(n)|  c.|f(n)| EDA - Prof. Paulemir Campos

  4. Comportamento Assintóticode Funções • Graficamente, temos: f, g c . f(n) g(n) n m EDA - Prof. Paulemir Campos

  5. Comportamento Assintóticode Funções • Exemplo: Seja g(n) = n e f(n) = -n2, com n pertencente a Z+. Por definição, temos: |g(n)|  c.|f(n)| | n |  c . |- n2 | n  c . n2 Note que, fazendo c=1 e m=1, f(n) domina assintoticamente g(n). EDA - Prof. Paulemir Campos

  6. Comportamento Assintóticode Funções f, g |f(n)| = c . n2, com c=1 • Graficamente, temos: g(n) = n n m = 1 EDA - Prof. Paulemir Campos

  7. Notação Assintótica ou Notação O • Para expressar que f(n) domina assintoticamente g(n), Knuth (1968, p.104) sugeriu uma notação para essa dominação assintótica. • Assim, escrevemos g(n)=O(f(n)), onde se lê g(n) é da ordem no máximo f(n). EDA - Prof. Paulemir Campos

  8. Notação Assintótica ou Notação O • Exemplo: • Se a complexidade de tempo de um algoritmo é g(n)=O(n2), isto significa que existem constantes positivas c e m tais que, para valores de n maiores ou iguais a m, g(n)  c. n2 , com n pertencente a Z+. EDA - Prof. Paulemir Campos

  9. Notação Assintótica ou Notação O • Definição: Uma função g(n) é O(f(n)) se existem duas constantes positivas c e m tais que, para n  m, temos |g(n)|  c.|f(n)| EDA - Prof. Paulemir Campos

  10. Notação Assintótica ou Notação O • Exemplo: Seja g(n) = (n+1)2, com n pertencente a Z+. Observe que g(n) é O(n2), quando m = 1 e c = 4, pois, por definição, temos: |g(n)|  c.|f(n)| | (n+1)2 |  c . | n2 | (n+1)2  c . n2 , com m = 1 (n+1)2  4 . n2, com n  1. EDA - Prof. Paulemir Campos

  11. Operações com a Notação O • Algumas delas são: • f(n) = O(f(n)) • c . f(n) = O(f(n)), com c pertencente a Z*+ • O(f(n)) + O(f(n)) = O(f(n)) • O(O(f(n))) = O(f(n)) • O(f(n))+O(g(n)) = O(max(f(n),g(n))) • O(f(n)).O(g(n)) = O(f(n).g(n)) • f(n).O(g(n))=O(f(n).g(n)) EDA - Prof. Paulemir Campos

  12. Operações com a Notação O Exemplos: • Obtenha a complexidade de tempo em notação O de alguns algoritmos dada pelas expressões matemáticas seguintes: • O(n) + O(n2) + O(n . log n), com n>0 = O(max(O(n),O(n2))) + O(n . log n) = O(n2) + O(n . log n) = O(max(O(n2),O(n . log n))) = O(n2), n>0. EDA - Prof. Paulemir Campos

  13. Operações com a Notação O f, g f(n) = n2 • Obtenção de O(max(O(n2),O(n . log n))) graficamente. g(n) = n . log n n n > 0 EDA - Prof. Paulemir Campos

  14. Operações com a Notação O • [log n + k + O(1/n)] . [n + O(n)], com n>1 = n.log n + log n . O(n) + k.n + k. O(n) + + n . O(1/n) + O(1/n). O(n) = O(n.log n) + O(n . log n) + k.O(n) + k.O(n) + + O(n. 1/n) + O(1/n . n) = O(n.log n)+O(n . log n)+k.O(max(O(n),O(n))) + + O(max(O(n. 1/n),O(n . 1/n))) = O(n.log n) + O(n . log n) + k.O(n) + O(n . 1/n) EDA - Prof. Paulemir Campos

  15. Operações com a Notação O • (Continuação) = O(n.log n) + O(n . log n) + k.O(n) + O(n . 1/n) Note que, com n>1, para qualquer valor de k, com k>0, f(n) = k . n domina assintoticamente g(n) = n . 1/n. Assim, temos: = O(n.log n) + O(n . log n) + k.O(n) = O(max(O(n.log n),O(n . log n))) + k.O(n) = O(n. log n) + k.O(n), n>1. EDA - Prof. Paulemir Campos

  16. Operações com a Notação O • (Continuação) = O(n. log n) + k.O(n), n>1. Obs.: Note que, com k=1, f(n) = n . log n domina assintoticamente g(n) = k . n, com n  10. Por sua vez, com k=10, g(n) = k . n domina assintoticamente f(n) = n . log n, com 1 < n <1010. Portanto, devido a forte dependência do valor de k, vamos deixar a resposta como mostrada acima. EDA - Prof. Paulemir Campos

  17. Operações com a Notação O f, g f(n) = n • Obtenção de O(max(O(n),O(n))) graficamente. g(n) = n n n > 1 EDA - Prof. Paulemir Campos

  18. Operações com a Notação O f, g • Obtenção de O(max(O(n. 1/n), O(n . 1/n))) graficamente. f(n) = n . 1/n g(n) = n . 1/n n n > 1 EDA - Prof. Paulemir Campos

  19. Operações com a Notação O f, g • Obtenção de O(max(O(n.log n), O(n . log n))) graficamente. f(n) = n . log n g(n) = n . log n n n > 1 EDA - Prof. Paulemir Campos

  20. Operações com a Notação O n = 10 f, g • Análise gráfica de O(n. log n) e k.O(n), n>1 e k=1. • Neste caso, temos g(n) = k . n (k=1) dominando assintoticamente f(n) = n . log n, para 1 < n <10. g(n) = k . n, com k=1 f(n) = n . log n n EDA - Prof. Paulemir Campos

  21. Constantes Multiplicativas versus Notação Assintótica • Por questão de simplificação, na obtenção de uma notação assintótica, deve-se desprezar constantes e adições. • Geralmente por isso, a notação assintótica não serve para comparar dois algoritmos, mas sim, nos fornece uma idéia da complexidade de execução de um em relação ao outro. EDA - Prof. Paulemir Campos

  22. Constantes Multiplicativas versus Notação Assintótica • Exemplo: • Um algoritmo F possui complexidade de tempo f(n) = 100 . n, isto é, O(n) e um outro algoritmo G é dado por g(n) = 2.n2, ou seja, O(n2). Qual desses dois algoritmos é melhor para resolver um problema de tamanho n? EDA - Prof. Paulemir Campos

  23. Constantes Multiplicativas versus Notação Assintótica • Resposta: • Depende! Note que para valores menores do que 50 (n<50), o algoritmo G [O(n2)] é melhor, g(n) = 2.n2 (É dominado assintoticamente por f(n) = 100.n). • Por outro lado, para valores maiores ou iguais a 50 (n  50), o algoritmo F [O(n)] é melhor, f(n) = 100.n (É dominado assintoticamente por g(n)= 2.n2). EDA - Prof. Paulemir Campos

  24. Classes de Comportamento Assintótico • As principais classes de problemas possuem as seguintes funções de complexidade: • f(n)=O(1): São algoritmos de complexidade constante. O uso desses algoritmos independem do tamanho de n. Neste caso, as instruções do algoritmo são executadas um número fixo de vezes. EDA - Prof. Paulemir Campos

  25. Classes de Comportamento Assintótico • f(n)=O(log n): São algoritmos de complexidade logarítmica. Este tempo de execução ocorre tipicamente em algoritmos que resolvem um problema transformando-o em problemas menores. • f(n)=O(n): São algoritmos de complexidade linear. Em geral, um pequeno trabalho é realizado sobre cada elemento de entrada. EDA - Prof. Paulemir Campos

  26. Classes de Comportamento Assintótico • f(n)=O(n .log n): Este tempo de execução ocorre tipicamente em algoritmos que resolvem um problema quebrando-o em problemas menores, resolvendo cada um deles independentemente e depois junta-se as soluções. • f(n)=O(n2): São algoritmos de complexidade quadrática. Geralmente isto ocorre quando há processamento com um laço dentro do outro. São úteis quando n é relativamente pequeno. EDA - Prof. Paulemir Campos

  27. Classes de Comportamento Assintótico • f(n)=O(n3): São algoritmos de complexidade cúbica. Úteis apenas para resolver pequenos problemas. • f(n)=O(2n): São algoritmos de complexidade exponencial. Tais algoritmos geralmente não são úteis para resolver problemas do ponto de vista prático. Ocorrem em problemas quando se usa “força bruta” para resolvê-los. EDA - Prof. Paulemir Campos

  28. Classes de Comportamento Assintótico • Sobre classes de comportamento assintótico destacam-se: • f(n)=O(cn), c>1: Algoritmos com essa função de complexidade são chamados de algoritmos exponenciais no tempo de execução. • f(n)=O(p(n)), p(n) é um polinômio: Já algoritmos cuja função de complexidade é um polinômio são conhecidos por algoritmos polinomiais no tempo de execução. EDA - Prof. Paulemir Campos

  29. Classes de Comportamento Assintótico • Algoritmos Exponenciais • Quando o tamanho de n é grande, tornam-se bastante ineficientes na prática; • São geralmente simples variações de pesquisa exaustiva; • Problemas solucionados apenas por tais algoritmos são considerados intratáveis, isto é, não existe solução por algoritmo polinomial. EDA - Prof. Paulemir Campos

  30. Classes de Comportamento Assintótico • Algoritmos Polinomiais • Quando o tamanho de n é grande, tornam-se muito úteis na prática; • São geralmente obtidos através de um entendimento mais profundo da estrutura do problema; • Apresentam boa solução, isto é, um problema é considerado bem resolvido quando existe um algoritmo polinomial para resolvê-lo. EDA - Prof. Paulemir Campos

  31. Comparação entre Funções de Complexidade Segundo Garey e Johnson (1979, pág. 7), temos: OBS.: Um algoritmo linear executa em 1s um milhão de operações. EDA - Prof. Paulemir Campos

  32. Técnicas de Análise de Algoritmos • Determinar a ordem de tempo de execução de um algoritmo (notação O) é em geral mais simples do que encontrar a expressão matemática exata da função de complexidade. EDA - Prof. Paulemir Campos

  33. Técnicas de Análise de Algoritmos • Tentando tornar mais simples a tarefa de obter tal expressão matemática, Aho, Hopcroft e Ullman (1983) enumeraram alguns princípios a serem seguidos: • 1. Operação de atribuição, leitura ou escrita são consideradas como O(1). Exceções: Chamada de função em comando de atribuição e atribuições que envolvem vetores de tamanho arbitrariamente grandes. EDA - Prof. Paulemir Campos

  34. Técnicas de Análise de Algoritmos • 2. O tempo de execução de uma seqüência de comandos é determinado pelo maior tempo de execução de qualquer comando dessa seqüência (operação dominante). • 3. O tempo de execução de um comando de decisão é composto pelo tempo de execução dos comandos executados dentro do comando condicional mais o tempo para avaliar a condição, que é O(1). EDA - Prof. Paulemir Campos

  35. Técnicas de Análise de Algoritmos • 4. O tempo para executar um laço é a soma do tempo de execução do corpo do laço mais o tempo de avaliar a condição de parada (geralmente é O(1)), multiplicado pelo número de iterações do laço. • 5. Quando o algoritmo possui procedimentos não recursivos, o tempo de execução de cada procedimento deve ser computado separadamente um a um, iniciando com os procedimentos que não chamam outros procedimentos. EDA - Prof. Paulemir Campos

  36. Técnicas de Análise de Algoritmos • 5. (Continuação) Depois, avalia-se os procedimentos que chamam os procedimentos que não chamam outros procedimentos, utilizando os tempos dos procedimentos já avaliados. Este processo é repetido até chegar no algoritmo principal. EDA - Prof. Paulemir Campos

  37. Técnicas de Análise de Algoritmos • 6. Quando o algoritmo possui procedimentos recursivos, para cada procedimento é associada uma função de complexidade f(n) desconhecida, onde n mede o tamanho dos argumentos para o procedimento. Outra opção é determinar o número total de chamadas recursivas, calcular a complexidade de uma dessas chamadas recursivas (sem considerar outras chamadas), e efetuar esse produto. EDA - Prof. Paulemir Campos

  38. Técnicas de Análise de Algoritmos • Exemplo: Obtenha a função de complexidade de tempo e também em notação O do algoritmo abaixo: inteiro Fatorial(inteiro i){ // i  0 se i=<1 entãoretorne (1) senãoretorne (i * Fatorial(i-1)) } EDA - Prof. Paulemir Campos

  39. Técnicas de Análise de Algoritmos • Resposta: a) Obtenção da função de complexidade de tempo. - Esse procedimento recursivo é chamado n vezes; - A complexidade de uma chamada é constante, isto é, O(1). Pois, para n  1, apenas uma atribuição é executada; e para n > 1 apenas um produto é efetuado. EDA - Prof. Paulemir Campos

  40. Técnicas de Análise de Algoritmos • Resposta: a) (Continuação) - Logo, temos um produto de n por 1. Assim, f(n)=n é a função de complexidade de tempo desse algoritmo recursivo. b) Como f(n) = n é a função de complexidade de tempo desse algoritmo, então, trata-se de um algoritmo polinomial de ordem O(n). EDA - Prof. Paulemir Campos

  41. Referências Bibliográficas • Ziviani, N. Projeto de Algoritmos: Com implementações em Pascal e C. São Paulo: Pioneira, 5a. ed., 1999. • Szwarcfiter, J. L.; Markenzon, L. Estruturas de Dados e seus Algoritmos. Rio de Janeiro: LTC, 2a. ed., 1994. EDA - Prof. Paulemir Campos

More Related