Baixe o app para aproveitar ainda mais
Prévia do material em texto
08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 1/28 ANÁLISE DE ALGORITMOSANÁLISE DE ALGORITMOS UNIDADE 1 – ALGORITMOS EUNIDADE 1 – ALGORITMOS E ORDENAÇÃO EM MEMÓRIAORDENAÇÃO EM MEMÓRIA PRIMÁRIA PRIMÁRIA Autor: Thiago Nascimento Rodrigues Autor: Thiago Nascimento Rodrigues Revisor: Bruno Carreira Coutinho Silva Revisor: Bruno Carreira Coutinho Silva INICIAR Introdução Caro(a) estudante, A noção de algoritmo está presente em qualquer tarefa que precise ser realizada e que demande uma sequência de passos bem definida. Sob uma perspectiva computacional, esse mesmo conceito se faz presente quando é preciso especificar para um computador algum conjunto de operações que ele deve executar. Uma das tarefas mais comuns detalhadas via algoritmos computacionais é a ordenação de dados em memória. Várias são as estratégias conhecidas para se realizar esse tipo de operação de maneira eficiente. Nesta unidade, teremos uma visão mais precisa do conceito de algoritmos computacionais e de como é possível fazer uma medição do desempenho desses procedimentos. Nesse cenário, serão explorados dois algoritmos projetados para ordenar dados na memória principal de um computador. As diferentes estratégias implementadas por esses algoritmos serão detalhadas e a eficiência de cada um deles será avaliada através de uma métrica amplamente utilizada na Ciência da Computação. 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 2/28 1.1 Fundamentação Matemática dos Algoritmos Algoritmos estão presentes no dia a dia das pessoas em geral. As instruções para uso de medicamentos, o passo a passo de montagem de um equipamento ou uma receita culinária são alguns exemplos de algoritmos. Um algoritmo pode ser visto como uma sequência de ações executáveis para a obtenção de uma solução para um determinado tipo de problema. Segundo Dijkstra (1971), um algoritmo corresponde a uma descrição de um padrão de comportamento, expresso em termos de um conjunto finito de ações. Por exemplo, ao executar a operação a + b é possível identificar um mesmo padrão de comportamento, ainda que a operação seja realizada para distintos valores de a e b. A descrição formal de qualquer algoritmo, assim como a caracterização mais precisa de seu desempenho, é comumente fundamentada em conceitos e notações matemáticas. Uma técnica amplamente utilizada na análise do comportamento de algoritmos é conhecida como indução matemática . De maneira sucinta, ela é usada para verificar que determinada afirmação (operação) é válida para qualquer valor natural (número inteiro maior que zero) informado. Para isso, dois passos devem ser dados: Passo 1 (Caso base): Mostrar que a afirmação é verdadeira para um valor inicial. Passo 2 (Passo de indução) : Mostrar que se a afirmação for verdadeira para os n primeiros números ( n primeiras iterações), então a afirmação é verdadeira para os n + 1 números ( n + 1 iterações). Como exemplo, considere a seguinte série de equações que já foram descobertas várias vezes de forma independente ao longo dos anos: 1 = 1 1 + 3 = 2 1 + 3 + 5 = 3 1 + 3 + 5 + 7 = 4 1 + 3 + 5 + 7 + 9 = 5 #PraCegoVer : Sequência de 5 equações, uma em cada linha. Cada linha i contém a soma dos i- ésimos primeiros números ímpares positivos. Assim, na primeira linha, temos 1 igual a 1 ao quadrado. Na segunda linha, 1 mais 3 igual a 2 ao quadrado. Na terceira linha, 1 mais 3 mais 5 igual a 3 ao quadrado. Na Bons estudos! 2 2 2 2 2 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 3/28 quarta linha, 1 mais 3 mais 5 mais 7 igual a 4 ao quadrado. E na última linha, 1 mais 3 mais 5 mais 7 mais 9 igual a 5 ao quadrado. Ela pode ser formulada pela seguinte propriedade geral: 1 + 3 + 5 + … + (2 n – 1) = n . #PraCegoVer : Equação geral da soma de n números ímpares positivos, representada por 1 mais 3 mais 5 e essa soma se repete até o limite de 2n menos 1 resultando em n elevado ao quadrado. Inicialmente, a equação acima será chamada de P(n) . Logo, busca-se mostrar que P(n) é válida para todo número positivo n . Seguindo os dois passos estabelecidos pela técnica de indução matemática temos: Caso base: Como 1 = 1 , temos que P (1) é válido. Passo de indução: Se todo P (1), …, P ( n ) é válido, então, em particular, P ( n ) é válido. Neste caso, se adicionarmos o termo 2 n + 1 em ambos os lados da propriedade geral formulada acima, temos que: 1 + 3 + 5 + … + (2 n – 1) + (2 n + 1) = n + 2 n + 1 = ( n + 1) #PraCegoVer : Equação geral da soma de n + 1 números ímpares. Ela é representada por 1 mais 3 mais 5 e essa soma se repete até o limite de 2n menos 1 mais 2n mais 1, sendo igual a n ao quadrado mais 2n mais 1, que é igual a n mais 1 elevado ao quadrado. demonstrando assim que P ( n + 1) também é válido. VOCÊ SABIA? Até o ano 1957, a palavra algoritmo não estava presente nos dicionários mais conceituados internacionalmente. Apenas a forma “ algorism ”, de significado mais antigo – o processo de fazer aritmética usando algarismos arábicos – era encontrada. Com o passar dos anos, historiadores matemáticos recuperaram a origem da palavra: ela deriva do nome do um famoso matemático persa Abdu Abdullah Mohamed ben Musa Al-Khwarizmi (viveu entre os anos 780 a 850). Gradualmente, a forma e o significado da palavra foram sendo modificados até alcançar a escrita atual: algoritmo (KNUTH, 1997). O operador somatório é outro elemento matemático muito empregado na descrição de algoritmos computacionais. Basicamente ele é utilizado para apresentar de forma compacta a adição de sequências de números. Neste caso, a soma de uma sequência a , a , …, a de números pode ser expressa como 2 2 2 2 1 2 n 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 4/28 #PraCegoVer : Notações de dois somatórios equivalentes. O primeiro é um somatório de a índice j com j variando de 1 a n; o segundo é o somatório de a índice j com j maior ou igual a 1 e menor ou igual a n. Duas operações algébricas simples envolvendo somatórios são muito importantes e a familiaridade com eles torna possível a solução de muitos problemas. Elas são descritas a seguir. » Propriedade distributiva #PraCegoVer : Aplicação da propriedade distributiva sobre dois somatórios. O somatório de a índice i seguido do somatório de b índice j é igual ao somatório sobre o índice i seguido do somatório sobre o índice j do produto de a índice i por b índice j. Para um melhor entendimento dessa propriedade, podemos considerar um caso particular dela: #PraCegoVer : Exemplo de aplicação da propriedade distributiva dos somatórios sobre duas somas. O somatório de a índice i com i variando de 1 até 2 seguido do somatório de b índice j com j variando de 1 até 3 é igual o produto de a índice 1 somando a índice 2 por b índice 1 somando b índice 2 somando b índice 3. Toda essa expressão é igual ao somatório sobre o índice i variando de 1 a 2 seguido do somatório do produto de a índice i por b índice j com j variando de 1 até 3. » Troca da ordem dos somatórios Duas operações algébricas simples envolvendo somatórios são muito importantes e a familiaridade com eles torna possível a solução de muitos problemas. Elas são descritas a seguir. #PraCegoVer : Expressão matemática da troca de somatórios: o somatório sobre o índice i seguido do somatório sobre o índice j, ambos em relação ao termo a índice ij, é igual ao somatório sobre o índice j seguido do somatório sobre o índice, ambos em relação ao termo a índice ij. 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=15/28 A troca da ordem dos somatórios é extremamente útil quando uma forma simples para um dos somatórios é conhecida, mas não para o outro envolvido. A permutação de n objetos em um arranjo de n objetos distintos constitui outra operação matemática cujas propriedades são de grande importância na análise de algoritmos. O processo de contagem de quantas permutações de n objetos são possíveis de serem construídas decorre da percepção de que existem n maneiras de escolher o objeto mais à esquerda e, uma vez feita esta escolha, existem n - 1 maneiras de selecionar um objeto diferente para colocar próximo. Logo, há n ( n - 1) escolhas para as duas primeiras posições. Da mesma forma, verificamos que há n - 2 opções para o terceiro objeto distinto dos dois primeiros, e um total de n ( n - 1)( n - 2) maneiras possíveis de escolher os três primeiros objetos. No geral, se pnk denota o número de maneiras de escolher k objetos de n para que sejam organizados em uma linha, vemos que pnk = n ( n - 1)( n – 2) … ( n - k + 1). #PraCegoVer : Fórmula da permutação de n objetos dispostos de k em k: p índice nk é igual ao produto de n por n menos 1 seguido de n menos 2 e esse produto se repetindo até o limite de n menos k mais 1. O número total de permutações é, portanto p = n ( n - 1)( n – 2) … (1) #PraCegoVer : Fórmula da permutação de n objetos dispostos de n em n: p índice nn é igual ao produto de n por n menos 1 seguido de n menos 2 e esse produto de se repetindo até o limite de 1. Como exemplo,considere o conjunto { a, b, c } detrês elementos. Temos que p = 6 e as permutações geradas são: a b c, a c b, b a c, b c a, c a b, c b a. Um importante operador empregado na quantificação do número de permutações possíveis dos elementos de um conjunto é conhecido como fatorial e ele é denotado por n ! = 1⋅2⋅…⋅ n #PraCegoVer : Fórmula de cálculo de um número n fatorial: n fatorial é igual ao produto de 1 por 2 por 3 e assim sucessivamente até n. Por convenção, o fatorial de 0 é dado por 0! = 1. Números Harmônicos » Clique nas abas para saber mais sobre o assunto nn 33 Série Harmônica Formulação Matemática 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 6/28 De posse das ferramentas matemáticas descritas, algoritmos podem ser projetados para solucionar inúmeras classes de problemas. Em geral, espera-se que o projeto de algoritmo seja dotado de múltiplas qualidades. Depois da precisão de funcionamento, a característica mais relevante de um algoritmo é a sua eficiência. Um algoritmo pode ser avaliado sob dois tipos de medidas de eficiência: eficiência de tempo – indicando a rapidez com que o algoritmo é executado, e eficiência de espaço – indicando quanta memória extra ele usa (LEVITIN, 2012). Nos primórdios da computação eletrônica, ambos os recursos – tempo e espaço – eram muito escassos. No entanto, com meio século de constantes inovações tecnológicas, a velocidade e o tamanho da memória do computador foram aprimorados em muitas ordens de magnitude. Atualmente, a quantidade de espaço extra exigida por um algoritmo não costuma ser tão crítica, considerando a ressalva da diferença de desempenho existente entre a memória principal (mais rápida), a memória secundária (mais lenta) e o cache (muito mais rápida). Em contrapartida, a eficiência relativa ao tempo de execução não evoluiu na mesma proporção. Além disso, diversas pesquisas apontaram que, para a maioria dos problemas, é possível obter progressos muito mais significativos em termos de velocidade de execução do que de espaço utilizado. Portanto, a análise tradicional de desempenho de algoritmos passou a se concentrar principalmente na eficiência do tempo, embora a estrutura analítica que fundamenta essa análise também seja aplicável à análise da eficiência em termos de espaço (SEDGEWICK; WAYNE, 2011). A avaliação da eficiência de tempo de um algoritmo é comumente feita com base no número de operações básicas efetuadas em detrimento do número de unidades de tempo necessárias para a sua execução. Inicialmente, é preciso considerar que a maioria dos programas – se não todos – tem o seu tempo de execução atrelado ao tamanho do problema a ser resolvido – o que caracteriza a dificuldade computacional associada à tarefa designada a ele. Em geral, o tamanho do problema corresponde ao tamanho da entrada fornecida ao programa ou a um valor informado como argumento. Intuitivamente, é possível afirmar que o tempo de processamento de um algoritmo deve crescer proporcionalmente ao tamanho do problema. A questão-chave, portanto, é determinar quanto o tempo de processamento cresce à medida que a dimensão do problema aumenta. Em outras palavras, o objetivo em uma análise de eficiência de um algoritmo é descrever uma relação ou função f(n) do seu tempo de execução com o tamanho n do problema a ser resolvido. Essa função é conhecida como função de custo ou função de complexidade (FEOFILOFF, 2013). VOCÊ QUER LER? Para valores suficientemente pequenos de n (entrada do algoritmo), qualquer algoritmo custa pouco para ser executado, mesmo os algoritmos ineficientes. Em outras palavras, a escolha do algoritmo não é um problema crítico para problemas de tamanho pequeno. Logo, a análise 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 7/28 de algoritmos é realizada para valores grandes de n . Para isso, considera-se o comportamento de suas funções de custo para valores grandes de n , isto é, estuda-se o comportamento assintótico das funções de custo. O comportamento assintótico de ƒ(n) representa o limite do comportamento do custo quando n cresce (ZIVIANI, 1999). As principais classes de problemas computacionais apresentam uma das seguintes funções de complexidade (ZIVIANI, 1999): Constante f(n) = 1 . Algoritmos desta classe não têm o seu desempenho afetado pelo tamanho da entrada. Neste caso, as instruções do algoritmo são executadas um número fixo de vezes. Logarítmica f(n) = log(n) . Este tempo de execução descreve algoritmos cujo funcionamento é baseado na conversão do problema original em problemas menores. Linear f(n) = n . Algoritmos desta classe, em geral, realizam alguma operação sobre cada elemento da entrada. Para cada acréscimo no tamanho da entrada, o tempo de execução aumenta correspondentemente. f(n) = nlog(n) . A eficiência de algoritmos que implementam a estratégia de dividir e conquistar são tipicamente descritos por essa função de complexidade. Nesta estratégia, o problema é fracionado em instâncias menores (etapa de dividir), cada instância é resolvida de forma independente e, na sequência, as soluções são combinadas para gerar a solução do problema original (etapa de conquistar). Quadrática f(n) = n . Algoritmos com essa complexidade processam os dados da entrada, em geral, aos pares. É comum apresentarem um aninhamento de laços de execução, ou seja, um laço sendo executado dentro de outro laço. Cúbica f(n) = n . Algoritmos desse tipo são geralmente utilizados apenas em problemas de pequeno porte. Isso porque programas que apresentam essa ordem de crescimento, em geral são compostos de três laços aninhados usados para alguma operação envolvendo todas as triplas de n elementos. Exponencial f(n) = c , c > 1 . Algoritmos com essa função de complexidade não têm aplicabilidade em problemas práticos. Isso porque eles implementam uma estratégia de força bruta (avaliar todas as soluções possíveis) para resolver um problema. Gráfico 1 – Hierarquia assintótica de funções 2 3 n 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 8/28 Fonte: MILLER e RANUM, 2020. #PraCegoVer : O gráfico, todo em preto, apresentaa representação de seis funções: exponencial, cúbica, quadrática, n log n , n , log n . Horizontalmente aparecem os números: 0, 2, 4, 6, 8 e 10. Verticalmente aparecem os números 0, 10, 20, 30, 40 e 50. A função exponencial se origina na vertical um pouco acima do valor 0 e segue em um arco crescente, sem passar horizontalmente o valor 2 e atingindo verticalmente o valor 50. A função cúbica se origina no valor 0 do gráfico e segue também em crescente, chegando perto do valor 4 horizontal e atingindo o valor 50 vertical. A função quadrática sai do valor 0 do gráfico e forma um arco crescente chegando na metade entre os valores 6 e 8 horizontais e ao valor 50 horizontal. A função n log n sai da linha horizontal do gráfico entre os valores 0 e 2, em um leve arco, quase reto, e segue verticalmente atingindo o valor 10 horizontal e um pouco acima do valor 20 vertical. A função n sai do valor 0 do gráfico e segue em linha reta atingindo o valor 10 horizontal e valor e valor 10 vertical. A função log n sai do valor 0 do gráfico, segue em linha reta até o valor 10 horizontal e atinge um valor pouco acima de 0 na linha vertical. Outros algoritmos podem apresentar funções de complexidades ainda mais caras computacionalmente. Esse é o caso de algoritmos com complexidade fatorial f(n) = n! #PraCegoVer : Fórmula matemática da função n fatorial. ou ainda, 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 9/28 f(n) = n #PraCegoVer : Fórmula matemática da função n elevado a n. A comparação de todas essas funções é geralmente feita com base em seu comportamento assintótico . Isso quer dizer que a comparação só leva em conta a tendência de crescimento das funções e não os seus valores absolutos. Logo, fatores multiplicativos e valores pequenos passados como argumentos são desprezados. O Gráfico 1 apresenta um gráfico comparativo da hierarquia assintótica das principais funções. O Quadro 1 ilustra as diferentes taxas de crescimento observadas entre várias funções de complexidade. As funções expressam o tempo de execução para múltiplos tamanhos de entrada. É possível observar uma explosiva taxa de crescimento para as funções de complexidade exponencial. Em contrapartida, um algoritmo linear é capaz de executar um milhão de operações em apenas um segundo. Quadro 1 – Comparação de funções polinomiais e exponenciais de complexidade de tempo TAMANHO DA ENTRADA N FUNÇÃO DE COMPLEXIDADE 10 20 30 40 50 60 n n 0,00001 seg. 0,00002 seg. 0,00003 seg. 0,00004 seg. 0,00005 seg. 0,00006 seg. n 2 0,0001 seg. 0,0004 seg. 0,0009 seg. 0,0016 seg. 0,0025 seg. 0,0036 seg. n 3 0,001 seg. 0,008 seg. 0,027 seg. 0,064 seg. 0,125 seg. 0,216 seg. n 5 0,1 seg. 3,2 seg. 24,3 seg. 1,7 min. 5,2 min. 13,2 min. 0 001 17 9 12 7 35 7 366 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 10/28 Fonte: GAREY e JOHNSON, 1979, p. 7. VAMOS PRATICAR? Para exemplificar alguns conceitos apresentados, vamos considerar o algoritmo para encontrar o maior elemento dentre os n elementos de A = { e , e , …, e } informados. O Algoritmo é composto de 5 passos: 1. Definir um contador cont contendo o valor n e um outro max com valor e . 2. Se cont tiver valor 0, o algoritmo deve terminar. 3. Se e ≤ max , ir para o passo 5. 4. Atualizar o valor de max para e . 5. Decrementar cont em 1 e voltar para o passo 2.Vamos tomar f como a função de complexidade tal que f(n) é o número de comparações entre os elementos de A. Como A tem n elementos, serão feitas n – 1 comparações até que o maior elemento seja localizado. Portanto, f(n) = n – 1 , para n > 0. 2 n 0,001 seg. 1,0 seg. 17,9 min. 12,7 dias 35,7 anos 366 séculos 3 n 0,59 seg. 58 min. 6,5 anos 3,855 séculos 2x10 séculos 8 1,3 x 10 séculos 13 1 2 n n cont cont 1.2 Complexidade de algoritmo de ordenação por inserção direta A análise de um algoritmo geralmente conta com algumas operações elementares e, em muitos casos, apenas uma operação elementar. A medida de custo ou medida de complexidade expressa o crescimento assintótico da operação considerada. Além disso, essa análise é geralmente feita tendo como base um modelo independente de máquina, isto é, a expressão de consumo de tempo é feita abstraindo particularidades como linguagem de programação, detalhes de implementação e o computador utilizado. De acordo Skienka (2008) esse modelo de computação, conhecido como RAM 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 11/28 (do inglês Random Access Machine , ou Máquina de Acesso Aleatório, em português), assume os seguintes custos associados às operações executadas por um computador: Cada operação simples (operações aritméticas, comparações e invocações de métodos) custa exatamente um passo de tempo. Laços ( loops ) e subrotinas não são consideradas operações simples. Ao contrário, eles são a composição de múltiplas operações de um passo de tempo. De fato, não seria coerente afirmar que uma operação de ordenação demanda apenas um passo de tempo, uma vez que a ordenação de 1.000.000 elementos certamente exige um tempo computacional muito maior do que a ordenação de apenas 10 elementos. Assim, o tempo necessário para executar um laço ou para executar um subprograma depende do número de iterações do laço ou da natureza específica do subprograma. Cada acesso à memória requer exatamente um passo de tempo. Além disso, assume-se que há tanta memória disponível quanto necessária. O modelo RAM não faz distinção se um item está em cache ou em disco. Por meio do modelo RAM, o tempo de execução pode ser medido por meio da contagem do número de passos que um algoritmo executa a fim de resolver uma dada instância de um problema. A partir dessa contagem, o comportamento assintótico do algoritmo pode ser compreendido e, consequentemente, sua função de complexidade pode ser expressa. No entanto, para fins de comparação de funções, o conceito de dominação assintótica deve ser empregado. 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 , tem-se |g(n)| ≤ c · |f(n)| #PraCegoVer : Expressão matemática indicando que o módulo da função g de n é menor ou igual ao produto da constante c com o módulo da função f de n. O significado dessa definição pode ser graficamente expresso conforme apresentado no Gráfico 2. Pode-se observar que a partir de um ponto m , todo valor de f(n) é maior que g(n) em módulo, considerando uma constante positiva c multiplicando f(n) . Gráfico 2 – Dominação assintótica da função f sobre a função g 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 12/28 Fonte: CORMEN, 2012, p. 45. #PraCegoVer : A imagem demonstra um gráfico com eixo horizontal n e um eixo vertical não especificado. Há duas linhas representando a função f de n sobre a função g de n . A função f de n é uma linha saindo do primeiro terço do eixo vertical e ascendendo de forma mais ou menos constante, porém não em linha reta, ao longo dos eixos. A g de n é representada por uma linha saindo do eixo vertical, um pouco acima da função n . Primeiro ela realiza um arco de queda, depois um arco de subida, no qual intersecciona a função f , novamente um arco de queda quando intersecciona novamente a função f e depois ascende de forma mais u menos constante, porém abaixo da linha da função f . Na terceira intersecção entre as funções, há uma linha pontilhada até o eixo horizontal n , sinalizada pela letra m . Para expressar que um função f(n) domina assintoticamente outra função g(n) , uma notação conhecida comoO (do inglês big-oh , ou grande O, em português) é utilizada. Neste caso, a dominação assintótica seria escrita como g(n) = O(f(n)) (pronuncia-se “oh de f de n”), o qual deve ser entendido como g(n) tendo a ordem de no máximo f(n) . Em outras palavras, f(n) é um limite assintótico superior para g(n) . Assim, quando é dito que o tempo de execução T(n) de um programa 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 13/28 VOCÊ SABIA? A notação O foi introduzida em 1894 por Paul Bachmann em seu livro Analytische Zahlentheorie, cuja tradução livre seria Teoria dos Números Analíticos . De acordo com Knuth (1997), essa notação possibilita a substituição do sinal de aproximação “≈” pelo de igualdade “=”, além de quantificar o grau de precisão. Como indicado por Tenenbaum, Langsam e Augesntein (1989), as seguintes operações podem ser realizadas com a notação O: #PraCegoVer : Sequênciade sete operações que podem ser executadas com a notação O . A primeira indica que f de n é igual a O de f de n. A segunda, oproduto de uma constante c por O de f de n é igual a O de f de n. Na terceira,a soma de de O de f de n com O de f de n é igual a O de f de n. Na quarta, O deO de f de n é igual a O de f de n. Naquinta, a soma de O de f de n com O de g de n é igual a O do máximo entre f den e g de n. Na sexta, o produto de O de f de n e O de g de n é igual a O doproduto de f de n com g de n. Na sétima, o produto de f de n com O de g de n éigual a O do produto de f de n com g de n. é O(n2) , isso significa que existem constantes c e m tais que, para valores de n maiores ou iguais a m , T(n) ≤ cn2 . Em geral, a notação O(f(n)) pode ser usada em qualquer intervalo onde f(n) é uma função de um número inteiro n , indicando assim que ela representa uma quantidade que não é explicitamente conhecida, mas cuja magnitude não é muito grande (KNUTH, 1997). Teste seus conhecimentos Atividade não pontuada. Domínio assintótico de f(n) = 6n sobre g(n) = 100n + 300 » Clique nas abas para saber mais sobre o assunto 2 Dominação Algébrico Dominação Gráfica 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 14/28 Os algoritmos de ordenação constituem bons exemplos de como é possível resolver problemas através de recursos e técnicas computacionais. A atividade de colocar itens em ordem está presente na maioria das aplicações onde os objetos armazenados têm que ser pesquisados e recuperados, como dicionários, índices de livros, tabelas e arquivos. Como existem várias abordagens para se rearranjar um conjunto de elementos em ordem ascendente ou descendente, a avaliação do desempenho de cada um desses algoritmos oferece um cenário amplo para aplicação das técnicas de análise de comportamento assintótico. VOCÊ SABIA? A regra da soma O(f(n)) + O(g(n)) pode ser usada para calcular o tempo de execução de uma sequência de trechos de programas. Suponha três trechos de programas cujos tempos de execução são O(n), O(n ) e O(nlog(n)) #PraCegoVer: Notação O para as funções linear, quadrática e n logaritmo de n. O tempo de execução dos dois primeiros trechos é O(max(n, n )) #PraCegoVer: Notação O para o máximo entre as funções linear e quadrática. que é O(n ) . O tempo de execução de todos os três trechos é, portanto, O(max(n , nlog(n))) #PraCegoVer: Notação O para o máximo entre as funções quadrática e n logaritmo de n. que é O(n ). 2 2 2 2 2 Os algoritmos sempre operam sobre os registros de um arquivo. Apenas uma parte do registro, chamada chave , é utilizada para controlar a ordenação. Apesar de outros elementos também poderem compor um registro, eles não influenciam no processo de ordenação, salvo pelo fato de que a chave a qual estão associados nunca é alterada. A escolha do tipo de dados a ser empregado na definição da chave é arbitrária. Porém, devem ser utilizados tipos de dados sobre os quais exista alguma regra de ordenação bem definida. Este é o caso dos tipos numéricos e alfabéticos. Outro conceito importante associado ao processo de ordenação é o de estabilidade. Um método de ordenação é dito estável se a ordem relativa dos itens com chaves iguais se mantém inalterada durante o rearranjo dos elementos. Tipos de Algoritmos de Ordenação 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 15/28 » Clique nas setas ou arraste para visualizar o conteúdo Um algoritmo comumente usado para ordenar cartas em jogos de baralho funciona considerando as cartas uma por vez e inserindo cada carta em seu devido lugar entre aquelas já analisadas. Conforme descrito por Cormen (2012), este processo tem início com uma das mãos vazia (esquerda, por exemplo) e as cartas viradas para baixo na mesa. Em seguida, removemos uma carta de cada vez da mesa e a inserimos na posição correta na mão esquerda. Para encontrar a posição correta para uma carta, comparamos com cada uma das cartas já na mão, da direita para a esquerda. Em todos os momentos, as cartas seguradas na mão esquerda são classificadas. Nesse processo, a ordenação já estabelecida na mão é mantida. Esse algoritmo é conhecido como ordenação por inserção direta . A Figura 1 apresenta um exemplo dos passos executados pela ordenação por inserção direta sobre um conjunto a = { 5, 2, 4, 6, 1, 3 }. A estrutura de dados usada para armazenar o conjunto a é um vetor. Em cada passo, o retângulo escuro armazena a chave a ter sua correta posição encontrada. A busca por essa posição acontece da direita para a esquerda. Enquanto a chave a ser ordenada (retângulo preto) é menor do que as chaves à sua esquerda (retângulos cinza), o valor é deslocado neste sentido. Naturalmente, os deslocamentos não ultrapassam os limites do vetor. Essas comparações ficam bem evidentes no passo (d), quando a chave de valor 1 é comparada com os quatro elementos à sua esquerda até alcançar a extremidade do vetor. Ao término do processo – após a última finalizar o processo de busca pela posição correta – o vetor resultante contém todas as chaves em ordem ascendente. Tipo de Acesso: Na ordenação interna qualquer registro pode ser imediatamente acessado. ORDENAÇÃO EXTERNA Quando o arquivo a ser ordenado não cabe na memória principal e, por isso, tem que ser armazenado em fita ou disco. Tipo de Acesso: Na ordenação externa os registros são acessados sequencialmente ou em blocos. 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 16/28 Figura 1 – Operações executadas pela ordenação por inserção direta. Fonte: CORMEN, 2012, p. 18. #PraCegoVer : Sequência de seis imagens descrevendo o passo a passo de ordenação de um vetor com os elementos 5, 2, 4, 6, 1 e 3 pelo método de ordenação por inserção direta. Na primeira, o 2 trocado com o 5, na segunda o 4 é trocado com o 5, na terceira o 6 permanece na sua posição, na quarta o 1 é deslocado para primeira posição, na quinta o 3 é trocado com o 4 e na sexta o vetor se encontra ordenado. O pseudo-código a seguir detalha o algoritmo de ordenação por inserção direta. Algoritmo de Ordenação Direta: Entrada: Vetor A de n posições Saída: Vetor A com as chaves em ordem crescente 1. para j = 2 até n faça 2. chave = A[ j ] 3. i = j – 1 4. enquanto i > 0 e A[ i ] > chave faça 5. A[ i + 1 ] = A[ i ] 6. i = i – 1 7. fim enquanto 8. A[ i + 1 ] = chave 9. fim para Fazendo uma correspondência entre o algoritmo apresentado e a analogia com a ordenação de cartas de baralho, o índice j representa a carta que está sendo comparada com as demais, a fim de localizar a sua correta posição. Levando em conta a Figura 4, o índice j correspondeao retângulo preto da carta corrente. Observe que o valor armazenado neste índice a cada iteração do laço mais externo é atribuído a uma variável chave . O laço mais interno (linhas 4 a 7) é responsável por fazer as comparações da chave com os demais valores à esquerda. Na prática, cada chave vai ser comparada com um subvetor à esquerda, delimitado pelos índices 1 e j – 1 . O lado direito da chave, o subvetor de índice variando de j + 1 a n , corresponde às cartas que ainda se encontram na mesa e precisam ser ordenadas. 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 17/28 Convenções de Pseudo-código » Clique nas abas para saber mais sobre o assunto Considerando o modelo RAM para descrição do comportamento assintótico da ordenação por inserção direta, observamos que a operação elementar do algoritmo é a comparação entre chaves. O cenário menos custoso computacionalmente – menor número de comparações entre chaves – para o algoritmo acontece quando o vetor informado já se encontra ordenado. Em contrapartida, o caso em que será demandado o maior número de comparações se dá quando o vetor se encontra ordenado inversamente. Ambas situações são conhecidas como melhor e pior caso do algoritmo, respectivamente. Qualquer que seja o vetor de entrada a ser ordenado via inserção direta, o laço mais interno (linhas 4 a 7) será executado n – 1 vezes. No entanto, o número de comparações realizadas por esse laço vai depender de quão ordenado o vetor original se encontra. No melhor caso, o laço mais interno executará apenas uma comparação, tendo em vista que nesta única operação a chave identifica que já se encontra na posição correta – o teste A [ i ] > chave falha na primeira tentativa de comparação. Logo, no melhor caso, o algoritmo vai realizar C(n) = ( n - 1) * 1 = n – 1 #PraCegoVer: C de n é igual ao produto de n menos 1 por 1, que por sua vez é igual a n menos 1. Expressão matemática indicando que o número de comparações executadas pelo algoritmo é n - 1] comparações. Considerando que n – 1 ≤ n para todo n > 0, concluímos que o melhor caso do algoritmo é dominado assintoticamente pela função f(n) = n #PraCegoVer: Função f de n é igual a n: Expressão matemática da função f de n. Isso equivale a dizer que complexidade do algoritmo no melhor caso é O(n) . Por outro lado, quando o algoritmo recebe como entrada um vetor inversamente ordenado, o laço mais interno ainda será executado n - 1 vezes. Porém, o número de comparações realizadas por ele será consideravelmente maior. De fato, a primeira chave a ser posicionada efetuará 1 comparação, a segunda chave fará 2 comparações, a terceira chave, 3 comparações e assim sucessivamente, até que a última chave finalize as suas n - 1 comparações. Mais precisamente, o número de comparações total C(n) será dado por Blocos de código Laços Vetores Retornos 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 18/28 f(n) = n #PraCegoVer: Expressão matemática para o número de comparações no pior caso. C de n é igual à soma de 1 mais 2 mais 3 e a soma se repete até o limite de n menos 1. Essa soma é dada por n ao quadrado menos n sobre 2. Isso quer dizer que o algoritmo de ordenação por inserção direta é dominado assintoticamente por uma função quadrática em seu pior caso. Aplicando as operações da notação O sobre essa função, obtemos que #PraCegoVer: Cálculo da complexidade do pior caso da ordenação por inserção direta. Portanto, o pior caso da ordenação por inserção direta apresenta complexidade O(n ). Teste seus conhecimentos Atividade não pontuada. VAMOS PRATICAR? Para reforçar o funcionamento do algoritmo de ordenação por inserção direta, vamos apresentar a evolução da ordenação de um vetor com os seguintes elementos { O, R, D, E, N, A }: Ao término do processo, o vetor ordenado é { A, D, E, N, O, R }. 2 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 19/28 1.3 Análise de algoritmos de ordenação bubble sort Os sons que escutamos em nosso dia a dia são formados por uma junção complexa de ondas, formadas pelas oscilações complexas de cada fonte que emite esses sons. Para complicar ainda mais a questão, os sons que normalmente ouvimos são compostos por uma somatória de diferentes sons, como já vimos na mixagem para cinema. Sendo assim, é necessário queUm dos métodos de ordenação mais conhecidos pela simplicidade de ser entendido e programado é conhecido como bubble sort (ordenação por bolha). Apesar de ser facilmente implementado, ele é tido como o método menos eficiente dentre os conhecidos. A ideia básica da ordenação via bolha é percorrer um vetor X sequencialmente várias vezes. Cada passagem consiste em comparar cada elemento com o seu sucessor [ #PraCegoVer : Comparação entre o valor armazenado na posição i do vetor X com o valor da posição i + 1] e trocar os dois elementos que não estiverem na ordem correta. Tenembaum, Langsam e Augenstein (1999) descreveram um exemplo de execução da ordenação pelo método da bolha sobre um vetor X composto dos seguintes elementos: tenhamos diversos instrumentos diferentes para visualização dessas ondas. Em linhas gerais, os parâmetros que podemos visualizar são: duração , frequência e intensidade . Cada um desses parâmetros pode ser visualizado de uma forma diferente e apresenta questões específicas que são de nosso interesse, conforme mostra o quadro a seguir: (X[ i ] com X[ i + 1]) #PraCegoVer : Comparação entre o valor armazenado na posição i do vetor X com o valor da posição i + 1 e trocar os dois elementos que não estiverem na ordem correta. Tenembaum, Langsam e Augenstein (1999) descreveram um exemplo de execução da ordenação pelo método da bolha sobre um vetor X composto dos seguintes elementos: 25 57 48 37 12 92 86 33 As seguintes comparações são feitas na primeira passagem: X[ 1 ] com X[ 2 ] (25 com 57) nenhuma troca X[ 2 ] com X[ 3 ] (57 com 48) troca X[ 3 ] com X[ 4 ] (57 com 37) troca X[ 4 ] com X[ 5 ] (57 com 12) troca X[ 5 ] com X[ 6 ] (57 com 92) nenhuma troca X[ 6 ] com X[ 7 ] (92 com 86) troca X[ 7 ] com X[ 8 ] (92 com 33) troca Terminada a primeira passagem pelo vetor, as chaves estarão na seguinte ordem: 25 48 37 12 57 86 33 92 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 20/28 Importante observar que após a primeira iteração do algoritmo, o maior elemento (neste caso, 92) fica alocado em sua posição correta. O método é conhecido por ordenação por bolha já que cada número “borbulha” lentamente para a posição correta. Depois da segunda iteração, a ordem das chaves é a seguinte: 25 37 12 48 57 33 86 92 Após esta iteração, o elemento 86 ficou posicionado na segunda posição mais alta. Como cada iteração rearranja um novo elemento em sua posição correta, um vetor de n chaves vai demandar n - 1 iterações até que a ordenação finalize. Neste exemplo, o conjunto completo de iterações é apresentado no Quadro 2. As chaves em negrito foram empurradas para o fim do vetor a cada passada: bolhas. Nas duas últimas iterações, o vetor não sofre mais modificações já que se encontra ordenado. Quadro 2 – Iterações executados pelo algoritmo bubble sort ITERAÇÃO CHAVES 0 25 57 48 37 12 92 86 33 1 25 48 37 12 57 86 33 92 2 25 37 12 48 57 33 86 92 3 25 12 37 48 33 57 86 92 4 12 25 37 33 48 57 86 92 5 12 25 33 37 48 57 86 92 6 12 25 33 37 48 57 86 92 7 12 25 33 37 48 5786 92 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 21/28 Fonte: TENEMBAUM, LANGSAM e AUGENSTEIN, 1999, p. 425. O pseudo-código a seguir detalha o algoritmo de ordenação pelo método da bolha. O laço externo é responsável por controlar o limite mais à direita a ser percorrido pela bolha em cada iteração. Já o laço interno (linhas 2 a 8) implementa a movimentação da bolha. As chaves são comparadas duas a duas (linha 3) e sempre que a chave à esquerda for maior do que a chave à direita ambas têm suas posições trocadas entre si (linhas 4 a 6). Algoritmo Bubble Sort: Entrada: Vetor A de n posições Saída: Vetor A com as chaves em ordem crescente 1. para i = n até 1 faça 2. para j = 1 até i - 1 faça 3. se A[ j ] > A [ j + 1] então 4. temp = A[ j + 1 ] 5. A[ j + 1 ] = A[ j ] 6. A[ j ] = temp 7. fim se 8. fim para 9. fim para se A índice j é menor que A índice j mais 1. Quando essa condição for verdadeira, três comandos são executados. Uma variável temp recebe o valor de A índice j mais 1, A índice j mais 1 recebe o valor de A índice j e, finalmente A índice j recebe o valor armazenado na variável temp. Considerando a eficiência desse método de ordenação, a operação elementar também é a comparação. Neste caso, para um vetor de n posições, serão executadas n – 1 comparações na primeira iteração, n - 2 comparações na segunda iteração e assim sucessivamente, até que a última iteração execute apenas uma comparação (entre as chaves posicionadas nas duas primeiras posições do vetor). Logo, o número de comparações C(n) após o término da execução do algoritmo é dado pela soma #PraCegoVer : Cálculo do número de comparações C de n realizadas pelo método da bolha. C de n é igual ao somatório de i variando de 1 até n menos 1 sobre a variável i . Esse somatório corresponde à razão de n ao quadrado menos n sobre 2. 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 22/28 Isso quer dizer que a ordenação pelo método da bolha é dominada assintoticamente por uma função quadrática. Importante ainda perceber que, independentemente de como as chaves estão dispostas no vetor informado como entrada para o algoritmo, o número de comparações executadas será o mesmo. Em outras palavras, tanto o melhor como o pior caso do método da bolha terão a mesma complexidade, que é dada por #PraCegoVer : Cálculo da complexidade do pior e melhor caso da ordenação pelo método da bolha. O de meio de n ao quadrado somado a O de menos meio de n é igual a O do máximo entre meio de n ao quadrado e menos meio de n que é igual a O de n ao quadrado. VAMOS PRATICAR? Embora o método de ordenação pela bolha seja reconhecidamente ineficiente, alguns aprimoramentos podem ser feitos no algoritmo. Considerando o pseudo-código apresentado do método, tente introduzir a seguinte modificação que pode causar uma melhoria no desempenho do algoritmo: No exemplo apresentado neste tópico, o vetor foi ordenado após cinco iterações, tornando as duas últimas iterações desnecessárias. Para eliminar as passagens desnecessárias, altere o pseudo-código do algoritmo de forma que ele detecte o fato do vetor já se encontrar ordenado durante o processo de rearranjo das chaves. Com a introdução dessa modificação, qual a nova complexidade do melhor caso, ou seja, quando o vetor informado já se encontrar ordenado? 1.4 Ordem assintótica: notação ômega Assim como a notação O provê um limite assintótico superior para uma função, uma segunda notação – a notação Ω (ômega) – descreve o limite assintótico oposto, isto é, o limite inferior para uma função. Logo, para uma dada função g(n) , a notação f(n) = Ω(g(n)) (pronuncia-se “ômega de g de n”) significa que g(n) é um limite assintótico inferior para f(n) . Isso quer dizer que existem constantes positivas c e m tais que 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 23/28 0 ≤ cg(n) ≤ f(n) #PraCegoVer : Expressão matemática indicando uma sequência de desigualdades: 0 é menor ou igual ao produto de c por g de n, que por sua vez é menor ou igual ao f de n. para todo n ≥ m . Limites Assintóticos Inferiores » Clique nas setas ou arraste para visualizar o conteúdo #PraCegoVer : Quatro expressões matemáticas exemplificando o conceito de limites assintóticos inferiores. A primeira relaciona o cubo de n, a segunda a diferença entre o quadrado de n e 2 n , a terceira está relacionada a n logaritmo de n e a quarta a 100n. Um exemplo de definição de um limite assintótico inferior foi apresentado por Kleinberg e Tardos (2006) aplicado à função f(n) = 4 n - 3. Enquanto a definição de um limite superior envolve incrementar os valores dos termos de f(n) até que seja observado uma constante associada ao termo dominante, a definição do limite inferior é feita no sentido oposto, ou seja, é preciso reduzir o tamanho de f(n) até que uma constante seja observada associada ao termo-limite. Logo, pode-se afirmar que f(n) = Ω(n) #PraCegoVer : Notação ômega para indicar que o limite assintótico inferior de f de n é n. uma vez que, para todo n ≥ 1, tem-se que Sim, pois n + 100n ≥ n para todo n.3 3 f(n) = n – 2n = Ω(n ) ? Sim, pois como 2n ≤ (½) n para todo n ≥ 4, então n – 2n ≥ n – (½)n = (½)n . 2 2 2 2 2 2 2 f(n) = n lg n = Ω(n) ? Sim, pois n + 100n ≥ n para todo n.3 3 f(n) = 100 = Ω(n ) ? Não, pois para todo n > 100c, tem-se 100 < 1/c e, portanto, 100n < (1/c)n . n 2 2 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 24/28 f(n) = 4 n - 3 ≥ n #PraCegoVer : Expressão matemática indicando que a função f de n é menor ou igual a n. O Gráfico 3 apresenta o gráfico das duas funções. Gráfico 3 – Gráfico das funções g(n) = n e f(n) = 4n-3 Fonte: ALGOL DEV, 2019. #PraCegoVer :Imagem apresentando os gráficos das funções n e 4n menos 3. Horizontalmente os valores são: 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5. Verticalmente os números são 10, 8, 6, 4, 2. Há duas linhas. A que representa função n é azul e sai do valor 0, ou seja do ponto de interseção ente a linha horizontal e vertical e segue, verticalmente, chegando até o último ponto da linha horizontal e sem passar o valor 6 da linha vertical. Já a linha que representa a função 4n-3 é vermelha e parte da linha horizontal entre os valores 0.5 e 1. Ela segue verticalmente pelo gráfico chegando próximo ao valor 4 da linha horizontal e chegando ao último valor da linha vertical. As linhas das duas funções se interseccionam no valor 1 da linha horizontal. Desta interseção sai uma linha vermelha pontilhada onde está indicado o valor n ≥ 1. VAMOS PRATICAR? Considere o seguinte algoritmo de busca sequencial de uma chave k em um vetor X de n posições: 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 25/28 1. para pos = 1 até n faça 2. se X [ pos ] é igual a k então 3. retorna Busca com Sucesso 4. fim se 5. fim para 6. retorna Busca sem Sucesso Qual o limite assintótico superior do pior caso do algoritmo? Pode-se afirmar que o seu limite assintótico inferior é Ω(n )? Justifique. Síntese Neste capítulo, conseguimos ter uma visão dos principais fundamentos matemáticos que dão suporte ao projeto e à análise de algoritmos computacionais. Os conceitos relacionados ao comportamento assintótico dos algoritmos, juntamente com o formalismo das notações O e Ω possibilitaram que dois algoritmos de ordenação interna pudessem ser descritos e avaliados quanto à sua eficiência. Por meio do cálculo das complexidades de melhor e piorcaso de ambos algoritmos, observou-se que o desempenho de cada um deles pode variar de acordo com a maneira com que os dados de entrada estão arranjados. Além disso, o detalhamento das estratégias de ordenação implementadas pelos dois métodos deu suporte ao desenvolvimento de uma visão mais crítica quanto ao projeto de algoritmos que atendam a critérios de desempenho adequados para os cenários onde serão empregados. SAIBA MAIS Título : Estruturas de Dados e Algoritmos em Java Autores : Roberto Tamassia e Michael T. Goodrich 2 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 26/28 Ano : 2011 Comentário : Leia o capítulo 4, que apresenta mais detalhes a respeito das ferramentas de análise de algoritmos e fundamentos matemáticos complementares usados na descrição do comportamento de algoritmos. Onde encontrar : Biblioteca Virtual da Título : Estruturas de Dados e Algoritmos em Java Autores : Roberto Tamassia e Michael T. Goodrich Ano : 2011 Comentário : Leia o capítulo 4, que apresenta mais detalhes a respeito das ferramentas de análise de algoritmos e fundamentos matemáticos complementares usados na descrição do comportamento de algoritmos. Onde encontrar : Biblioteca Virtual da Título : Estruturas de Dados e Algoritmos em Java Autores : Roberto Tamassia e Michael T. Goodrich Ano : 2011 Comentário : Leia o capítulo 4, que apresenta mais detalhes a respeito das ferramentas de análise de algoritmos e fundamentos matemáticos complementares usados na descrição do comportamento de algoritmos. Onde encontrar : Biblioteca Virtual da Referências bibliográficas BIG Omega Notation. Algol dev ., 2019. Disponível em: < https://algol.dev/en/big-omega-notation/ >. Acesso em: 07/12/2020. https://algol.dev/en/big-omega-notation/ 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 27/28 CORMEN, T. H. Algoritmos . Rio de Janeiro: Elsevier, 2012. DIJKSTRA, E. W. A Short Introduction to the Art of Programming , 1971. Disponível em: < https://www.cs.utexas.edu/users/EWD/ewd03xx/EWD316.PDF >. Acesso: 06 dez. 2020. FEOFILOFF, P. Minicurso de Análise de Algoritmos. Instituto Militar de Engenharia – IME, Rio de Janeiro, 2013. Disponível em: < https://www.ime.usp.br/~pf/livrinho-AA/ >. Acesso: 07/12/2020. GAREY, M. R., JOHNSON, D. S. Computers and Intractability – A Guide to the Theory NP- Completeness. New Jersey: Bell Telephone Laboratories Incorporated, 1979. ASYMPTOTIC notation. Khan Academy , 2019. Disponível em: < https://www.khanacademy.org/computing/computer-science/algorithms/asymptotic- notation/a/asymptotic-notation >. Acesso: 07 dez. 2020. KLEINBERG, J., TARDOS, E. Algorithm Design . Boston: Pearson Education, 2006. KNUTH, D. E. The Art of Computer Programming – Fundamental Algorithms. Boston: Addison- Wesley, 1997. LEVITIN, A. A Introduction to the Design and Analysis of Algorithms . New Jersey: Addison- Wesley, 2012. MILLER, B., RANUM, D. Problem Solving with Algorithms and Data Structures Using Python. Pythonds , 2012. Disponível em: < https://runestone.academy/runestone/books/published/pythonds/AlgorithmAnalysis/BigONotation.html >. Acesso: 07 dez. 2020. SEDGEWICK, R., WAYNE, K. Algorithms . Boston: Addison-Wesley, 2011. SKIENKA, S. S. The Algorithm Design Manual . New York: Springer, 2008. TENENBAUM, A. A., LANGSAM, Y., AUGESNTEIN, M. J . Data Structures Using C . New York: McGraw-Hill, 1999. ZIVIANI, N. Projeto de Algoritmos com Implementações em Pascal e C . São Paulo: Pioneira Informática, 1999. https://www.cs.utexas.edu/users/EWD/ewd03xx/EWD316.PDF https://www.ime.usp.br/~pf/livrinho-AA/ https://www.khanacademy.org/computing/computer-science/algorithms/asymptotic-notation/a/asymptotic-notation https://runestone.academy/runestone/books/published/pythonds/AlgorithmAnalysis/BigONotation.html 08/09/2022 22:03 Unidade 1 - Análise de algoritmos https://codely-fmu-content.s3.amazonaws.com/Moodle/EAD/Conteudo/CTI_ANLALG_21/unidade_1/ebook/index.html?redirect=1 28/28
Compartilhar