1 FEUP/LEEC Algoritmos e Estruturas de Dados 2001/2002 ANÁLISE DE COMPLEXIDADE DE ALGORITMOS João Pascoal Faria http://www.fe.up.pt/~jpf 2 Itrodução Algoritmo: cojuto claramete especificado de istruções a seguir para resolver um problema Aálise de algoritmos: provar que um algoritmo está correcto determiar recursos exigidos por um algoritmo (tempo, espaço, etc.) comparar os recursos exigidos por diferetes algoritmos que resolvem o mesmo problema (um algoritmo mais eficiete exige meos recursos para resolver o mesmo problema) prever o crescimeto dos recursos exigidos por um algoritmo à medida que o tamaho dos dados de etrada cresce 1
3 Complexidade espacial e temporal Complexidade espacial de um programa ou algoritmo: espaço de memória que ecessita para executar até ao fim S() - espaço de memória exigido em fução do tamaho () da etrada Complexidade temporal de um programa ou algoritmo: tempo que demora a executar (tempo de execução) T() - tempo de execução em fução do tamaho () da etrada Complexidade versus Eficiêcia Por vezes estima-se a complexidade para o "melhor caso" (pouco útil), o "pior caso" (mais útil) e o "caso médio" (igualmete útil) 4 Notação de O grade Na prática, é difícil (seão impossível) prever com rigor o tempo de execução de um algoritmo ou programa Para obter o tempo a meos de: costates multiplicativas (ormalmete estas costates são tempos de execução de operações atómicas) parcelas meos sigificativas para valores grades de Idetificam-se as operações domiates (mais frequetes ou muito mais demoradas) e determia-se o úmero de vezes que são executadas (e ão o tempo de cada execução, que seria uma costate multiplicativa) Exprime-se o resultado com a otação de O grade 2
5 Notação de O grade Defiição: T() = O(f()) (ler: T() é de ordem f()) se e só se existem costates positivas c e 0 tal que T() cf() para todo o > 0 Exemplos: c k k +c k-1 k-1 +...+c 0 = O( k ) (c i - costates) log 2 = O(log ) (ão se idica a base porque mudar de base é multiplicar por costate) 4 = O(1) (usa-se 1 para ordem costate) 6 f Ordes mais comus (expoecial) 2 2 (quadrática) log (liear) log (logarítmica) 1 (costate) Fote: Sahi, "Data Structures, Algorithms ad Applicatios i C++" 3
7 Eficiêcia da Pesquisa Sequecial Eficiêcia temporal de SequetialSearch A operação realizada mais vezes é o teste da codição de cotiuação do ciclo for, o máximo +1 vezes (o caso de ão ecotrar x). Se x existir o array, o teste é realizado aproximadamete /2 vezes em média (1 vez o melhor caso) T() = O() (liear) o pior caso e o caso médio Eficiêcia espacial de SequetialSearch Gasta o espaço das variáveis locais (icluido argumetos) Como os arrays são passados "por referêcia" (de facto o que é passado é o edereço do array), o espaço gasto pelas variáveis locais é costate e idepedete do tamaho do array S() = O(1) (costate) em qualquer caso 8 Eficiêcia Temporal da Pesquisa Biária Em cada iteração, o tamaho do sub-array a aalisar é dividido por um factor de aproximadamete 2 Ao fim de k iterações, o tamaho do sub-array a aalisar é aproximadamete / 2 k Se ão existir o array o valor procurado, o ciclo só termia quado / 2 k 1 log 2 - k 0 k log 2 Assim, o pior caso, o º de iterações é aproximadamete log 2 T() = O(log ) (logarítmico) É muito mais eficiete que a pesquisa sequecial, mas só é aplicável a arrays ordeados! 4
9 Eficiêcia da Ordeação por Iserção IsertSorted(v,,x): o º de iterações do ciclo for é: 1, o melhor caso, o pior caso /2, em média IsertioSort(v,): faz IsertSorted(,1,), IsertSorted(,2,),..., IsertSorted(,-1,) o º total de iterações do ciclo for de IsertSorted é: o melhor caso, 1 + 1 +... + 1 (-1 vezes) = -1 o pior caso, 1 + 2 +... + -1 = (-1)(1 + -1)/2 = (-1)/2 2 /2 em média, metade do aterior, isto é, aproximadamete 2 /4 T() = O( 2 ) (quadrático) (pior caso e média) 10 Eficiêcia da Ordeação por Partição As operações realizadas mais vezes o passo de partição são as comparações efectuadas os passos 2.3.1 e 2.3.2. No cojuto dos dois passos, o úmero de comparações efectuadas é: o míimo (porque todas as posições do array são aalisadas) o máximo +2 (correspodete à situação em que i=j+1 o fim do passo 2.3.2) Por coseguite, o tempo de execução do passo de partição é O() Para obter o tempo de execução do algoritmo completo, é ecessário somar os tempos de execução do passo de partição, para o array iicial e para todos os sub-arrays aos quais o algoritmo é aplicado recursivamete 5
11 Eficiêcia da Ordeação por Partição (cot.) Pior caso: cada rectâgulo refere-se a uma chamada recursiva Melhor caso: -1 1 /2 /2-2 -3 1... 1 1+log 2 /4 /4 /4 /4... 1 1 1 1 1 1 1 1 1 1 profudidade de recursão: tempo de execução total (somado totais de lihas): T() = O[++(-1) +... +2] = O[+(-1)( + 2)/2] = O( 2 ) profudidade de recursão: 1+log 2 (sem cotar com a possibilidade de um elemeto ser excluído dos sub-arrays esquerdo e direito) tempo de execução total (uma vez que a soma de cada liha é ): T() = O[(1+log 2 ) ] = O( log ) 12 Eficiêcia da Ordeação por Partição (cot.) Prova-se que o caso médio (a hipótese de os valores estarem aleatoriamete distribuídos pelo array), o tempo de execução é da mesma ordem que o melhor caso, isto é, T() = O( log ) O critério seguido para a escolha do pivot destia-se a tratar eficietemete os casos em que o array está iicialmete ordeado 6
13 Comparação de tempos médios de execução (observados) de diversos algoritmos de ordeação Isertio sort Heap sort Merge sort Quick sort Cada poto correspode à ordeação de 100 arrays de iteiros gerados aleatoriamete Fote: Sahi, "Data Structures, Algorithms ad Applicatios i C++" Método de ordeação por partição (quick sort) é a prática o mais eficiete, excepto para arrays pequeos (até cerca 20 elemetos), em que o método de ordeação por iserção (isertio sort) é melhor! 14 Complexidade Espacial de QuickSort O espaço de memória exigido por cada chamada de QuickSort, sem cotar com chamadas recursivas, é idepedete do tamaho () do array O espaço de memória total exigido pela chamada de QuickSort, icluido as chamadas recursivas, é pois proporcioal à profudidade de recursão Assim, a complexidade espacial de QuickSort é: O(log ) o melhor caso (e o caso médio) O() o pior caso Em cotrapartida, a complexidade espacial de IsertioSort é O(1) 7