ÍNDICE GERAL
AGRADECIMENTOS
XI
SOBRE O LIVRO 1
XIII
FUNDAMENTOS DA ANÁLISE DE ALGORITMOS 1.1
1
INTRODUÇÃO...................................................................................................................................................................... 1
1.2 CONCEITO DE ALGORITMO.......................................................................................................................................... 1 1.3 ANÁLISE ALGORÍTMICA................................................................................................................................................ 3 1.4 CASOS A CONSIDERAR NA ANÁLISE..................................................................................................................... 5 1.5 COMPLEXIDADE ASSIMPTÓTICA.............................................................................................................................. 6 1.6 CLASSES DE COMPLEXIDADE.................................................................................................................................... 10 1.7 TIPOS DE PROBLEMAS MAIS IMPORTANTES.................................................................................................... 12 1.8 ESTRATÉGIAS ALGORÍTMICAS.................................................................................................................................. 15 1.8.1
FORÇA BRUTA E PESQUISA EXAUSTIVA................................................................................................ 15
1.8.2 DIVIDIR PARA CONQUISTAR......................................................................................................................... 16 1.8.3 DECREMENTAR PARA CONQUISTAR......................................................................................................... 17 1.8.4 TRANSFORMAR PARA CONQUISTAR....................................................................................................... 18 1.8.5 PROGRAMAÇÃO DINÂMICA.......................................................................................................................... 19 1.8.6 ALGORITMOS GANANCIOSOS...................................................................................................................... 19 1.8.7 RECURSIVIDADE COM RETROCESSO........................................................................................................ 20 1.9 FÓRMULAS ÚTEIS PARA A ANÁLISE DE ALGORITMOS................................................................................ 20 1.10 EXEMPLOS........................................................................................................................................................................... 22 LEITURAS RECOMENDADAS.................................................................................................................................................. 32 EXERCÍCIOS..................................................................................................................................................................................... 33
2
PESQUISA E SELEÇÃO
37
2.1 INTRODUÇÃO...................................................................................................................................................................... 37 2.2 ALGORITMOS DE PESQUISA...................................................................................................................................... 37 2.2.1 PESQUISA SEQUENCIAL................................................................................................................................. 38 2.2.2 PESQUISA BINÁRIA........................................................................................................................................... 41 2.2.3 PESQUISA TERNÁRIA....................................................................................................................................... 49 2.2.4 ANÁLISE EXPERIMENTAL DOS ALGORITMOS DE PESQUISA....................................................... 57 2.3 ALGORITMOS DE SELEÇÃO......................................................................................................................................... 58 2.3.1 SELEÇÃO DO MAIOR E DO MENOR VALORES..................................................................................... 58 2.3.2 SELEÇÃO DO K-ÉSIMO MENOR VALOR................................................................................................... 61 © FCA – EDITORA DE INFORMÁTICA
VII
ANÁLISE DA COMPLEXIDADE DE ALGORITMOS
LEITURAS RECOMENDADAS.................................................................................................................................................. 67 EXERCÍCIOS..................................................................................................................................................................................... 68
3 ORDENAÇÃO
71
3.1 INTRODUÇÃO...................................................................................................................................................................... 71 3.2 MÉTODOS DE ORDENAÇÃO........................................................................................................................................ 72 3.3 ORDENAÇÃO SEQUENCIAL.......................................................................................................................................... 73 3.4 ORDENAÇÃO SELEÇÃO................................................................................................................................................. 75 3.5 ORDENAÇÃO BUBBLE.................................................................................................................................................... 77 3.6 ORDENAÇÃO INSERÇÃO............................................................................................................................................... 80 3.7 ORDENAÇÃO DE SHELL................................................................................................................................................. 83 3.8 ORDENAÇÃO HEAP......................................................................................................................................................... 87 3.8.1 CONSTRUÇÃO DO AMONTOADO BINÁRIO............................................................................................. 88 3.8.2 IMPLEMENTAÇÃO DO ALGORITMO........................................................................................................... 91 3.9 ORDENAÇÃO MERGE...................................................................................................................................................... 98 3.10 ORDENAÇÃO INSERÇÃO RECURSIVA..................................................................................................................... 101 3.11 ORDENAÇÃO QUICK........................................................................................................................................................ 106 3.12 COMPARAÇÃO DOS ALGORITMOS DE ORDENAÇÃO..................................................................................... 114 3.13 L IMITE INFERIOR DA COMPLEXIDADE DA ORDENAÇÃO............................................................................... 115 LEITURAS RECOMENDADAS.................................................................................................................................................. 117 EXERCÍCIOS..................................................................................................................................................................................... 118
4 RECURSIVIDADE E PROGRAMAÇÃO DINÂMICA
119
4.1 INTRODUÇÃO...................................................................................................................................................................... 119 4.2 EXEMPLOS SIMPLES....................................................................................................................................................... 121 4.3 CONVERSÃO DE DECIMAL PARA BINÁRIO.......................................................................................................... 126 4.4 TORRES DE HANÓI.......................................................................................................................................................... 128 4.5 CÁLCULO DAS PERMUTAÇÕES.................................................................................................................................. 131 4.6 TEOREMA MESTRE.......................................................................................................................................................... 133 4.7 NÚMEROS DE FIBONACCI............................................................................................................................................. 137 4.8 FUNÇÃO NUMÉRICA COM RECURSIVIDADE NÃO LINEAR............................................................................ 142 LEITURAS RECOMENDADAS.................................................................................................................................................. 149 EXERCÍCIOS..................................................................................................................................................................................... 150
5 ALGORITMOS NUMÉRICOS
153
5.1 INTRODUÇÃO...................................................................................................................................................................... 153 5.2 CÁLCULO DA POTÊNCIA................................................................................................................................................ 153 5.3 AVALIAÇÃO DO POLINÓMIO....................................................................................................................................... 156 5.4 MULTIPLICAÇÃO BINÁRIA POR PARTIÇÃO.......................................................................................................... 157 5.5 MULTIPLICAÇÃO DE POLINÓMIOS............................................................................................................................ 158 VIII
© FCA – EDITORA DE INFORMÁTICA
ÍNDICE GERAL 5.6 CÁLCULO DO DETERMINANTE................................................................................................................................... 162 5.7 MULTIPLICAÇÃO DE MATRIZES................................................................................................................................. 168 LEITURAS RECOMENDADAS.................................................................................................................................................. 175 EXERCÍCIOS..................................................................................................................................................................................... 176
GLOSSÁRIO DE TERMOS – PORTUGUÊS EUROPEU/PORTUGUÊS DO BRASIL
177
ÍNDICE REMISSIVO
179
© FCA – EDITORA DE INFORMÁTICA
IX
SOBRE O LIVRO Hoje em dia, a Programação é considerada uma ciência de base de qualquer curso da área científica das Ciências e das Engenharias, fazendo por isso parte do seu currículo uma ou mais disciplinas de Ciência e Tecnologia da Programação. No caso de cursos das áreas da Engenharia dos Computadores e das Ciências da Computação que exijam conceitos sólidos de programação e de desenvolvimento de software, é normal que o seu estudo seja feito em várias disciplinas. Desde disciplinas de introdução à programação, dedicadas ao estudo de estruturas de dados básicas e de algoritmos simples, usando o paradigma procedimental, até disciplinas avançadas, dedicadas ao estudo de estruturas de dados avançadas e de algoritmos mais complexos, eventualmente, fazendo um estudo de técnicas algorítmicas sofisticadas e de análise da complexidade dos algoritmos, usando o paradigma modular (no caso da linguagem C) ou o paradigma orientado a objetos (no caso da linguagem Java), que permitem combinar estruturas de dados e algoritmos na conceção de abstrações, indispensáveis para o desenvolvimento de aplicações informáticas sofisticadas, que habitualmente designamos por tipos de dados abstratos. O estudo das estruturas de dados e de algoritmos é normalmente objeto de estudo de vários livros de programação1. O livro Análise da Complexidade de Algoritmos, que tem nas suas mãos, tem como objetivo fazer um estudo mais aprofundado de diferentes tipos de algoritmos – que são habitualmente estudados em disciplinas de estruturas de dados e algoritmos – apresentando a análise experimental e formal da sua complexidade. Especificamente, este livro pretende atingir os seguintes objetivos: ■■
O estudo da análise da complexidade de algoritmos de pesquisa, de seleção e de ordenação;
■■
O estudo da análise da complexidade de algoritmos recursivos e da estratégia de programação dinâmica como forma de implementar algoritmos repetitivos alternativos mais eficientes;
■■
O estudo da análise da complexidade de algoritmos numéricos;
■■
A classificação dos algoritmos consoante a estratégia algorítmica utilizada no seu desenvolvimento.
ORGANIZAÇÃO DO LIVRO Este livro está organizado em cinco capítulos: Fundamentos da Análise de Algoritmos; Pesquisa e Seleção; Ordenação; Recursividade e Programação Dinâmica; e Algoritmos Numéricos. 1
Estruturas de Dados e Algoritmos em C, de António Adrego da Rocha, FCA – Editora de Informática, de 2014 e Estruturas de Dados e Algoritmos em Java, de António Adrego da Rocha, FCA – Editora de Informática, de 2011. © FCA – EDITORA DE INFORMÁTICA
XIII
ANÁLISE DA COMPLEXIDADE DE ALGORITMOS O Capítulo 1 apresenta os fundamentos da análise de algoritmos. Começa por especificar as características de um algoritmo e a questão da sua eficiência temporal e espacial. Para caracterizar a análise da complexidade de um algoritmo, discute-se as questões da operação básica e da dimensão de entrada, a análise experimental e formal de um algoritmo. Depois, são apresentados os casos que devemos ter em conta na análise de algoritmos, e que estão associados às situações de execução distintas, dependente das diferentes combinações possíveis e válidas das variáveis de entrada, como são as situações de: melhor caso, pior caso, caso médio e caso sistemático. De seguida, introduz as notações matemáticas O – o maiúsculo –, Ω – ómega maiúsculo – e Θ – theta maiúsculo –, que servem para classificar o comportamento assimptótico da função de complexidade de um algoritmo. Apresenta também as principais classes de complexidade e os tipos de problemas que, devido à sua importância e aplicabilidade, atraíram a atenção dos investigadores de algoritmos ao longo dos tempos. Apresenta ainda algumas das estratégias algorítmicas – força bruta e pesquisa exaustiva, dividir para conquistar, decrementar para conquistar, transformar para conquistar, programação dinâmica, algoritmos gananciosos e recursividade com retrocesso – que podem ser usadas para desenvolver algoritmos para problemas de diferentes áreas do conhecimento. São também expostos alguns dos conceitos matemáticos, bem como os somatórios das séries mais conhecidas, que são normalmente usados na análise de algoritmos. Finalmente, é descrito o pseudocódigo que vamos utilizar para descrever os algoritmos estudados ao longo do livro e são expostos vários algoritmos não recursivos e as respetivas análises formais. O Capítulo 2 é dedicado ao estudo dos algoritmos de pesquisa e de seleção. São apresentadas as pesquisas sequencial (Sequential Search), binária (Binary Search) e ternária (Ternary Search), sendo analisadas as diferentes versões possíveis (incluindo as versões recursivas) destes algoritmos. São também apresentadas a seleção do maior e do menor valores – separada (Max Select e Min Select) e simultânea (MaxMin Select) – e a seleção do K-ésimo menor valor (KMin Select, também designado por Quick Select). O Capítulo 3 é dedicado ao estudo dos algoritmos de ordenação. Começa por explicar os principais métodos de ordenação simples (seleção, troca e inserção) e complexos (fusão e separação). São apresentadas as ordenações Sequencial (Sequential Sort), Seleção (Selection Sort), Bubble (Bubble Sort), de Shell (Shell Sort), Heap (Heap Sort), Merge (Merge Sort), Inserção Recursiva (Insertion Recursive Sort) e Quick (Quick Sort). Para este último algoritmo são expostos os diferentes métodos de partição da sequência, nomeadamente as partições de Hoare, de Lomuto e Mediana de três, nas suas duas versões. Finalmente, é feita a comparação dos algoritmos de ordenação apresentados e discutido o limite inferior da complexidade da ordenação. O Capítulo 4 é dedicado ao estudo de algoritmos recursivos e da programação dinâmica. Começa por apresentar algoritmos recursivos simples que servem para introduzir a matemática necessária para a análise deste tipo de algoritmos, como é o caso da resolução de expressões recorrentes. São depois apresentados e analisados algoritmos recursivos típicos, como a conversão de decimal para binário, as Torres de Hanói e o cálculo das permutações. De seguida, é apresentado o teorema mestre que serve para determinar a XIV
© FCA – EDITORA DE INFORMÁTICA
SOBRE O LIVRO complexidade de um algoritmo recursivo pela simples análise da sua expressão recorrente. Finalmente, são apresentados dois algoritmos recursivos ineficientes – o cálculo dos números de Fibonacci e uma função numérica com recursividade não linear – que servem para mostrar como a estratégia da programação dinâmica permite implementar algoritmos repetitivos equivalentes mais eficientes. O Capítulo 5 é dedicado ao estudo de algoritmos numéricos que, aplicando as estratégias de dividir para conquistar ou de transformar para conquistar, permitem implementar algoritmos mais eficientes do que as suas implementações diretas. São apresentados e analisados os algoritmos do cálculo da potência, da avaliação do polinómio, da multiplicação binária por partição, da multiplicação de polinómios, do cálculo do determinante de uma matriz e da multiplicação de matrizes.
UTILIZAÇÃO DO LIVRO A organização de um livro e a composição dos capítulos observam a lógica e o gosto pessoal do autor. A sucessão dos capítulos reflete a sequenciação normalmente usada no estudo ou na lecionação da matéria exposta. No entanto, para melhor estruturar o estudo dos algoritmos, eles são apresentados por tipos de algoritmos: pesquisa e seleção, ordenação e numéricos. Portanto, o livro pode ser usado seguindo a sucessão apresentada dos capítulos, sendo que as versões recursivas dos algoritmos de pesquisa binária e ternária, os algoritmos de seleção simultânea do maior e do menor valores e do K-ésimo menor valor e os algoritmos de ordenação recursivos só devem ser apresentados depois da introdução da análise da complexidade de algoritmos recursivos simples, que servem para apresentar a matemática necessária para fazer a análise deste tipo de algoritmos. A denominação dos vários elementos apresentados ao longo do texto e o grafismo utilizado refletem também o gosto pessoal do autor. Assim, temos as seguintes designações: ■■
Algoritmo – refere-se aos algoritmos em pseudocódigo;
■■
Tabela – refere-se a tabelas de resultados da simulação dos algoritmos;
■■
Figura – refere-se a figuras descritivas e/ou demonstrativas dos algoritmos apresentados.
Convém também referir que este livro designa os arrays por sequências e as strings por sequências de carateres.
DESTINATÁRIOS Este livro é dirigido aos estudantes de disciplinas de programação avançadas, dedicadas ao estudo da análise da complexidade de algoritmos, que frequentam licenciaturas que exijam um conhecimento profundo sobre algoritmos. No apoio ao público brasileiro, no final do livro é disponibilizado um glossário de correspondência entre os principais termos técnicos utilizados em Portugal e no Brasil. © FCA – EDITORA DE INFORMÁTICA
XV
ANÁLISE DA COMPLEXIDADE DE ALGORITMOS
CONTACTE-NOS O Grupo Lidel, com a sua experiência de mais de 50 anos ao serviço da Ciência e a FCA, com mais de 20 anos de experiência na edição de livros técnicos de informática, empenharam-se, tal como em todos os livros que lançam no mercado, para que os objetivos do livro fossem cumpridos. Mas porque há sempre melhoramentos a fazer, agradecemos que todos os leitores que pretendam contribuir com sugestões o façam através do seguinte email: fca@fca.pt.
XVI
© FCA – EDITORA DE INFORMÁTICA
ANÁLISE DA COMPLEXIDADE DE ALGORITMOS ANÁLISE DA COMPLEXIDADE DE ALGORITMOS int BinarySearch BinarySearch (int (int array[], array[], int int n, n, int int value) value) int {{ min == 0; 0; min max == n-1; n-1; max while (min (min <= <= max) max) while {{ med == (min (min ++ max) max) // 2; 2; med if (array[med] (array[med] == == value) value) return return med; med; if
if (array[med] (array[med] << value) value) min min == med med ++ 1; 1; if else max = med - 1; else max = med - 1; } } return -1; } return -1; }
Algoritmo 2.3 - Pesquisa binária (primeira versão repetitiva) ALGORITMO 2.3 – PESQUISA BINÁRIA (PRIMEIRA VERSÃO REPETITIVA)
2.1 oo funcionamento deste deste algoritmo, Vamos mostrar na Figura Figura 2.1 algoritmo, procurando procurando o valor 34 numa sequência com 20 elementos ordenada por ordem crescente. sequência com 20 elementos ordenada por ordem crescente. 3
7
20 25 26 28 30 34 42 44 50 60 68 75 86 99 125 145 209 250
3
7
20 25 26 28 30 34 42
0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
9
10
11
12
13
14
15
16
17
18
19
8
28 30 34 42 5
6
7
8
34 42 7
8
Figura - UtilizaçãoDA daPESQUISA pesquisa BINÁRIA binária numa FIGURA 2.12.1 – UTILIZAÇÃO NUMA sequência SEQUÊNCIAordenada ORDENADA
Calcula-se o elemento médio da sequência através da divisão inteira da soma das posições Calcula-se o elemento médio da sequência através da divisão inteira da soma das posições mínima e máxima, que neste caso é o elemento de índice 9. Como o valor procurado, mínima e máxima, que neste caso é o elemento de índice 9. Como o valor procurado, que que é 34, é menor do que o valor armazenado no elemento médio, neste caso, 44, então é 34, é menor do que o valor armazenado no elemento médio, neste caso, 44, então isso isso significa que ele se encontra na primeira metade da sequência, passando a posição significa que ele se encontra na primeira metade da sequência, passando a posição máxima elemento àà esquerda esquerdada daposição posiçãomédia, média,ououseja, seja,a anova novaposição posiçãomáxima máximaé máxima para para oo elemento é agora o elemento índice 8. Se, contrário, o valor procurado fosse maior do que agora o elemento de de índice 8. Se, pelopelo contrário, o valor procurado fosse maior do que 44, 44, isso significaria que ele se encontrava na segunda metade da sequência, passando isso significaria que ele se encontrava na segunda metade da sequência, passando a novaa nova posição mínima o elemento à direita posiçãomédia, média,ououseja, seja,aa nova nova posição posição mínima para para o elemento à direita da da posição posição mínima de índice índice 10. 10. mínima seria seria oo elemento elemento de Agora que estamos a analisar a primeira metade da sequência, calcula-se a nova posição Agora que estamos a analisar a primeira metade da sequência, calcula-se a nova posição média, que é o elemento de índice 4. Como o valor procurado é maior do que o valor armédia, que é o elemento de índice 4. Como o valor procurado é maior do que o valor mazenado no elemento médio, que é 26, isso significa que ele se encontra na segunda armazenado no elemento médio, que é 26, isso significa que ele se encontra na segunda metade do intervalo intervalo em análise, passando posição mínima mínima para para o direita da metade do em análise, passando aa posição o elemento elemento àà direita da posição média, ou seja, para o elemento de índice 5. Agora, a nova posição média posição média, ou seja, para o elemento de índice 5. Agora, a nova posição média passa passa aa ser Como o valor procurado aindaainda é maior do quedo o valor ser oo elemento elemento de deíndice índice6. 6. Como o valor procurado é maior que armazeo valor nado no elemento médio, médio, que é 30, significa que ele se encontra na segunda armazenado no elemento queentão é 30,isso então isso significa que ele se encontra na metade da sequência em análise, passando a posição mínima para o elemento à direita da posição média, ou seja, para o elemento de índice 7. A nova posição média passa agora 40 FCA - Editora de Informática 42
© FCA – EDITORA DE INFORMÁTICA
direita da posição média, ou seja, para o elemento de índice 7. A nova posição média passa agora a ser o elemento de índice 7, cujo valor é ometade valor procurado, pelo a passando a posição segunda da sequência emque análise, pesquisa termina com sucesso e devolve o índicedireita 7. Para este resultado, foi o elemento de índic da obtermos posição média, ou seja, para EESSQ A P preciso analisar quatro elementos da sequência epassa fazeragora sete acomparações, enquanto a 7, cujo valor é o v QU AEES LEEÇ Çà ÃO O índice Pser SEEL oUIISSelemento de PESQUISA E SELEÇÃO pesquisa sequencial necessitaria de analisar oito elementos fazer oito para pesquisa etermina comcomparações sucesso e devolve o2 índice 7. Para o chegar ao mesmo resultado. A pesquisa sequencial otimizada analisaria os mesmos oito preciso mínima analisarpara quatro elementos segunda oo elemento àà da sequência e fazer sete segunda metade metade da da sequência sequência em em análise, análise, passando passando aa posição posição mínima para elemento elementos, mas faria nove comparações. pesquisa sequencial necessitaria de analisar oito elementos e f direita da posição média, ou seja, para o elemento de índice 7. A nova posição média direita da posição ou seja, para o7,elemento A nova posição a ser média, o elemento de índice cujo valorde é oíndice valor 7. procurado, pelo quemédia a pesquisa termina chegar ao mesmo resultado. A pesquisa sequencial otimizada passa ser de 7, valor éé oo valor procurado, pelo que passa agora agora aacom ser osucesso o elemento elemento de índice índice 7, cujo cujo valorobtermos valor procurado, pelo que aa analisar e devolve o índice 7. Para este resultado, foi preciso quaSe, por exemplo, o valor procurado fosse 40, que é maior do que 34, então a nova posição elementos, mas faria nove comparações. pesquisa com ee devolve 7. obtermos foi pesquisa termina termina com sucesso sucesso devolve ooe índice índicesete 7. Para Para obtermos este este resultado, resultado, foi sequencial tro elementos da sequência fazer comparações, enquanto a pesquisa mínima passaria para o elemento àsequência direita daeposição média, ou seja, para o elemento preciso quatro da sete comparações, enquanto aa de preciso analisar analisar quatro elementos elementos daoito sequência e fazer fazer seteoito comparações, enquanto necessitaria de analisar elementos emáxima. fazer comparações para chegar ao mesmo índice 8, exatamente igual ao valor da posição Naturalmente, a nova posição Se, por exemplo, o valor procurado pesquisa pesquisa sequencial sequencial necessitaria necessitaria de de analisar analisar oito oito elementos elementos ee fazer fazer oito oito comparações comparações para para fosse 40, que é maior do q média passaria a ser o elemento de índice 8, cujo valor é 42, passando a posição máxima resultado. A pesquisa sequencial otimizada analisaria os mesmos oito elementos, mínima passaria para o elemento à direita damas posição média, chegar chegar ao ao mesmo mesmo resultado. resultado. A A pesquisa pesquisa sequencial sequencial otimizada otimizada analisaria analisaria os os mesmos mesmos oito oito para o elemento à esquerda da posição média, ou seja, para o elemento de índice 7 e, faria nove comparações. índice 8, exatamente igual ao valor da posição máxima. Na elementos, elementos, mas mas faria faria nove nove comparações. comparações. portanto, as posições mínima e máxima trocavam posição, parando o ciclo de 8, cujo valor é 42, médiadepassaria a ser o elemento de índice Se, por oexemplo, o valor procurado fossecujo 40, que é maior do quemédia 34, então a nova posição pesquisa. Como valor armazenado no elemento índice é a posição final, que para oque elemento à aesquerda da posição média, ou seja, para Se, o valor procurado fosse 40, que é maior do que 34, então nova posição Se, por por exemplo, exemplo, o valor procurado fosse 40, que é maior do 34, então a nova posição mínima passaria o elemento à direita da posição ou seja, para o sem elemento de é o elemento de índice 8, épara diferente do valor procurado, então aposições pesquisa terminaria portanto, as média, mínima e máxima trocavam de po mínima para elemento da posição média, ou para de mínima passaria passaria para8,ooexatamente elemento àà direita direita da posição média, ou seja, seja, para oo elemento elemento de índice igual ao valor da posição máxima. Naturalmente, a nova posição mé- cujo índice sucesso e devolveria o índice −1 como sinal de pesquisa falhada. Neste caso, a função pesquisa. Como o valor armazenado no elemento índice igual da máxima. Naturalmente, aa nova índice 8, 8, exatamente exatamente iguala ao ao valor valor da posição posição máxima. Naturalmente, novaaposição posição passaria ser oda elemento de índice 8, dez cujoelemento valor é 42, posição máxima para analisariadia cinco elementos sequência, fazendo comparações, enquanto a pesquisa depassando 8, émáxima diferente do valor procurado, entã média aaíndice posição média passaria passaria aa ser ser oo elemento elemento de de índice índice 8, 8, cujo cujo valor valoréééo42, 42, passando passando posição máxima sequencial necessitaria de analisar os vinte elementos da sequência e fazer vinte o elemento à esquerda da posição média, ou seja, para o elemento de índice 7 e, portanto, sucesso devolveria índice77−1 para para de e, para oo elemento elemento àà esquerda esquerda da da posição posição média, média, ou ou seja, seja, para ooeelemento elemento deoíndice índice e, como sinal de pesquisa fal comparações para mínima chegar ao mesmo a pesquisa sequencial otimizada as posições mínima e máximaresultado. trocavamMas, de posição, parando oociclo de pesquisa. fazendo Como dez compa analisaria cinco elementos da sequência, portanto, as posições e máxima trocavam de posição, parando ciclo de portanto, as posições mínima e máxima trocavam de posição, parando o ciclo de analisaria nove elementos e faria dez comparações. sequencial necessitaria de analisar vinte elementos d o valor armazenado nono elemento éééaaaposição média que elemento pesquisa. oo valor armazenado elemento cujo índice posição média final, que pesquisa. Como Como valor armazenado no elementocujo cujoíndice índice posição média final, final, que é o os comparações para chegar ao mesmo resultado. de índice 8, é diferente do valor procurado, então a pesquisa terminaria sem sucesso e Mas, a pes éé oo elemento elemento de de índice índice 8, 8, éé diferente diferente do do valor valor procurado, procurado, então então aa pesquisa pesquisa terminaria sem sem K terminaria Se considerarmos uma sequência com N elementos, tal que N = 2 −1, então a primeira analisaria nove elementos e faria dez comparações. devolveria o índice como sinal de pesquisa falhada. Neste caso, a função analisaria sucesso oo índice −1 como sinal de falhada. Neste caso, aa função sucesso ee devolveria devolveria índice −1 −1 como sinal de pesquisa pesquisa falhada. Neste caso, função iteração daelementos pesquisa dabinária subdivide a dez sequência em duas, ambas com 2K−1−1 analisaria fazendo enquanto aa pesquisa cinco elementos da sequência, fazendo dez comparações, enquanto a pesquisa sequenanalisaria cinco cinco elementos da sequência, sequência, fazendo dez comparações, comparações, enquanto pesquisa elementos, mais o elemento central, que atua comoSepivô. Portanto, cada seguinte N elementos, tal que considerarmos uma sequência sequencial de os elementos da sequência ee eiteração fazer vinte sequencial necessitaria necessitaria de analisar analisar os vinte vinte elementos dada sequência fazer cial necessitaria de analisar os vinte elementos sequência fazer vinte com comparações K−i vai processar sempre 2 −1 elementos da sequência original e subdividi-la em duas da sequencial pesquisa binária subdivide a sequência em comparações chegar ao mesmo resultado. Mas, aapesquisa pesquisa otimizada comparações para para chegar chegar ao ao mesmo mesmo resultado. resultado. Mas, Mas,aiteração pesquisa sequencial otimizada para sequencial otimizada analisaria nove sequências com o mesmo tamanho, até que na última iteração a sequência é central, reduzidaque a atua elementos, mais o elemento como pivô. Port analisaria nove elementos e faria dez comparações. analisaria noveelementos elementoseefaria fariadez dezcomparações. comparações. um elemento apenas, caso o valor não tenha sido encontrado. vai processar sempre 2K−i−1 elementos da sequência origin KKtal que K mesmo tamanho, que na última iteraçã −1, entãoaté a primeira Se considerarmos com tal Nsequências elementos, N= 2primeira Se uma com N que −1, aa primeira Se considerarmos considerarmos uma sequência sequênciauma comsequência N elementos, elementos, tal que N N == 22com −1,oentão então Podemos ver a execução da pesquisa binária numa sequência, como uma árvore K−1 K−1de K−1 um elemento apenas, caso o valor não tenha sido encontrado. iteração da pesquisa binária subdivide a sequência emambas duas, ambas 2 −1 elemeniteração binária subdivide aaK sequência em com iteração da da pesquisa pesquisa binária subdivide sequência em duas, duas, ambas com 22com−1 −1 decisão binária. Se a sequência tiver 2 −1 elementos, então a árvore de decisão binária elementos, oo mais elemento central, que como cada seguinte tos, o elemento que atuapivô. comoPortanto, pivô. Portanto, cadai iteração seguinte vai proelementos, mais mais elemento central,central, que atua atua como pivô. Portanto, cada iteração iteração seguinte K log2 N 1 e cada nível da árvore contém 2 elementos, com binária numa sequên está completa, tem2K−i altura K−i−1 elementos Podemos ver a execução da pesquisa K−i vai processar sempre da sequência original e subdividi-la em duas −1 elementos da sequência original e subdividi-la duas sequências vai processar cessar sempresempre 2 −12elementos da sequência original e subdividi-la ememduas decisão binária. Se a sequência tiver 2K−1 elementos, então 0 ≤ i ≤com K−1. caso de a sequência não corresponder a uma árvore de decisão completa, sequências ooNo mesmo tamanho, até que na última iteração a sequência é reduzida a sequências com mesmo tamanho, até que na última iteração a sequência é reduzida a com o mesmo tamanho, até que na última iteração a sequência é reduzida a um elemento log N1 1e e cada nível da árvor está completa, alturaK K log −1, então a não árvore de sido decisão binária tem alturatem K, com ou seja, apenas, se N ≠ 2Kcaso 2 2 N um um elemento elemento apenas, valor tenha encontrado. apenas,caso casoooovalor valornão nãotenha tenhasido sidoencontrado. encontrado. i ≤ K−1. de a sequência não corresponder a uma arredondado por excesso ao próximo inteiro. Esta0 ≤árvore temNo os caso primeiros K−1 níveis K Podemos ver a execução da pesquisa binária numa sequência, como uma árvore de de-binária tem al Podemos aa execução da binária sequência, uma árvore de então ou seja, se N ≠ 2 −1, iguaisver à árvore de decisão completa, mas, numa no último nível, ocomo nível K−1, tema árvore entre Podemos ver execução da pesquisa pesquisa binária numa sequência, como uma árvore de 1dee decisão KK K−1 K elementos, então a Kárvore de decisão binária cisão Se ativer sequência tiver 2 −1arredondado decisão Se sequência 22 −1 então de decisão binária 2 binária. −1 elementos. Consequentemente, o algoritmo fazaa árvore no máximo iterações parainteiro. decisão binária. Se aabinária. sequência tiver −1 elementos, elementos, então árvore deexcesso decisão binária por ao próximo Esta árvore te ii i KK tem log 11 eeKcada árvore contém 2 elementos, com está tem altura eeiguais cada nível da árvore contém 2 elementos, com completa, altura N 1da log2nível arredondado por excesso ao próximo pesquisarestá otem valor procurado, com log22NN cada nível da árvore contém 2 elementos, com está completa, completa, altura à árvore de decisão completa, mas, no último nível, K−1 0≤ i ≤ K−1. No caso denão a sequência não acorresponder alog uma árvore 00 ≤≤ ii ≤ caso de aa sequência corresponder decisão −1árvore elementos. o algoritmo faz no inteiro. Portanto, é mais correto definir K da seguinte forma: K de 1completa, . de decisão completa, ≤ K−1. K−1. No No caso de sequência não corresponder a2uma uma árvore de decisão completa, 2 NConsequentemente, KK K então a árvore de tem decisão binária tem K,com se Naa≠árvore 2 −1, de −1, decisão binária altura com KK altura 1com ou 22 seja, pesquisar oK, procurado, −1, então então árvore de decisão binária tem altura K,valor com log log22NN 1 ee K log2 N 1 e arredonda ou seja, seja, se se N N ≠≠ou e2.2 arredondado por excesso próximo inteiro. árvore tem os primeiros K−1 níveis A Figurapor apresenta a árvore de ao decisão relativa a uma sequência com 15 arredondado excesso ao inteiro. Esta árvore tem os K−1 níveis inteiro. Portanto, é mais correto definir K da seguinte forma: K arredondado por excesso ao próximo próximo inteiro. Estabinária árvore temEsta os primeiros primeiros K−1 níveis iguais àque árvore de completa, mas, no último nível, o nível K−1, tem 1 e 2K−1−1 pelo K completa, =completa, 4 edecisão a árvore tem níveis. iguais àà árvore de mas, no último nível, oo nível K−1, tem entre 11 entre ee iguaiselementos, árvore de decisão decisão mas, noquatro último nível, nível K−1, tem entre K−1−1 elementos. Consequentemente, o algoritmo faz no máximo K iterações para 22K−1 elementos. Consequentemente, o algoritmo faz máximo no 2.2 máximo iterações para o −1 elementos. Consequentemente, o algoritmo faz no K Kiterações para A Figura apresenta a árvore depesquisar decisão binária relativa K log N 1 e arredondado por excesso ao próximo pesquisar o valor procurado, com por excesso ao próximo inteiro. Portanvalorprocurado, procurado, com com K log22 N 1 ee arredondado arredondado por excesso ao próximo pesquisar o valor elementos, pelo que K = 4 e a árvore tem quatro níveis. FCA - Editora de Informática 41 to, ééé mais mais corretodefinir definir K K forma: inteiro. seguinte inteiro. Portanto, Portanto, mais correto correto definir K da da seguinte seguinte forma: forma: KK log log22NN11.. FCA - Editorarelativa de Informática A Figura 2.2 apresenta a árvore de decisão binária a uma sequência com 15 ele-
A apresenta aa árvore de decisão binária relativa aa uma A Figura Figura 2.2 2.2 mentos, apresentapelo árvore decisão binária relativa uma sequência sequência com com 15 15 que K =de4 e a árvore tem quatro níveis. elementos, elementos, pelo pelo que que K K == 44 ee aa árvore árvore tem tem quatro quatro níveis. níveis. FCA FCA--Editora Editorade de Informática Informática
41 41
© FCA – EDITORA DE INFORMÁTICA
43
N ÁLISE DADA OM PLEXIDADE DE AL GOALGORITMOS RITMOS A C ANÁLISE COMPLEXIDADE DE N N LILE IS IE SD EED DD AAC OO M M P LEE XX IA D ID AA EED EEA L GG OO IT IM T M M A A C C A A N Á S A O M PPE LLX E ID A D E E LLG O R IM T O SSS N Á LÁÁ ILS A O M P L IXD D EDD D EDD L G O R IR TR O SOO AA C A A NÁ ÁL LIIS SE ED DA AC OM MP PL LE EX XIID DA AD DE ED DE EA LG GO OR RIIT TM MO OS S AN CO AL 3 7 20 26 28 30 34 44 50 60 68 86 99 145 209 20 20 26 26 28 28 30 30 34 34 44 44 50 50 60 60 68 68 86 86 99 99 145 145 209 209 145 209 3 3337 7772020 2626 2828 3030 3434 4444 5050 6060 6868 8686 9999 145 209 3 3 7 7 20 20 26 26 28 28 30 30 34 34 44 44 50 50 60 60 68 68 86 86 99 99 145 145 209 209 44 44 44 4444 44 44
nível 0 nível nível nível nível 0 000 nível nível 0 0 nível 1 nível nível nível nível 1 111 nível nível 1 1
26 26 26 2626 26 26 30 30 30 3030 30 30
7 7 777 7 7
nível 2 nível nível nível nível 2 222 nível nível 2 2 nível 3 3 nível nível nível nível 3 333 3 333 nível 3 nível 3 3 3
86 86 86 8686 86 86
28 28 28 2828 28 28
20 20 20 2020 20 20
60 60 60 6060 60 60
34 34 34 3434 34 34
50 50 50 5050 50 50
145 145 145 145 145 145 145
68 68 68 6868 68 68
99 99 99 9999 99 99
209 209 209 209 209 209 209
K Figura 2.2 Árvore de decisão da pesquisa binária numa sequência do tipo N = 2 KKK−1 Figura Figura 2.2 2.2 ---Árvore Árvore Árvore de de decisão decisão da da pesquisa pesquisa binária binária numa numa sequência sequência do do tipo tipo N= = =K22 2 −1 −1 Figura 2.2 de decisão da pesquisa binária numa sequência do tipo −1 Figura 2.2 - -Árvore de decisão da pesquisa binária numa sequência do tipo NNN = 2 −1 K K−1 Figura 2.2 Árvore de decisão da pesquisa binária numa sequência do tipo N = 2 Figura2.2 2.2 Árvore DE de decisão numa sequência do DO tipoTIPO N =N2=−1 FIGURA – -ÁRVORE DECISÃOda DApesquisa PESQUISAbinária BINÁRIA NUMA SEQUÊNCIA 2K–1
Na pesquisa binária, melhor caso acontece quando oovalor valor procurado se encontra na Na pesquisa binária, oomelhor melhor caso acontece valor procurado se encontra Na Na pesquisa pesquisa binária, binária, melhor melhor caso caso acontece acontece quando quando valor valor procurado procurado se se encontra encontra na na Na pesquisa binária, caso acontece quando procurado encontra Na pesquisa binária, ooooomelhor caso acontece quando oooovalor procurado sese encontra nana Na pesquisa binária, melhor caso acontece quando valor procurado se encontra na N / 2 , o que ou seja, quando o valor encontra na posição posição central da sequência, quando o se encontra na posição , o que que que posição posição central central da da sequência, sequência, ou ou seja, seja, quando quando valor valor se se encontra encontra na na posição posição posição central sequência, ou seja, quando encontra posição posição central dada sequência, ou seja, quando ooovalor sese encontra nana posição NN/NNNN2////2/222,2,o,,,ooque ooque que posição central da sequência, ou seja, quando oovalor valor se encontra na posição exige fazer apenas uma comparação para oo encontrar, ee oo pior caso acontece quando o exige fazer apenas uma comparação para encontrar, pior caso acontece quando exige exige fazer fazer apenas apenas uma uma comparação comparação para para o o encontrar, encontrar, e e o o pior pior caso caso acontece acontece quando quando exige fazer apenas uma comparação para encontrar, pior caso acontece quando exige fazer apenas uma comparação para oooencontrar, e eoeoopior caso acontece quando oooooo exige fazer apenas uma comparação para encontrar, pior caso acontece quando valor procurado não existe na sequência, que exige repetir processo iterativo até se valor procurado não existe na sequência, ooque que exige repetir ooprocesso processo iterativo até se valor valor procurado procurado não não existe existe na na sequência, sequência, que que exige exige repetir repetir processo processo iterativo iterativo até até se se valor procurado não existe sequência, exige repetir iterativo até valor procurado não existe nana sequência, oooooque exige repetir oooooprocesso iterativo até sese valor procurado não existe na sequência, que exige repetir processo iterativo até se atingir o último nível da árvore de decisão, ou seja, fazer as K iterações. Como cada iteraatingir o último nível da árvore de decisão, ou seja, fazer as K iterações. Como cada atingir atingir o o último último nível nível da da árvore árvore de de decisão, decisão, ou ou seja, seja, fazer fazer as as K K iterações. iterações. Como Como cada cada atingir o último nível da árvore de decisão, ou seja, fazer as K iterações. Como cada atingir o último nível da árvore de decisão, ou seja, fazer as K iterações. Como cada atingir ono último nívelduas da duas árvorecomparações, de decisão, ou seja, fazer as Ktemos iterações. Como cada iteração faz, no máximo, então no pior caso 2K comparações ção faz,faz, máximo, comparações, então no no pior caso temos 2K 2K comparações para iteração iteração faz, faz, no no máximo, máximo, duas duas comparações, comparações, então então no no pior pior caso caso temos temos 2K 2K comparações comparações iteração faz, no máximo, duas comparações, então no pior caso temos 2K comparações iteração no máximo, duas comparações, então pior caso temos comparações iteração faz, no máximo, duas comparações, então no pior caso temos 2K comparações para determinar que o valor não se encontra na sequência. Logo: determinar queque o valor nãonão se encontra nana sequência. Logo: para para determinar determinar que que valor valor não não se se encontra encontra na na sequência. sequência. Logo: Logo: para determinar que não se encontra na sequência. Logo: para determinar ooovalor se encontra sequência. Logo: para determinar que oovalor valor não se encontra na sequência. Logo:
NN11111 B(N) W(N) log 2N B(N) B(N) 111 1e eeeeeW(N) W(N) W(N) 222 2log log log B(N) W(N) B(N) 1 2 log log 22N 2 2N B(N) B(N) 1 1 ee W(N) W(N) 2 2 log N 1 1 22 N
Vamos começar por analisar o caso caso médio em que aapesquisa pesquisa tem sempre sucesso, para Vamos começar por analisar caso médio em que pesquisa tem sempre sucesso, para Vamos Vamos começar começar por por analisar analisar caso médio médio em em que que pesquisa tem tem sempre sempre sucesso, sucesso, para para Vamos começar por analisar médio em que tem sempre sucesso, para Vamos começar por analisar oooocaso médio em que a aapesquisa tem sempre sucesso, para oooooo K Vamos começar por analisar oocaso caso médio em que aKapesquisa tem sempre sucesso, para KK−1. K Neste caso, a árvore binária de Kpesquisa caso de uma sequência com N elementos, com N = 2 o caso de uma sequência com N elementos, com N = 2 −1. Neste caso, a árvore binária K −1. −1. Neste Neste caso, caso, árvore árvore binária binária de dei caso caso de de uma uma sequência sequência com com N N elementos, elementos, com com N N −1. Neste caso, binária caso uma sequência com elementos, com Neste caso, a aaárvore binária dede caso dede uma sequência com NN elementos, com NN ===2==2222−1. K −1. Neste caso, aaárvore árvore binária de caso de uma sequência com N elementos, N ii i i2 decisão tem K níveis completos, do nível 00com ao nível K−1, eecada cada nível iida da árvore tem de decisão tem K níveis completos, do nível 0nível ao nível K−1, e cada nível iárvore da árvore tem decisão decisão tem tem K K níveis níveis completos, completos, do do nível nível 0 ao ao nível nível K−1, K−1, e cada cada nível nível i da da árvore árvore tem tem decisão tem K níveis completos, do nível 0 ao K−1, e nível i árvore tem 2 decisão tem K níveis completos, do nível 0 ao nível K−1, e cada nível i da tem 2 decisão temPara K níveis completos, do nível 0 fazer ao nível K−1, e cada nível i da árvore tem 222ii elementos. atingir o nível i, é preciso 2i comparações e, se o valor procurado i elementos. elementos. Para Para atingir atingir nível nível preciso preciso fazer fazer 2i 2i comparações comparações e, se se valor valor procurado procurado 2 elementos. Para atingir onível nível preciso fazer 2i comparações e,se se valor procurado elementos. Para atingir fazer comparações procurado elementos. Para atingir ooonível i,i,i,i, éi,éi,épreciso fazer 2i2i comparações e,e,e, se ooovalor procurado elementos. Para atingir oonível ééépreciso preciso fazer 2i comparações e, se ooovalor valor procurado for um dos elementos desse nível, então aaaprimeira primeira comparação efetuada nesse nível for for um um dos dos elementos elementos desse desse nível, nível, então então a primeira primeira comparação comparação efetuada efetuada nesse nesse nível nível for um dos elementos desse nível, então a comparação efetuada nesse nível for um dos elementos desse nível, então primeira comparação efetuada nesse nível for um dos elementos desse nível, então a primeira comparação efetuada nesse nível é éééééé for um dos elementos desse nível, então a sucesso primeiradecomparação efetuada nesse nível bem sucedida. Ou seja, a pesquisa com um valor no nível i custa 2i+1 bem bemsucedida. sucedida. sucedida.Ou Ou Ouseja, seja, seja,aaaaapesquisa apesquisa pesquisa pesquisacom com com sucesso sucessode de de um um valor valor no nonível nível nível custa custa 2i+1 2i+1 bem sucedida. Ou seja, pesquisa com sucesso um valor no nível 2i+1 bem sucesso dede um valor i iicusta bem sucedida. Ou seja, com sucesso um valor nono nível i custa 2i+12i+1 combem sucedida. Ou seja, pesquisa com sucesso de um valor no nível ii custa custa 2i+1 comparações. Vamos assumir que todas as posições da sequência são equiprováveis, pelo comparações. comparações. Vamos Vamos assumir assumir que que todas todas as as posições posições da da sequência sequência são são equiprováveis, equiprováveis, pelo pelo comparações. Vamos assumir que todas posições da sequência são equiprováveis, pelo comparações. Vamos assumir que todas asas posições da sequência são equiprováveis, pelo parações. Vamos assumir que todas as posições da sequência são equiprováveis, pelo comparações. Vamos assumir que todas as posições da sequência são equiprováveis, pelo que a probabilidade de o valor procurado se encontrar numa posição da sequência, numa que que a a probabilidade probabilidade de de o o valor valor procurado procurado se se encontrar encontrar numa numa posição posição da da sequência, sequência, numa numa que a probabilidade de o valor procurado se encontrar numa posição da sequência, numa que a probabilidade de o valor procurado se encontrar numa posição da sequência, numa que a probabilidade de o valor procurado se encontrar numa posição da sequência, numa que a probabilidade desucesso, o valor éprocurado se encontrar numa posição da do sequência, numa pesquisa sempre com de 1/N. Nesta situação, complexidade caso médio de pesquisa pesquisa sempre sempre com com sucesso, sucesso, éééde de 1/N. 1/N. Nesta Nesta situação, situação, aaaacomplexidade complexidade complexidade do do caso caso médio médio de de pesquisa sempre com sucesso, 1/N. Nesta situação, do caso médio pesquisa sempre com sucesso, é éde 1/N. Nesta situação, a acomplexidade do caso médio dede pesquisa sempre com sucesso, éde de 1/N. Nesta situação, a complexidade do caso médio pesquisa sempre com sucesso, de 1/N. Nesta situação, complexidade do caso médio de pesquisa é dada pela seguinte expressão: pesquisa pesquisa é é dada dada pela pela seguinte seguinte expressão: expressão: pesquisa é dada pela seguinte expressão: pesquisa é dada pela seguinte expressão: de pesquisa é dada seguinte expressão: pesquisa é dada pelapela seguinte expressão: K K K KKK1K1111 1 1 1 i K111 1 i K111 KK K11 K111 K KK1 K KK1 KKKK1 1 1KKKK11i112i i ii 2i 1 1111 1 1K 2 1 i1 K 1 i1 11111 i ii K i ii K i i 1111 i i i A(N) 2 2 2 2 1 1 1 K 12 K K i i K i i 1 A(N) A(N) 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2i2iiii i i i i i i 1 A(N) 2 2 1 2 2 2 2 2 2 i i i i i i i A(N) 2 2 1 2 2 2 2 2 2 i i i 1 1 i i i i A(N) A(N) N 2 2ii 1 N 2ii 2 2 2i ii000ii 2 2 NNN i ii0002 2 1 NNN i ii0002 2 i ii0002 NNN 2 2 i ii0002 N N N N N N i i 0i 00 i i 0i 00 N Ni i 0ii 000 N ii 0ii 000 N ii 0ii 000 i 0 i 0 K K K K 1 2 2 K 2 1 4 K 2 1111 11111 KKK K 2 K 2 KKK 1 1 KKK 2K 4 K 2 KKK 1 2 2 2 2 2 2 K K 2 2 2 2 1 1 4 4 2 2 2K 2K 4 4 2 2 1 1 2 2 2 K 2 2 1 4 2 2K 4 2 1 K K K K 1 2 2 2 K 2 2 1 4 2 2K 4 2 1 1 NNN 2 2 2 2 2 2K K K 2 2 2 2K 1 1N NNN 4 4 2 2K 2K 2K 4 4 2 2K 1 1 N N N N N N N 1 K 11111 3 K 2 KKK 2K 3 2K 2K 2K 3333322222KK2K 1 33333 NNN 32 2K 2K 3 N N N N
K NN111,11,,então Como log ,,então então ,, pelo pelo que expressão pode ser simplificada 2N Como ComoKKKKKKlog log log log então então2K2222K2KKKKNNN N1 ,1,11 1 pelo pelo que que expressão expressão pode pode ser sersimplificada simplificada simplificada Como então ,,pelo que aaaaexpressão expressão pode ser simplificada Como pelo que a aexpressão pode serser simplificada e apreComo N que pode e eeee 22N 2 2N Como log N 1 , então K log22 N 1 2 N N 1 1 , pelo que a expressão pode ser simplificada e apresentada da seguinte forma: sentada dada seguinte forma: apresentada apresentada da da seguinte seguinte forma: forma: apresentada da seguinte forma: apresentada seguinte forma: apresentada da seguinte forma:
FCA - Editora de Informática FCA FCA FCA -Editora Editora de deInformática Informática Informática --Editora FCA - Editora dede Informática FCA FCA -- Editora Editora de de Informática Informática
42 42 42 42 42 42 42
44
© FCA – EDITORA DE INFORMÁTICA
PESQUISA EPPPPSELEÇÃO 2ÃÃÃOOOO E S Q U A E E L E Ç S E S Q U S A E E L E Ç S E ES SQ QU UIIIS IS SA AE ES EL LE EÇ ÇÃ SE
PESQUISA E SELEÇÃO
1111 2NK 2K 3N 1111 1111 2NK 3N 2K 2K A(N) 2NK 2K 3N NNN11112K 2NK 3N 2K 2K A(N) A(N) 2NK2K 2K3N 3N 2NK3N 3N2K 2K3333 N 2NK 2K3333 N 33332NK A(N) N 3333N N N NN NN NN N 2K 2K 2K 2K A(N) 2K A(N) 2K A(N) A(N)2K 2K N 3333 NN N
muito grandes de de N, tendetende para 0,para obtemos a seguinConsiderando que, para valores muito grandes de N, 2K/N tende para 0, obtemos Considerando que, para valores muito grandes N, 0, aaa Considerando que, que,para paravalores valores muito grandes de2K/N N, 2K/N 2K/N tende para 0, obtemos obtemos seguinte expressão simplificada: te expressão simplificada: seguinte expressão simplificada: seguinte expressão simplificada: A(N) 2K A(N) 2K A(N) A(N)2K 2K3333 K K
K 100% −1, pesquisa binária (com 100% de sucesso) faz em Assim, para sequências com N Assim, para sequências comN N== = −1, pesquisa binária de sucesso) faz em Assim, −1,aaaapesquisa pesquisabinária binária(com (com100% 100%de desucesso) sucesso)faz fazem em Assim,para parasequências sequênciascom com N =2222KK−1, 2 log N 1 3 2 log N 1 3 comparações. média, aproximadamente, 2 log N 1 3 comparações. média, aproximadamente, 2 média, aproximadamente, aproximadamente, 2 log222 N 1 3 comparações. comparações.
Vamos agora considerar a situação em que a pesquisa por vezes não é bem sucedida. Os
Vamos agora considerar situação em que pesquisa por vezes não bem sucedida. Os Vamos Vamos agora agora considerar considerar aaa situação situação em em que que aaa pesquisa pesquisa por por vezes vezes não não ééé bem bem sucedida. sucedida. Os Os N+1 casos possíveis, em em que que oo valor valor não se encontra na sequência, estão na situação situação do do N+1 casos possíveis, não se encontra na sequência, estão na N+1 casos possíveis, em que o valor não se encontra na sequência, estão na situação do N+1 casos possíveis, em que o valor não se encontra na sequência, estão na situação do pior caso, pelo que cadaum umdesses dessesvalores valorescusta custa 2Kcomparações comparações para determinar que pior caso, pelo que cada um desses valores custa 2K comparações para determinar que pior 2K para determinar que ooo pior caso, caso, pelo pelo que que cada cada um desses valores custa 2K comparações para determinar que o valor não se encontra na sequência. Nesta situação, a complexidade do caso de valor não se encontra na sequência. Nesta situação, a complexidade do caso médio de valor não se encontra na sequência. Nesta situação, a complexidade do caso médio de valor não se encontra na sequência. Nesta situação, a complexidade do caso médio de pesquisa pesquisa dada pela seguinte expressão: pesquisa dadapela pelaseguinte seguinteexpressão: expressão: pesquisa éééédada dada pela seguinte expressão: KKKK1111 iii 1111 A(N) 2K NNN11112K A(N) 2K A(N) A(N) 2N 1 2222i 2222iiii 1111 N 2K 2N 2N 2N111 iiii0000 K K 1 1 K K 1 1 K K K K 1 1 1 1 ii 1111 2i 2iiii N 2K N 2K 11112K 222iii 222 2222i i N N 2K 2N 2N 2N 2N1111 iiii0000 0 i 0 i i i00 111 KKK 1 K 2K N 2K 2K N 2K 33332222 2K 2K3333N N11112K 2K 2N 2N 2N 2N1111
K
K Como simplificar apresentá-la da seguinte forma: Como podemos simplificar expressão apresentá-la da seguinte forma: Como podemos expressão Como 2222KK NNNN1111,,,,podemos podemossimplificar simplificaraaaaexpressão expressãoeeeeapresentá-la apresentá-lada daseguinte seguinteforma: forma:
1111 1111 KKK KKK 2K KKK111 2K KKK A(N) 2K A(N) 2K 2K 2K A(N) A(N) 2N 1 33332222K 2K 2K 33332222K 2K 2K 2N 1 2222K 12K 2K 2222K 33333333 2N 2N 2N 2N 2N111 2N111
KKK111 KKK111 podemos Como simplificar apresentá-la 2N Como ainda mais expressão 2N Como podemos simplificar ainda mais expressão apresentá-la 2N11112222K 1 11112222K 1,,,,podemos Como 2N podemos simplificar simplificarainda aindamais maisaaaaexpressão expressão eeee apresentá-la apresentá-la seguinte forma: da seguinte forma: da daseguinte seguinteforma: forma:
1111 3333 3333 KKK111 2K KKK A(N) 2K 2K 1.5 A(N) 2K 2K 2K 1.5 A(N) A(N) KKK111 2222K 12K 2K2222K 33333333 2K 2K 2 KKK111 2K 2K1.5 1.5 K 1 2 2 2 22 222K 1 222 K K
KK para sequências comN N== = pesquisa 50% de sucesso) em Assim, sequências com N −1, pesquisa binária (com 50% de sucesso) faz Assim, para sequências em Assim, para sequências com com N =2222K−1, −1, aaa pesquisa pesquisa binária binária (com (com 50% 50% de de sucesso) sucesso) faz faz em 2 log N 1 1.5 2 log N 1 1.5 comparações. média, aproximadamente, 2 log N 1 1.5 comparações. média, aproximadamente, média, aproximadamente, aproximadamente, 2 log2222 N 1 1.5 comparações. comparações.
Ora, este valor é ligeiramente maior do que o número de comparações efetuadas no caso
Ora, este valor ligeiramente maior do que número de comparações efetuadas no caso Ora, Ora, este este valor valor ééé ligeiramente ligeiramente maior maior do do que que ooo número número de de comparações comparações efetuadas efetuadas no no caso caso médio (mais (mais 1.5 1.5 comparações), comparações), quando quando se sesabe sabeque queo ovalor valorprocurado procuradoestá estánanasequência. sequência. médio médio (mais 1.5 comparações), quando se sabe que o valor procurado está na sequência. médio (mais 1.5 comparações), quando se sabe que o valor procurado está na sequência.
Assim, concluímos que a pesquisa binária tem complexidade logarítmica O(log2 N) e que
Assim, concluímos que binária tem logarítmica O(log Assim, concluímos que pesquisa binária tem complexidade N) que Assim, concluímos que aaa pesquisa pesquisa binária tem complexidade complexidade logarítmica O(log2222 N) N) eee que que se degrada pouco quando se procuram valores inexistentes nalogarítmica sequência.O(log se degrada pouco quando se procuram valores inexistentes na sequência. se se degrada degrada pouco pouco quando quando se se procuram procuram valores valores inexistentes inexistentes na na sequência. sequência. Como a grande maioria dos elementos está nos últimos níveis da árvore de decisão, então 43 43 43 43 a pesquisa binária consiste em dar prioridade à partição da sequên-
FCA Editora de Informática FCA Editora de Informática FCA FCA---forma -Editora Editorade de Informática uma deInformática otimizar
© FCA – EDITORA DE INFORMÁTICA
45
RECURSIVIDADE E PROGRAMAÇÃO DINÂMICA
4
R EP RO OG GR RA AM MA AÇ ÇÃ ÃO OD NÂ ÂM MIIC CA A EC CU UR RS SIIV VIID DA AD DE EE RE PR DIIN
Resolvendo expressão recorrente, recorrente,temos: temos: Resolvendo aa expressão E(N) 2 E(N 1) 1 2 2 E(N 2) 1 1 4 E(N 2) 2 1 2 22 E(N 2) 211 200 ... 2ii E(N i ) 2ii11 ... 211 200 2ii E(N i )
i 11
2 jj 2ii E(N i ) 2ii 1
j 00
Para Para atingirmos atingirmos oo valor valor de de paragem paragem E(1), E(1),que que éé igual igualaa1,1,temos temos que que N−i N−i == 1, 1, ou ou seja, seja, ii = assim aa seguinte seguinteexpressão expressãofinal: final: = N−1, N−1, obtendo obtendo assim E(N) 2NN11 E(1) 2NN11 1 2NN11 2NN11 1 2NN 1 N N signiPortanto, dede Hanói temtem complexidade exponencial O(2N).O(2 Isto Portanto, oo algoritmo algoritmodas dasTorres Torres Hanói complexidade exponencial ). Isto fica que se considerarmos a mudança de umdedisco por segundo (sem enganos) e se aetorre significa que se considerarmos a mudança um disco por segundo (sem enganos) se a tiver discos serãoserão precisos 348 séculos parapara fazerfazer a mudança dos dos discos. torre 40 tiver 40 discos precisos 348 séculos a mudança discos.
4.5 Cálculo das permutações
4.5 CÁLCULO DAS PERMUTAÇÕES
Consideremos agora que se pretende imprimir todas as permutações de um conjunto de N carateres. Por exemplo, se o conjunto de carateres for {a,b,c}, então o conjunto das Consideremos agora que se pretende imprimir todas as permutações de um conjunto permutações é {(a,b,c), (a,c,b), (b,a,c), (b,c,a), (c,a,b), (c,b,a)}, ou seja, existem N! de N carateres. Por exemplo, conjunto de carateres {a,b,c}, então o conjunto das permutações. Podemos obter se umoalgoritmo simples parafor gerar todas as permutações de permutações é {(a,b,c), (b,a,c), (b,c,a), (c,a,b), (c,b,a)}, ou seja, existem N! permuum conjunto de carateres(a,c,b), se construirmos um algoritmo recursivo. tações. Podemos obter um algoritmo simples para gerar todas as permutações de um conjunto de carateres se construirmos um algoritmo Por exemplo, as permutações do conjunto {a,b,c,d}recursivo. são os quatro seguintes grupos de
permutações: das permutações do {a,b,c,d} conjunto são {b,c,d}, b seguido das permutações Por exemplo, aasseguido permutações do conjunto os quatro seguintes grupos de do conjunto {a,c,d}, c seguido das permutações do conjunto {b,a,d} e d seguido das permutações: a seguido das permutações do conjunto {b,c,d}, b seguido das permutações permutações do conjunto {b,c,a}. do conjunto {a,c,d}, c seguido das permutações do conjunto {b,a,d} e d seguido das permutações do conjunto {b,c,a}. É então possível resolver o problema para N carateres se tivermos um algoritmo recursivo
que funcione para N−1 carateres. Empara cada passo do se processo coloca-se um caráter É então possível resolver o problema N carateres tivermos um algoritmo recursi-à esquerda do conjunto e calculam-se recursivamente as processo permutações dos N−1 restantesà vo que funcione para N−1 carateres. Em cada passo do coloca-se um caráter carateres àdodireita. Depois, troca-se sucessivamente o caráter da esquerda comrestantes um dos esquerda conjunto e calculam-se recursivamente as permutações dos N−1 carateres da direita, de forma a ter experimentado todos os N grupos possíveis de carateres à direita. Depois, troca-se sucessivamente o caráter da esquerda com um dos permutações dos N−1 carateres. Durante o processo recursivo, quando se tiver atingido o carateres da direita, de forma a ter experimentado todos os N grupos possíveis de permucaráter dos maisN−1 à direita, imprime-se permutações acabada deatingido gerar. o caráter tações carateres. Duranteaosequência processo de recursivo, quando se tiver mais à direita, imprime-se a sequência de permutações acabada de gerar.
O Algoritmo 4.9 é um algoritmo recursivo não linear que gera as permutações de uma
O Algoritmo é um algoritmo recursivo não linearutiliza que gera as permutações de. uma sequência de4.9 carateres. Para trocar os carateres a operação SwapChar Este sequência carateres. Para trocar os carateres a operação SwapChar algorit-é algoritmo édeum bom exemplo da utilização da utiliza recursividade, uma vez que. Este a solução bastante e elegante. Repare da querecursividade, nas sucessivas invocações o mo é umsimples bom exemplo da utilização uma vez que arecursivas solução é apenas bastante segundo parâmetro, que representa o índice inicial da sequência, varia. simples e elegante. Repare que nas sucessivas invocações recursivas apenas o segundo parâmetro, que representa o índice inicial da sequência, varia. FCA FCA -- Editora Editora de de Informática Informática
129 © FCA – EDITORA DE INFORMÁTICA
131
N ÁLISE DA DA OM PLEXIDADE DE AL GOALGORITMOS RITMOS AN CO ANÁLISE COMPLEXIDADE Á G A ÁL LIIS SE ED DA AC MP PL LE EX XIID DA AD DE ED DE EA GO OR RIIT TM MO OS S AN COM ALLDE
void Permutations Permutations (char list[], list[], int i, i, int n) n) void void Permutations (char (char list[], int int i, int int n) { void Permutations (char list[], int i, int n) { { if (i == n) printf ("%s\n", list); { if == printf ("%s\n", list); if (i (i for == n) n) printf ("%s\n", list); else (j printf = i; i; j j (“%s\n”, <= n; n; j++) j++) else (j = <= if (i for == n) list); else for (j = i; j <= n; j++) { { else for { (j = i; j <= n; j++) SwapChar (list[i], (list[i], list[j]); list[j]); { SwapChar SwapChar (list[i], list[j]); Permutations (list, i+1, n); n); Permutations (list, i+1, SwapChar (list[i], list[j]); Permutations (list, i+1, n); SwapChar (list[j], (list[j], list[i]); list[i]); SwapChar Permutations (list, list[i]); i+1, n); } SwapChar (list[j], } } SwapChar (list[j], list[i]); } } } } } Algoritmo 4.9 - Permutações de um conjunto de carateres
Algoritmo Algoritmo 4.9 4.9 -- Permutações Permutações de de um um conjunto conjunto de de carateres carateres ALGORITMO 4.9 – PERMUTAÇÕES DE UM CONJUNTO DE CARATERES
A Figura Figura 4.3 4.3 apresenta apresenta aa árvore árvore de recorrência recorrência da geração geração das permutações permutações de de “abc”. “abc”. A A A A Figura 4.3 apresenta a árvore de de recorrência da da geraçãodas das permutações de “abc”. primeira invocação recursiva desencadeia três novas invocações recursivas, cada uma primeira A primeirainvocação invocaçãorecursiva recursivadesencadeia desencadeiatrês trêsnovas novasinvocações invocações recursivas, recursivas, cada cada uma uma delas desencadeia desencadeia duas duas novas novas invocações invocações recursivas, recursivas, até até que que se se atinge atinge um um caráter caráter apenas apenas delas delas desencadeia duas novas invocações recursivas, até que se atinge um caráter apenas para permutar, que que termina aa recursividade. recursividade. para para permutar, permutar, que termina termina a recursividade. Perm ("abc",0) Perm Perm ("abc",0) ("abc",0)
Perm ("abc",1) Perm Perm ("abc",1) ("abc",1)
Perm ("abc",2) Perm Perm ("abc",2) ("abc",2)
Perm ("cba",1) Perm Perm ("cba",1) ("cba",1)
Perm ("bac",1) Perm Perm ("bac",1) ("bac",1)
Perm ("acb",2) Perm Perm ("acb",2) ("acb",2)
Perm ("bac",2) Perm Perm ("bac",2) ("bac",2)
Perm ("bca",2) Perm Perm ("bca",2) ("bca",2)
Perm ("cba",2) Perm Perm ("cba",2) ("cba",2)
Perm ("cab",2) Perm Perm ("cab",2) ("cab",2)
Figura 4.3 4.3 -- Árvore Árvore de de recorrência recorrência das das permutações permutações de de "abc" "abc" Figura Figura - ÁrvoreDE deRECORRÊNCIA recorrência das deDE "abc" FIGURA 4.34.3 – ÁRVORE DASpermutações PERMUTAÇÕES “ABC”
Vamos pelo Vamos fazer fazer aaa análise análise da dacomplexidade complexidadedo donúmero númerode detrocas trocasde decarateres carateres efetuadas efetuadas pelo pelo Vamos fazer análise da complexidade do número de trocas de carateres efetuadas algoritmo. Quando existem N carateres, temos um ciclo repetitivo que faz duas trocas algoritmo. Quando Quando existem existem N N carateres, carateres, temos temos um um ciclo ciclo repetitivo repetitivo que que faz faz duas duas trocas trocas eee algoritmo. uma invocação recursiva com N−1 carateres, pelo que temos 2N trocas e N invocações uma invocação invocação recursiva recursiva com com N−1 N−1 carateres, carateres, pelo pelo que que temos temos 2N 2N trocas trocas ee N N invocações invocações uma recursivas com N−1 carateres. Quando só existe um caráter para permutar, não é efetuada recursivas com N−1 carateres. Quando só existe um caráter para permutar, não efetuada recursivas com N−1 carateres. Quando só existe um caráter para permutar, não éé efetuada qualquer troca. Assim, temos temos aa seguinte seguinteexpressão expressãorecorrente: recorrente: qualquer troca. Assim, qualquer troca. Assim, temos a seguinte expressão recorrente: 0 , E(N) 00 ,, E(N) E(N) N E(N 1) 2N , N E(N E(N 1) 1) 2N 2N ,, N
se N N1 se se N 11 se N N 1 se se N 11
expressão recorrente, temos: Resolvendo aa expressão expressãorecorrente, recorrente,temos: temos: Resolvendo
E(N) N E(N 1) 2N N N 1 E(N 2) 2N 1 2N E(N) E(N) N N E(N E(N 1) 1) 2N 2N N N N N 11 E(N E(N 2) 2) 22N N 11 2N 2N N N 1 E(N 2) 2N N 1 2N N 1 E(N 2) 2N N 1 2N N N N 1 E(N 2) 2N N 1 2N N N N 1 N 2 E(N 3) 2N N 1 N 2 2N N 1 2N ... N 11 N N 22 E(N E(N 3) 3) 2N 2N N N 11 N N 22 2N 2N N N 11 2N 2N .. .. .. N N N N 1 ... N i 1 E(N i ) 2 N N 1 ... N i 1 ... N N 1 N N N N N 11 ... ... N N ii 11 E(N E(N ii )) 22 N N N N 11 ... ... N N ii 11 ... ... N N N N 11 N N
FCA - Editora de Informática FCA FCA -- Editora Editora de de Informática Informática
130 130 130
132
© FCA – EDITORA DE INFORMÁTICA
RECURSIVIDADE E PROGRAMAÇÃO DINÂMICA
4
INÂÂM MIC ICAA PRROOGGRRAAMMAAÇÇÃÃOOD DIN IVID IDAADDEEEEP RREECCUURRSSIV
RECURSIVIDADE E PROGRAMAÇÃO DINÂMICA
Para Para atingirmos atingirmosooovalor valorde deparagem paragemE(1), E(1),que queéééigual igualaaa0,0,0,temos temosque queN−i N−i===1, ouseja, seja, Para atingirmos valor de paragem E(1), que igual temos que N−i 1,1,ou ou seja, assim seguinte expressãofinal: final: N−1,obtendo obtendoassim assimaaaseguinte seguinteexpressão expressão final: ii i= ==N−1, N−1, obtendo Para atingirmos o valor de paragem E(1), que é igual a 0, temos que N−i = 1, ou seja, i = N−1, obtendoE(N) assim NNNN11expressão ......22......final: N11NN E(N) NNN 22aseguinte NN1111 11 N E(N) N1 N1111 N1 222N! ... 2 ... 11 N22N! N! ... N! ... (N2)! 2)! (N (N1)! 1)! (N Ni i111 i i! ! 22 1 1 1 1 2 N! 1 ... 2 N! 2 (N 2)! (N 1)! i ! de pode 1calculado i calculado Considerando número Napier ser calculado recorrendo Considerandoque queooonúmero númerode deNapier Napier(e 2.7182818284) podeser ser recorrendo Considerando que (e(e= ==2.7182818284) 2.7182818284) pode recorrendo
paraxxx===1, 1,então entãotemos: temos: expansãoem emsérie sériede deTaylor Taylor dafunção funçãoeeexxx,,,para expansão em Taylor da da função para 1, então temos: àààexpansão Considerando que o número de Napier (e = 2.7182818284) pode ser calculado recorrendo x n 1 temos: à expansão em série dexTaylor da x22 1 xxn função e , para x = 1, 1então 11 1 xx
eex 11xx
ee 1111 ... ... ... ... ... ... ...11 ... 2! n! 2! i! 2! n! 2! i i! ! i11 i ! 2 n i x x 1 1 1 ... ... e 1 1 ... ... 1 e x 1 x 2! n! i ! 3.44 N!i 1 i ! Então, para grandes valores de N, temos queE(N) Então,para paragrandes grandesvalores valores deN, N,temos temosque que E(N)22e2! e11N!N! Então, de 3.44 N!
Ou seja, estamos um algoritmo de complexidade O(N!). Então, para grandesperante valores N, algoritmo temos que E(N) 2 e 1fatorial N! fatorial 3.44 N!Qualquer algoritOu seja, seja, estamos perante de um de complexidade O(N!). Qualquer Qualquer Ou estamos um algoritmo mo fatorial é muito perante mau. Mas, se tivermos de emcomplexidade atenção que ofatorial númeroO(N!). de permutações algoritmo fatorial fatorial éé muito muito mau. mau. Mas, Mas, se se tivermos tivermos em em atenção atenção que que oo número número de de algoritmo geradas é fatorial, então concluímos que o algoritmo faz aproximadamente três Ou seja,também estamos perante um algoritmo complexidade fatorial Qualquer permutações geradas também fatorial,deentão então concluímos que oO(N!). o algoritmo algoritmo faz permutações geradas também éé fatorial, concluímos que faz trocas de elementos cada mau. permutação gerada. algoritmo fatorial três é por muito Mas, se em atenção que o número de aproximadamente trocas de elementos portivermos cadapermutação permutação gerada. aproximadamente três trocas de elementos por cada gerada. permutações geradas também é fatorial, então concluímos que o algoritmo faz aproximadamente três trocas de elementos por cada permutação gerada.
4.6Teorema Teoremamestre mestre 4.6 Existe uma uma maneira maneira de de determinar determinar se se aa complexidade complexidade4.6 de um um algoritmo –– que que aplica aplica aa Existe de algoritmo Teorema mestre
4.6 TEOREMA MESTRE
estratégia de decrementar para conquistar conquistar com decremento decremento constante –– que linear ou estratégia decrementar para com éé linear Existe umade maneira de determinar se a complexidade de um constante algoritmo aplicaou a Existe uma maneira de determinar sesuaa expressão complexidade de um Dada algoritmo – queexpressão aplica a exponencial, analisando a forma da recorrente. a seguinte exponencial, analisando a forma da sua expressão recorrente. Dada a seguinte expressão estratégia de decrementar para conquistar com decremento constante – é linear ou exestratégia decrementar para conquistar com decremento constante – é linear ou recorrente:de recorrente: ponencial, analisando a forma dada sua exponencial, analisando a forma suaexpressão expressãorecorrente. recorrente.Dada Dadaaaseguinte seguinte expressão expressão recorrente: , se n 1 b , se n 1 b recorrente: T(N) T(N)
T(N) T(Ncc))dd , , se senn11 aT(N a se n 1 b, T(N) ondea,a,b,b,cceeddsão sãoconstantes constantesinteiras inteiras positivas nulas com seguintesignificado: significado:aaéé T(N c ) não , nulas se n com 1 ooseguinte dnão onde a positivas
número de de invocações invocações recursivas recursivas executadas, executadas, bb éé aa complexidade complexidade do do caso caso base, base, cc éé oo oo número onde a, eeelementos ddsão inteiras não nulas com significado: é a, b, b, sãoconstantes constantes inteiraspositivas não comoeeoseguinte significado:ada a número deccelementos que decrescem decrescem dimensão denulas entrada complexidade da número de que ààpositivas dimensão de entrada ddseguinte éé aa complexidade oésolução número de invocações recursivas executadas, b é a complexidade do caso base, c é o o número de invocações recursivas executadas, b éééaaacomplexidade base, cnão é solução combinada, que para para um algoritmo algoritmo recursivo complexidadedo dacaso sua parte parte não combinada, que um recursivo complexidade da sua número dedeelementos que decrescem à àdimensão dedeentrada e eddééaa complexidade da o número elementos que decrescem dimensão entrada complexidade da recursiva. recursiva. solução recursivo éé aa complexidade complexidade da da sua sua parte parte não solução combinada, combinada, que que para para um um algoritmo algoritmo recursivo não recursiva. Resolvendo a expressão recorrente, temos: recursiva. a expressão recorrente, temos: Resolvendo Resolvendo aa expressão expressãoT(N) recorrente, temos: Resolvendo recorrente, temos: T(N) T(N aaT(N cc))dd
T(N22cc))dd dd aaaaT(N T(N) a 2 T(N c ) d 2 T(N22cc))aadd dd aaa aT(N T(N 2c ) d d 3 3 aa2 T(N T(N33cc))aa22dd aadd dd ... ... a T(N 2c ) a d d KK11
T(N) a K T(N Kc ) d a i
3 ad2dd aaai i d d ... T(N)aaaKKT(N T(N3KcKc)c)) T(N) T(N
Ki i010
FCA- -Editora Editorade deInformática Informática FCA FCA - Editora de Informática
i 0
131 131 © FCA – EDITORA DE INFORMÁTICA
131 133
ALGORITMOS NUMÉRICOS
5
Considerando que o número de Napier (e = 2.7182818284) pode ser calculado recorrendo ARLIG TM UIM ALGO NOUSMN TO MR OIS ÉR CÉ OR SICOS x à expansão em série de Taylor da função e , para x = 1, então temos: e
x
2
x2 2!
n
xn n!
x x x e1 x 1 x ... ... ... ...
2!
n!
1 1 1 1 1 1 e 1e1 1 1 ... ...... 1... 1 2! 2! i ! i ! i i!1 i !
i 1
Então, para grandes valores de N, temos N! 3.44 N! Ou seja, Então, parapara grandes valores dedeN, que E(N) E(N) 2 e21e N!13.44 N!..Ou Ou.seja, seja,estagrandes valores N,temos temos queque estamos perante um algoritmo de complexidade fatorial O(N!). mos perante umalgoritmo algoritmo decomplexidade complexidade fatorial O(N!). estamos perante um de fatorial O(N!). Outro método de dodo determinante de de umauma matriz quadrada é o método de elimiOutro método decálculo cálculo determinante matriz quadrada o método Outro método de cálculo do determinante de uma matriz quadrada é o émétodo de de nação de Gauss. Este método consiste em fazer operações de subtração de colunas eliminação de Gauss. Este método consiste em fazer operações de subtração de colunas eliminação de Gauss. Este método consiste em fazer operações de subtração de colunas da matriz, queque nãonão afetam valor doseu seu determinante, maneira colocar zero todos os da matriz, afetam o valor do determinante, seu determinante, de maneira a colocar a zero todos da matriz, que não afetam oovalor do dedemaneira a acolocar aazero todos elementos abaixo ou acima da diagonal. Ou seja, aplica a estratégia de transformar para os elementos abaixo ou acima da diagonal. Ou seja, aplica a estratégia de transformar os elementos abaixo ou acima da diagonal. Ou seja, aplica a estratégia de transformar eeconverte a amatriz numa matriz triangular inferior ou superior. Nesse caso, o para conquistar e converte a matriz numa matriz triangular inferior ou superior. Nesse paraconquistar conquistar converte matriz numa matriz triangular inferior ou superior. Nesse do determinante é igual ao produto dosdos elementos dada diagonal da da matriz. caso, o valor do determinante é igual ao produto dos elementos da diagonal da matriz. caso,valor o valor do determinante é igual ao produto elementos diagonal matriz. Vamos mostrar o exemplo de cálculo do determinante da mesma matriz de 4×4, mos-
Vamos mostrar o exemplo de cálculo do determinante da mesma matriz de 4×4, Vamos mostrar o exemplo de cálculo do determinante da mesma matriz de 4×4, trando as sucessivas matrizes equivalentes parapara efeito do cálculo do determinante, que mostrando as sucessivas matrizes equivalentes efeito do cálculo do determinante, mostrando as sucessivas matrizes equivalentes para efeito do cálculo do determinante, vão sendo obtidas após cada invocação recursiva. Os valores acima da diagonal não são sendo obtidas invocação recursiva. Os valores acima da diagonal que que vão vão sendo obtidas apósapós cadacada invocação recursiva. Os valores acima da diagonal não não porque, comocomo para opara do determinante, não sãonão sequer são mostrados porque, são irrelevantes o cálculo do determinante, são são mostrados mostrados porque, como são são irrelevantes irrelevantes para ocálculo cálculo do determinante, não são processados pelo algoritmo: sequer processados algoritmo: sequer processados pelopelo algoritmo: 3.0 2.0 4.0 5.0 2.0 5.03.0 3.0 8.5 8.5 5.5 5.5 - . - - . - 2.5 2.5 2.5 2.5 - . - -- .. -- - . - 5.0 3.0 4.0 1.0 - . - 4.0 2.0 2.0 4.0 0.5 0.5 4.5 1.5 4.5 1.5 - . - -- .. -- - . - 0.0 4.0 2.0 2.0 1.0 4.0 0.5 0.5 - . - 1.0 2.0 3.0 2.0 2.0 2.0 1.0 1.0 1.0 3.0 2.0 2.0 1.0 1.0 - . - - . - 0.0 0.0 0.0 0.0 1.0 1.0 - . - - . -0.0 0.0 3.0 5.0 2.0 3.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.00.0 0.0 5.0
5.0 - . - - -. .- - - -. .- - - . - 0.0 - . - - -. .- - - . - 1.5 1.5 0.0 0.0 0.0 1.0 1.0 - . - - . - 0.0 0.0 0.0 0.0 0.0 2.0 2.0
Quando ooprocesso recursivo termina, éé calculado nono regresso dasdas sucesQuando processo recursivo termina, o determinante é calculado no regresso das Quando o processo recursivo termina, oo determinante determinante calculado regresso sucessivas invocações da função e é igual ao produto dos elementos da diagonal. Logo, o sivas invocações da eeééigual aoaoproduto dos da Logo, oovalor sucessivas invocações dafunção função igual produto doselementos elementos dadiagonal. diagonal. Logo, valor do determinante é 5.0 × −1.5 × −1.0 × 2.0, ou seja, é igual a 15. Para obter este do determinante é 5.0 × −1.5 × −1.0 × 2.0, ou seja, é igual a 15. Para obter este resultado valor do determinante é 5.0 × −1.5 × −1.0 × 2.0, ou seja, é igual a 15. Para obter este resultado foram feitas 23edivisões e multiplicações 14 subtrações. foram feitas 23 divisões multiplicações e 14 subtrações. resultado foram feitas 23 divisões e multiplicações e 14esubtrações. O Algoritmo 5.10 apresenta este método de cálculo, que transforma a matriz numa matriz
O Algoritmo apresenta método de cálculo, transforma a matriz numa matriz O Algoritmo 5.105.10 apresenta este este método de cálculo, que que transforma a matriz numa matriz triangular superior. Quando o elemento da última coluna da última linha da matriz é nulo, triangular superior. Quando o elemento da última coluna da última da matriz é nulo,a triangular superior. Quando o elemento da última coluna da última linhalinha da matriz é nulo, coluna tem de ser trocada com outra coluna, cujo último elemento não seja nulo, de forma a coluna de trocada ser trocada coluna, último elemento de a coluna tem tem de ser comcom outraoutra coluna, cujocujo último elemento não não seja seja nulo,nulo, de aforma colocar um um valor nulonão na diagonal. Caso Caso nãoCaso haja colunacoluna nessa situação, a colocar umnão valor nulo na diagonal. não nenhuma coluna nessa forma a colocar valor não nulo na diagonal. não nenhuma haja haja nenhuma nessa então é sinal os elementos da última linha são nulos, o determinansituação, então éque sinal de que todos os elementos da última linha são que nulos, pelo situação, então é de sinal detodos que todos os elementos da última linha sãopelo nulos, pelo que que o o determinante também o é. É preciso ter em atenção que sempre que se trocam te também o é. É preciso ter em atenção que sempre que se trocam duas colunas de uma determinante também o é. É preciso ter em atenção que sempre que se trocam duasduas colunas de uma matriz o determinante tem de ser multiplicado por −1. matriz determinante tem de ser multiplicado por −1. colunas de ouma matriz o determinante tem de ser multiplicado por −1. Ao dividir-se a última coluna pelo último elemento, põe-se em evidência esse elemento e,
Ao dividir-se a última coluna último elemento, põe-se em evidência elemento Ao dividir-se a última coluna pelopelo último elemento, põe-se em evidência esse esse elemento e, e, depois, para anular anular aa última da basta subtrair todas as menos última depois, última linha damatriz matriz basta subtrair todas as colunas colunas menos aa última depois, parapara anular a última linhalinha da matriz basta subtrair todas as colunas menos a última última coluna multiplicada último elemento da aa processar. pela última coluna multiplicada pelo último elemento da coluna coluna processar. Uma vez que que pelapela última coluna multiplicada pelopelo último elemento da coluna a processar. UmaUma vez vez que depois deste processamento a última linha da matriz é constituída apenas por zeros, com depois deste processamento a última linha da matriz é constituída apenas por zeros, com depois deste processamento a última linha da matriz é constituída apenas por zeros, com exceção do último último elemento da linha, linha, ou oo elemento está na diagonal, diagonal, agora exceção do elemento da ou seja, seja, elemento que na agora exceção do último elemento da linha, ou seja, o elemento que que está está na diagonal, agora o oo determinante desta matriz é igual a este valor multiplicado pelo determinante da matriz de determinante desta matriz é igual este valor multiplicado pelo determinante determinante desta matriz é igual a este valor multiplicado pelo determinante da matriz de de ordem ordem N−1.N−1. 165 163 163
© FCA – EDITORA DE INFORMÁTICA
- Editora de Informática FCA- FCA Editora de Informática
ANÁLISE DA COMPLEXIDADE DE ALGORITMOS
double Gauss (double matrix[][], int n) { if (n == 1) return matrix[0][0]; else { last = n-1; aux = last; while (aux >= 0 && matrix[last][aux] == 0) aux--; if (aux >= 0) { if (aux != last) for (line = 0; line < n; line++) { element = matrix[line][last]; matrix[line][last] = matrix[line][aux]; matrix[line][aux] = -element; } for (line = 0; line < last; line++) matrix[line][last] /= matrix[last][last]; for (col = 0; col < last; col++) for (line = 0; line < last; line++) matrix[line][col] -= matrix[line][last] * matrix[last][col]; return matrix[last][last] * Gauss (matrix, n-1); } else return 0.0; } } ALGORITMO 5.10 – CÁLCULO DO DETERMINANTE DE UMA MATRIZ PELO MÉTODO DE GAUSS
O processo é invocado recursivamente até N ser igual a 1. Nessa altura, o determinante é o próprio valor. Em alternativa, pode-se parar o processo recursivo quando N é igual a 2, uma vez que é fácil calcular o determinante dessa matriz. Quando o algoritmo recursivo atinge a matriz de um só elemento, a matriz original foi completamente transformada numa matriz triangular superior, sendo o determinante da matriz igual ao produto dos elementos da diagonal da matriz. Vamos fazer a análise formal deste algoritmo. Vamos começar por considerar que não há necessidade de trocar colunas devido à existência de um elemento nulo na última coluna. Para uma matriz de dimensão N, o algoritmo executa um primeiro ciclo repetitivo que divide todos os N−1 elementos da última coluna, ou seja, faz N−1 divisões. Depois, para anular a última linha da matriz, executa dois ciclos repetitivos que fazem (N−1)×(N−1) subtrações e multiplicações. De seguida, faz uma invocação recursiva para a submatriz sem a última linha e a última coluna, após o que faz uma multiplicação final. Ou seja, no melhor caso o algoritmo faz (N−1)2+(N−1)+1 operações multiplicativas, (N−1)2 operações aditivas e uma invocação recursiva para uma matriz com dimensão N−1.
166
© FCA – EDITORA DE INFORMÁTICA
ALGORITMOSAANUMÉRICOS 5 L LG GO OR RIIT TM MO OS SN UM MÉ ÉR RIIC CO OS S NU ALGORITMOS NUMÉRICOS
caso ooo último últimoelemento elementoda daúltima últimacoluna coluna seja nulo, então algoritmo faz mais mais N Mas, seja nulo, então o algoritmo faz mais N subMas, caso caso último elemento da última coluna seja nulo, então oo algoritmo faz N 2 2faz (N−1)2 +(N−1)+1 subtrações no ciclo de troca, ou seja, no pior caso o algoritmo +(N−1)+1 trações no ciclo de troca, ou seja, piorno caso o algoritmo faz (N−1) faz subtrações no ciclo de troca, ou no seja, pior caso o algoritmo (N−1) operações +(N−1)+1 operações aditivas asoperações mesmas operações operações multiplicativas do melhor melhor caso. Logo, no que que operações aditivas ee as mesmas multiplicativas do Logo, no aditivas e as mesmas multiplicativas do melhor caso. Logo, caso. no que diz respeito diz respeito aamultiplicativas, operações multiplicativas, multiplicativas, estamos perante um caso caso sistemático. sistemático. E,respeito no que que respeito operações estamos perante um no adiz operações estamos perante um caso sistemático. E, no que dizE, diz respeito aa operações aditivas, temos um melhor caso ee um pior caso. diz respeito operações aditivas, temos um melhor caso um pior caso. a operações aditivas, temos um melhor caso e um pior caso. Assim, ooo caso das operações caso sistemático sistemático das operações multiplicativas multiplicativas dado pela pela seguinte seguinte expressão expressão Assim, multiplicativas ééé dado Assim, caso sistemático das operações dado pela seguinte expressão recorrente: recorrente: recorrente: 0 ,, 0 E(N) E(N) E(N 1) N 122 N 1 1, 1) N 1 N 1 1, E(N
se n n 1 1 se se n n 1 1 se
Resolvendo aaa expressão expressão recorrente, temos: Resolvendo expressãorecorrente, recorrente,temos: temos: Resolvendo E(N) E(N E(N 1) 1) N N 1 122 N N 1 1 1 1 E(N E(N 2) 2) N N 2 222 N N 2 2 1 1 N N 1 122 N N 1 1 1 1 E(N) 2 2 2 2 ... ... E(N E(N ii )) N N ii ... ... N N 1 1 N N ii ... ... N N 1 1 ii E(N E(N ii ))
ii
ii
j 1
j 1
NN jj 22 NN jj ii j 1 j 1
atingirmos ooo valor 1, ou ou seja, seja, valor de de paragem paragem E(1), E(1),que que ééé igual igualaaa0,0, 0,temos temos que que N−i N−i == = 1, Para Para atingirmos atingirmos valor de paragem E(1), que igual temos que N−i 1, ou seja, iii = = N−1. Obtemos assim a seguinte expressão final: assim aaseguinte seguinteexpressão expressãofinal: final: = N−1. N−1. Obtemos Obtemos assim E(N) E(N)
N 1 1 N
N 1 1 N
N 1 1 N
N 1 1 N
N N
N N
j 1
j 1
j 1
j 1
j 1
j 1
NN jj 22 NN jj NN 11 jj 22 jj NN 11 jj 22 NN22 jj NN NN 11 j 1 j 1 j 1 j 1 j 1 j 1
2N33 3N22 N N22 N 2N33 3N22 N 6N22 3N22 3N N33 2N 2N 3N N N N22 N N 1 1 2N 3N N 6N 3N 3N 1 1 N 2N 1 1 6 2 6 3 6 2 6 3 33
O caso caso sistemático sistemático das operações multiplicativas tem complexidade cúbica O(N ).). O sistemáticodas dasoperações operaçõesmultiplicativas multiplicativastem temcomplexidade complexidadecúbica cúbicaO(N O(N33). O caso O das operações operaçõesaditivas aditivaséédado dadopela pelaseguinte seguinteexpressão expressão recorrente: O melhor melhor caso caso das recorrente:
O melhor caso das operações aditivas é dado pela seguinte expressão recorrente: 0 ,, 0 B(N) B(N) B(N 1) N 122 , B(N 1) N 1 ,
se n n 1 1 se se n n 1 1 se
Resolvendo expressãorecorrente, recorrente,temos: temos: Resolvendo aaa expressão expressão recorrente, temos: Resolvendo
Resolvendo a expressão recorrente, temos:
B(N) B(N B(N 1) 1) N N 1 12 B(N B(N 2) 2) N N 2 22 N N 1 12 ... ... B(N) 2
2
B(N B(N ii )) N N ii 2 ... ... N N 1 12 B(N B(N ii )) 2
2
2
ii
NN jj 22 jj 1 1
j 1
Para oo valor de paragem B(1), que Para atingirmos atingirmos valor de paragem B(1), que éé igual igualaa0,0,temos temos que que N−i N−i == 1, 1, ou ou seja, seja, Para ISE DA COMPoLEvalor XIDADde E Dparagem E ALGORITB(1), MOS que é igual a 0, temos que N−i = 1, ou seja, ANÁLatingirmos iii = assim aaa seguinte seguinteexpressão expressãofinal: final: = N−1. Obtemos = N−1. N−1. Obtemos Obtemos assim assim seguinte expressão final: B(N)
N 1
N 1
N
j 1
j 1
N j 2 j 2 j 2 N2
FCA FCA -- Editora Editora de de Informática Informática j 1
2N3 3N2 N 2N3 3N2 N N2 6 6
3 O melhor caso das operações aditivas também tem complexidade cúbica O(N ). © FCA – EDITORA DE INFORMÁTICA
165 165
167
O pior caso das operações aditivas é idêntico ao caso sistemático das operações multiplicativas:
A NÁ ÁL LIIS SE ED DA AC OM MP PL LE EX XIID DA AD DE ED DE EA LG GO OR RIIT TM MO OS S AN CO AL AN NÁ ÁL LIIS SE ED DA A CO OM MP PL LE EX XIID DA AD DE ED DE E AL LG GO OR RIIT TM MO OS S N 1 1 N
N 1 1 N
N N
3 2 3 2 2N 2N3 3N2 N N22 2N 2N3 3N2 N 3N N 3N N N 6 6 3 6 2 3 6 2 2N 3N N 2N 3N N N2 N2 6 6 33
2 B(N) B(N) ALGORITMOS ANÁLISE DA COMPLEXIDADE NN j 2 jDE j 2 NN2
B(N)
2
Njj 1 11
2
Njj 1 11
jj N 1 1
2
N j 2 j 2 j 2
2
j 1 j 1 j 1 O melhor caso caso das 3 O melhor das operações operaçõesaditivas aditivastambém tambémtem temcomplexidade complexidadecúbica cúbicaO(N O(N). ).
3 O pior melhor caso das operações aditivas também tem complexidade cúbica O(N O dasdas operações aditivas é idêntico ao caso das operações multipliO piorcaso caso operações aditivas é idêntico aosistemático caso sistemático das). operações cativas: multiplicativas: O pior caso das operações aditivas é idêntico ao caso sistemático das operações multiplicativas: se 0 0 ,, se n n 1 1
W(N) W(N) 2 W(N 1) N 12 N 1 1, W(N , 1) N 1 N 1 1, 0 W(N) W(N 1) N 12 N 1 1,
cujo resultado seguinte expressão: final éé dado expressão: resultado final dado pela pela seguinte
se 1 se n n se n 11 se n 1
3 expressão:3 cujo resultado final é dado pela seguinte N 2N N3 2N 2N 4N 6 2N3 4N 6
W(N) W(N)
1 1 3 6 3 6 N3 2N 2N3 4N 6 W(N) 1 3 tem 6 O pior operaçõesaditivas aditivas também também temcomplexidade complexidade cúbicaO(N O(N333).). O pior caso caso das das operações cúbica 3 Portanto, estamos perante um algoritmo com complexidade cúbica cúbica O(N de operações, que O pior caso das operações tambémcom temcomplexidade complexidade ). Portanto, estamos perante aditivas um algoritmo cúbica de operações, que é é muito mais eficiente do que o algoritmo de Laplace. Tem ainda a vantagem de fazer muito mais eficiente do que o algoritmo de Laplace. Tem ainda a vantagem de fazer muito menos invocações sendo por isso também mais eficiente. Nalgumas Portanto, estamos peranterecursivas, um algoritmo com complexidade cúbica de operações, quelin-é muito menos invocações recursivas, sendo por isso também mais eficiente. Nalgumas muito mais eficiente do que o algoritmo de Laplace. Tem ainda a vantagem de fazer guagens dede programação pode linguagens programação podeser serimplementado implementadosem semnecessidade necessidade de de criar criar submatrizes submatrizes muito menos invocações recursivas, sendo por também mais utilizando assim menos No tem aa desvantagem deeficiente. corromperNalgumas matriz, utilizando assim menos memória. memória. No entanto, entanto, temisso desvantagem de corromper aa matriz, linguagens de programação pode ser implementado sem necessidade de criar submatrizes pelo que esta deve ser previamente copiada. pelo que esta deve ser previamente copiada. utilizando assim menos memória. No entanto, tem a desvantagem de corromper a matriz, pelo que esta deve ser previamente copiada.
5.7 Multiplicação de matrizes A ematrizes B com duas multiplicar duas matrizes quadradasde 5.7 Multiplicação
5.7 MULTIPLICAÇÃO DE MATRIZES Consideremos que se pretende multiplicar duas matrizes
Consideremos que se pretende linhas e duas colunas. Consideremos duas matrizes quadradas AeB Consideremos que que se sepretende pretendemultiplicar multiplicar duas matrizes quadradas A com e Bduas comlinhas duas e duasecolunas. linhas duas colunas. a00 a01 b00 b01 c 00 c 01 01 00 01 01 00 00 a11 b11 c 11 a10 b10 c 10 10 11 10 11 10 a00 a01 b00 b01 c 00 c 11 01 a a b b c c 11 11 pelas 11 10 10dados 10seguintes produto C são
Os coeficientes da matriz expressões, que exigem fazer oito multiplicações e quatro adições. Os Os coeficientes coeficientes da da matriz matriz produto produto CCsão sãodados dadospelas pelasseguintes seguintes expressões, expressões, que que exigem exigem fazer c 00 ae00quatro adições. a01 b10 c 01 a00 a01 fazer oito oito multiplicações multiplicações quatro b00 b01 b11 00 e00 00 adições. 01 10 01 00 01 01 11
c 10 b00 b10 c 11 b01 b11 a10 a11 a10 a11 10 00 11 10 10 01 11 11 c 10 c 11 00 a 00 b00 a 01 b10 01 a 00 b01 a 01 b11 c 10 que a10 o bproduto b10duas cmatrizes b01 aN×N 00 a11 de 11 a10 com 11 b11 Generalizando, temos elementos custa oito
multiplicações e quatro adições de matrizes com N/2×N/2 elementos. Generalizando, temos temos que produto de de duas duas matrizes com N×N N×N elementos elementos custa Generalizando, que oo produto matrizes com custa oito multiplicações e quatro adições de matrizes com N/2×N/2 elementos. multiplicações e apresenta o método de matrizes com N/2×N/2 elementos. O Algoritmo 5.11 tradicional de multiplicação de matrizes. O tradicional de multiplicação de O Algoritmo Algoritmo5.11 5.11apresenta apresenta oo método método tradicional de multiplicação de matrizes. matrizes.
O Algoritmo 5.11 apresenta o método tradicional de multiplicação de matrizes.
166 166
FCA FCA -- Editora Editora de de Informática Informática
166
FCA - Editora de Informática
168
© FCA – EDITORA DE INFORMÁTICA