Projeto e Análise de Algoritmos Celso Carneiro Ribeiro http://www.inf.puc-rio.br/~celso Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 1 Parte 2 Análise de Algoritmos Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 2 Análise de algoritmos • • • • • • • • • • Motivação Análise de algoritmos Complexidade de pior caso Notação “O” Aplicações Algoritmos polinomiais Comparação de algoritmos Algoritmos recursivos Algoritmos não-polinomiais Algoritmos pseudo-polinomiais Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 3 Motivação • Problema: – Alunos cursam disciplinas. – Cada disciplina tem uma prova. – Há um único horário em que são marcadas provas em cada dia. – Provas de duas disciplinas diferentes não podem ser marcadas para o mesmo dia se há alunos que cursam as duas disciplinas. • Montar um calendário de provas: – satisfazendo as restrições de conflito e … – … minimizando o número de dias necessários para realizar todas as provas. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 4 Motivação • Modelagem por conjuntos: D B F A E C Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 5 Motivação • Os alunos que fazem apenas uma disciplina influem na modelagem? – Não! • O número de alunos que cursam simultaneamente um par de disciplinas influi na modelagem? – Não! – E se o objetivo fosse minimizar o número de alunos “sacrificados”? – Neste caso, sim! • Este modelo pode ser simplificado? Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 6 Motivação • Simplificação tratando-se apenas as interseções: D B F Considerar apenas as interseções não-vazias. A C E D A B Setembro 2004 E F C Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 7 Motivação • Simplificação com a utilização de um grafo de conflitos: D B F disciplinas → nós conflitos → arestas A C E D A A B D C B Setembro 2004 E E F F C Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 8 Motivação • Simplificação com a utilização de um grafo de conflitos: D B F disciplinas → nós conflitos → arestas A E D A E C B Setembro 2004 C Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro F 9 Modelo de dados Grafo = [ nós, arestas ] • As provas de um par de disciplinas não podem ser marcadas simultaneamente se existe uma aresta entre os nós que representam estas duas disciplinas. • Outros modelos de dados: listas, árvores, conjuntos, circuitos • Como representar em computador o modelo de dados chamado grafo? – Matriz de incidência (nó-aresta) – Matriz de adjacência (nó-nó) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 10 Matriz de incidência • n nós e m arestas • Memória utilizada: nm a b c g A a D b f B e C Setembro 2004 E d c F Anxm 1 0 0 1 0 0 d e f g 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro A B C D E F 11 Matriz de adjacência • Memória utilizada: n2 A B C g A a D b f B e C Setembro 2004 E d c F Bnxn 0 1 1 1 0 0 D E F 1 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 12 A B C D E F Listas de adjacências • Estas matrizes são duas “estruturas de dados” que representam o mesmo modelo de dados (grafo). • Outra estrutura de dados para grafos são as listas de adjacências. g A a D b f B e C Setembro 2004 E d c F F E E C D F D A C B E A B A C A B C Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro F D 13 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A B Setembro 2004 E C F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 14 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A B Setembro 2004 E C F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 15 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A B Setembro 2004 E C F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 16 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A B Setembro 2004 E C F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 17 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A B Setembro 2004 E C F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 18 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A B Setembro 2004 E C F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 19 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A B Setembro 2004 E C F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 20 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A B Setembro 2004 E C F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 21 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A B Setembro 2004 E C F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 22 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A B Setembro 2004 E C F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 23 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A B E C F • Escolher por exemplo o par de disciplinas B e E para o primeiro dia e retirá-las do grafo. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 24 Motivação • Como montar um calendário satisfazendo as restrições de conflito? • Marcar para o primeiro dia qualquer combinação de disciplinas sem conflitos: A, B, C, D, E, F, AE, AF, BD, BE, BF, CD, CE, DF, BDF D A C F • Escolher por exemplo o par de disciplinas B e E para o primeiro dia e retirá-las do grafo. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 25 Motivação • Marcar para o segundo dia qualquer combinação de disciplinas sem conflitos: A, C, D, F, AF, CD, DF D A C Setembro 2004 F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 26 Motivação • Marcar para o segundo dia qualquer combinação de disciplinas sem conflitos: A, C, D, F, AF, CD, DF D A C Setembro 2004 F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 27 Motivação • Marcar para o segundo dia qualquer combinação de disciplinas sem conflitos: A, C, D, F, AF, CD, DF D A C Setembro 2004 F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 28 Motivação • Marcar para o segundo dia qualquer combinação de disciplinas sem conflitos: A, C, D, F, AF, CD, DF D A C Setembro 2004 F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 29 Motivação • Marcar para o segundo dia qualquer combinação de disciplinas sem conflitos: A, C, D, F, AF, CD, DF D A C F • Escolher por exemplo o par de disciplinas D e F para o segundo dia e retirá-las do grafo. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 30 Motivação • Marcar para o segundo dia qualquer combinação de disciplinas sem conflitos: A, C, D, F, AF, CD, DF A C • Escolher por exemplo o par de disciplinas D e F para o segundo dia e retirá-las do grafo. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 31 Motivação • Marcar A ou C para o terceiro dia e a que sobrar para o quarto dia: A C Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 32 Motivação • A solução assim construída utiliza quatro dias: B-E no primeiro dia, D-F no segundo dia, A no terceiro e C no quarto: D A B E C F • Uma solução com quatro dias corresponde a colorir os nós do grafo de conflitos com quatro cores! Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 33 Motivação • Esta solução utiliza o menor número possível de dias? ou ... • É possível montar uma solução com menos dias? ou ... • É possível colorir o grafo de conflitos com três cores? D A Sim! B E C F • É impossível colorir o grafo de conflitos com menos de três cores! (por que?) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 34 Motivação • Como montar um escalonamento com o menor número possível de dias? • Recordando: um subconjunto independente de um grafo é um subconjunto de nós sem nenhuma aresta entre eles. • Logo, um conjunto de disciplinas que forma um subconjunto independente dos nós do grafo de conflitos pode ter suas provas marcadas para o mesmo dia. • Os nós deste subconjunto independente podem receber a mesma cor. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 35 Motivação • Quanto mais disciplinas forem marcadas para o primeiro dia, menos disciplinas sobram para os dias seguintes e, portanto, serão necessários menos dias para realizar as provas das disciplinas restantes. • Então, marcar para o primeiro dia as provas das disciplinas correspondentes a um subconjunto independente máximo. • Retirar os nós correspondentes a estas disciplinas do grafo de conflitos. • Continuar procedendo da mesma maneira, até as provas de todas as disciplinas terem sido marcadas. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 36 Motivação • Subconjunto independente máximo no grafo de conflito? BDF D A B Setembro 2004 E C F Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 37 Motivação • Subconjunto independente máximo no grafo de conflito? BDF D A B E C F • Eliminar os nós B, D e F do grafo de conflitos. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 38 Motivação • Subconjunto independente máximo no grafo de conflito? BDF A E C • Eliminar os nós B, D e F do grafo de conflitos. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 39 Motivação • Subconjunto independente máximo no grafo de conflito? CE A E C Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 40 Motivação • Subconjunto independente máximo no grafo de conflito? CE A E C • Eliminar os nós C e E do grafo de conflitos. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 41 Motivação • Subconjunto independente máximo no grafo de conflito? CE A • Eliminar os nós C e E do grafo de conflitos. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 42 Motivação • Subconjunto independente máximo no grafo de conflito? A A Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 43 Motivação • Subconjunto independente máximo no grafo de conflito? A A • Eliminar o nó A do grafo de conflitos. • Solução completa (todos nós coloridos). Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 44 Motivação • A solução encontrada usa o número mínimo de cores para colorir o grafo, logo o número de dias para aplicar todas as provas é mínimo: D A B E C F • Foi proposto um algoritmo para colorir um grafo com o menor número de cores. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 45 Motivação • O passo básico deste algoritmo corresponde a determinar um subconjunto independente máximo. • Entretanto, este subproblema a ser resolvido a cada iteração (já é um problema NP-completo por si só, ou seja, cada subproblema) é computacionalmente difícil. • Além deste procedimento ser computacionalmente difícil, é possível garantir que este algoritmo sempre encontra a solução ótima com o número mínimo de cores? – Ou demonstrar que sim, ou dar um contra-exemplo. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 46 Motivação • Considerando-se o grafo abaixo, qual solução seria encontrada pelo algoritmo? Os oito nós externos formam um subconjunto independente de cardinalidade máxima e podem todos ser coloridos com a mesma cor. Setembro 2004 A B C D E F G H I J K L Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 47 Motivação • Considerando-se o grafo abaixo, qual solução seria encontrada pelo algoritmo? Os oito nós externos formam um subconjunto independente de cardinalidade máxima e podem todos ser coloridos com a mesma cor. Setembro 2004 A B C D E F G H I J K L Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 48 Motivação • Considerando-se o grafo abaixo, qual solução seria encontrada pelo algoritmo? Esta solução é ótima, ou é possível colorir este grafo com menos cores? A B C D E F G H I J K L Sim: o grafo pode ser colorido com apenas duas cores. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 49 Motivação • Considerando-se o grafo abaixo, qual solução seria encontrada pelo algoritmo? Esta solução é ótima, ou é possível colorir este grafo com menos cores? A B C D E F G H I J K L Sim: o grafo pode ser colorido com apenas duas cores Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 50 Motivação • O algoritmo proposto nem sempre encontra a solução ótima (isto é, uma solução com o número mínimo de cores). • Este algoritmo é então um algoritmo aproximado ou uma heurística para o problema de coloração de grafos. • Algoritmos exatos vs. algoritmos aproximados: – qualidade da solução – tempo de processamento Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 51 Algoritmo Seqüência precisa, não-ambígua de passos elementares que levam à solução de um problema. • Definição informal, imprecisa! • Definição formal: máquina de Turing • Especificação: português português estruturado pseudo linguagem linguagem de programação Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 52 Algoritmo Passo 0: k 1 Passo 1: alocar o maior número possível de provas no dia k sem conflito Passo 2: eliminar estas provas do grafo (nós, arestas) Passo 3: fazer k k+1 e voltar ao passo 1 • Subproblema resolvido a cada iteração: alocar o maior número possível de provas sem conflito • Conjunto independente de cardinalidade máxima Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 53 Análise de algoritmos Objetivos e questões básicas: • Como avaliar a eficiência de um algoritmo? • Dados dois algoritmos para a resolução de um mesmo problema, qual é o mais eficiente? • Quando um problema pode ser considerado como bem resolvido? Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 54 Problema do caixeiro viajante • n cidades, distâncias cij • Obter a rota de menor comprimento que parte de uma cidade, visita uma vez cada cidade e retorna à cidade inicial. – Cada solução é uma permutação circular das n cidades. n 1! soluções 2 n 21 80 anos n 22 1680anos Setembro 2004 um a solução: 109 segundos Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 55 Como escolher um algoritmo? • Algoritmo mais fácil de entender, implementar, documentar • Algoritmo mais rápido ou eficiente • Eficiência é uma medida objetiva: – Memória – I/O – Comunicação – Acesso a memória secundária – Tempo → problemas grandes (crescimento assintótico) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 56 Como escolher um algoritmo? • É impossível processar um algoritmo/programa para todas as entradas (dados) possíveis. • Desenvolver medidas do tempo de processamento que resumam seu comportamento para todas as entradas possíveis. • Considerar a eficiência de um algoritmo como sendo a quantidade de tempo que usa, medida como função do tamanho da entrada. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 57 Enfoques • Benchmark – considerar uma pequena coleção de entradas “típicas” e considerá-la como representativa dos possíveis dados de entrada. • Métodos analíticos – agrupar as entradas possíveis de acordo com seu tamanho – Ordenação: n – Matriz: m,n – Grafo: m,n Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 58 Enfoques • Usar uma função T(n) para representar o número de unidades de tempo utilizadas pelo algoritmo/programa quando aplicado a um problema cujo tamanho da entrada é n – T(n) = cn – T(n) = d + en + fn2 – T(n) número de instruções número de operações elementares tempo de CPU • O tempo de processamento depende dos dados da própria entrada, não apenas do seu tamanho! Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 59 Enfoques • T(n) = tempo {MÉDIO, MÍNIMO, MÁXIMO} de processamento calculado sobre todas as entradas de tamanho n – Médio: mais difícil, mais realista – Mínimo: pouca informação – Máximo: conservador Setembro 2004 ordenação 1 2 3 4 5 6 n=6 6 5 4 3 2 1 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 60 Exemplo: Ordenação por seleção A[1] A[2] … A[n] para i = 1 até n-1 faça início smaller i para j=i+1 até n faça se A[j] < A[smaller] então smaller j; temp A[smaller] A[smaller] A[i] A[i] temp fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 61 Análise • Contar como operações as linhas de código, executando-se atribuições, comparações,… para : n 1(total) 1(teste) sm aller: 1 para : n (i 1) 1(total) 1(teste) se : n (i 1) 1 caso m ais favorável 0, sm aller j n (i 1) 1, pior caso tem p: 3(n 1) n 1 T (n) n 1 1 3 n (i 1) 1 3(n 1) i 1 n 1 T (n) 4n 3 2(n 1) 3 (n i ) i 1 T ( n) 6n 5 Setembro 2004 1 (n 1) (n 1) 2 n 2 11 T ( n) n5 2 Projeto e Análise de Algoritmos - Celso2Carneiro Ribeiro 62 Comparação de dois algoritmos TA (n) 100n e TB (n) 2n2 milisegundos 20000 15000 n 50 – Algoritmo B n 50 – Algoritmo A TB(n)=2n2 TA(n)=100n 10000 5000 0 20 40 60 80 100 • Para n 50, a vantagem do algoritmo A sobre o algoritmo B cresce com n. • A função T(n) determina o maior problema que pode ser resolvido com este algoritmo (em determinado tempo de computação) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 63 Comparação de dois algoritmos Quando a velocidade dos computadores aumenta, maiores aumentos no tamanho dos maiores problemas que podem ser resolvidos são observados para programas cujo tempo de processamento cresce mais lentamente. Segundos Maior problema que pode ser resolvido Alg. A Alg. B 1 10 22 10 100 70 100 1000 223 1000 10000 707 Procurar algoritmos com menores taxas de crescimento! Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 64 Comparação de dois algoritmos • O tempo de processamento de um dado algoritmo para uma entrada particular ainda depende – do computador – do compilador • Mesmo conhecendo-se algoritmo/programa/máquina/ compilador, ainda é difícil prever o tempo de processamento de um programa Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 65 Notação O Descrever o tempo de processamento de um programa usando a notação O, que “esconde” fatores tais como: • Número de instruções de máquina geradas por um computador • Número de instruções de máquina executadas (por segundo) por um determinado computador T(n) = 100n → T(n) = O(n) “Alguma constante vezes n” • Também esconde o fato de que instruções diferentes executam em tempos diferentes. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 66 Notação O T(n) = O(f(n)) se existe um inteiro n0 e uma constante c > 0 tal que T(n) ≤ c.f(n) para qualquer n ≥ n0 T (n) (n 1) 2 T (n) O(n 2 ) n 2 2n 1 n 2 2n 2 n 2 n 2 2n 1 4n 2 (para n 1) n0 1, c 4 n2 T (n) O 100 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 67 Notação O Constantes e termos de menor grau não importam: T (n) ak n k ak 1n k 1 a2 n 2 a1n a0 T ( n) O ( n k ) n0 1 c ak ak 1 a1 a0 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 68 Notação O lim n hn 0 g n hn O g n g n T n 2 n n 3 O 2 n n3 lim n 0 ou n0 10, c 2 n 2 Transitividade : f n Og n g n Ohn f (n) O(h(n)) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 69 Notação O No caso geral, obter T(n) de forma exata pode ser muito difícil. Esta tarefa pode ser muito simplificada se, em vez de obter-se T(n), procura-se uma expressão O(f(n)) como limitante superior de T(n). Ordenação por seleção: T(n) = O(n2) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 70 Notação O n 2 11 T n n4 2 2 n2 T n O O n 2 2 O n3 n3 O 100 O 100n 2 O n 7. 5 Limite mais justo: menor grau constante = 1 T(n) = O(n2) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 71 Notação O O 1 O log n O n O n log n O n O 2 O n2 Linear nlogn Quadrático Cúbico n Exponencial Setembro 2004 Logarítmico 3 O n! On Constante n Fatorial Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 72 Notação O Expressões na notação O podem freqüentemente ser adicionadas: T1 (n) O f1 n T2 (n) O f 2 n Hipótese: f 2 (n) O f1 n T1 (n) T2 (n) O f1 n Aplicação: programas que podem ser decompostos em duas partes Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 73 Exemplo 1 Expressões na notação O podem freqüentemente ser adicionadas: ler n para i = 1 até n faça para j = 1 até n faça A[i,j] 0 para i=1 até n faça A[i,i] 1 T1 (n) O1 T2 (n) O n2 T3 (n) On T (n) T1 n T2 n T3 n O n 2 O1 O1 O1 O1 O1 O1 O1 On n vezes Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 74 Exemplo 2 - Fatorial Ler n i2 fact 1 enquanto i ≤ n faça inicio fact fact * i i i+1 fim Escreva fact Setembro 2004 Linhas: 111 3 3 1 1 i 2 i n i n 1 T (n) 5 3(n 1) 3n 1 Instruções: T n 1 1 1 (n 1)(1 2 2) 1 1 T (n) 5n 1 1 5n NotaçãoO : O1 (n 1).O1 T ( n) O ( n) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 75 Análise do tempo de processamento Tempo de processamento ~ Complexidade • Comandos simples: O(1) – Atribuição, E/S, go to – Bloco de comandos simples consecutivos: O(1) • Bloco for – Limites do for dão um limite superior para o número de vezes que o bloco é executado – Caso mais simples: multiplicar a complexidade do bloco pelo limite superior do número de vezes que é executado Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 76 Análise do tempo de processamento para j = 1 até n faça A[i,j] 0 O(n) → n vezes → O(1) para i = 1 até n faça → n vezes para j = 1 até n faça → n vezes A[i,j] 0 → O(1) T(n) = nT’(n) = n(n.O(1)) = O(n2) Selection sort: smaller = i → O(1) para j = i+1 até n faça → n vezes se A[j] < A [smaller] então smaller j; → O(1) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 77 Análise do tempo de processamento • i n-1 T(n)=O(1) • i < n-1 T(n)=O(1) + (n-i) · O(1) = O(n-i) • T(n)=O (max {1, n-i} ) • Complexidade do algoritmo completo n 1 O1 Omax1, n i O1 i 1 n 1 O ( n i ) O n 2 i 1 (n 1) vezes 2 O n On i On Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 78 Análise do tempo de processamento • Teste: Setembro 2004 se <condição> então <parte_do_então> senão <parte_do_senão> O (max(f(n), g(n)) → O(1) → O(f(n)) se A[i,i]=0 então para i =1 a n faça para j = 1 a n faça A[i,j] 0 senão para i = 1 a n faça A[i,i] 0 O(n2) → f(n) = n2 → O(g(n)) → g(n) = n Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 79 Análise do tempo de processamento • Verificar se um elemento x pertence a um vetor A[.] (busca seqüencial) com n elementos: A[n+1] x i1 enquanto x A[i] faça i i+1; se i = n+1 então elemento não existe; se não elemento existe; O(1) + O(n)·O(1) + O(1) = O(n) • Programas com chamadas de funções ou procedimentos Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 80 Análise do tempo de processamento • Procurar algoritmos de menor complexidade • Na prática, as constantes e termos de menor grau omitidos podem fazer uma diferença significativa • Procurar otimizar o código nos pontos críticos O n2 Setembro 2004 2 T ( n ) 2 n n4 A 2 T ( n ) 2 n 1899n 6 B Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 81 Cálculo de polinômios Pn x an x n an1 x n 1 a1 x a0 Dado x, calcularPn x P A[0] para i = 1 até n faça P P + A[i] · (xi); T1(n) = n · O(n) = O(n2) O(n) mesmo? P A[0] y y · x; para i 1 até n faça P P + A[i] · y y y · x; T2(n) = n · [O(1)+O(1)] = O(n) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 82 Método de Horner Pn x an x n an 1 x n 1 a1 x a0 Dado x, calcular Pn x P A[n] para i n-1 até 0 faça P A[i] + x * P; T3(n) = n · O(1) = O(n) P an P an 1 xan P an 2 xan 1 an x an 2 an 1 x an x 2 Qual dos três algoritmos é melhor? P an 3 x an 2 an 1 x an x 2 an 3 an 2 x an 1 x 2 an x 3 P a0 a1 x a2 x 2 an x n Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 83 Ordenação pelo método da bolha início chave 1; enquanto chave=1 faça início chave 0; para i = 1 até n-1 faça início se A[i+1] < A[i] então início temp A[i]; A[i] A[i+1]; A[i+1] temp; chave 1; fim fim fim fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 84 Ordenação pelo método da bolha • Em cada iteração, pelo menos um elemento é colocado na posição final correta. • No máximo, n-1 iterações T(n) = (n-1) · [(n-1) · O(1)] T(n) = O(n2) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 85 Calcular média e elemento mais próximo A[1] ... A[n] soma 0; para i=1 até n faça soma soma + A[i]; fim-para; media soma / n; maisperto 1; i 2; enquanto i n faça se (A[i]–media)**2 < (A(maisperto)-media)**2 entao maisperto i; i i + 1; fim-enquanto; T(n) = O(1) + n · O(1) + O(1) + (n-1) · O(1) T(n) = O(n) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 86 Verificar se um inteiro é primo prime true; i 2; enquanto i**2 n faça se (n mod i) = 0 então; início; prime false; goto 99; fim; senao i i + 1; fim-enquanto; 99: imprimir resultado; T(n) = O(1) + n · O(1) T(n) = O( n ) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 87 Pesquisa binária x A[1] ...A[n] ? (ordenado) min 1; max n; med (min + max)/2; enquanto max > min e A[med] x faça início; se x > A[med] então min med + 1; se x < A[med] então max med – 1; med (min + max)/2; fim se A[med] = x então ... T(n) = O(1) + log n · O(1) senão ... T(n) = O(log n) Pesquisa seqüencial: O(n) Pesquisa binária: O(log n) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 88 Exemplo: x = 17 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 2 4 5 8 10 11 13 15 17 20 min med min A[5] < x min med med A[8] < xA[9] =x max fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 89 Exemplo: x = 16 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 2 4 5 8 10 11 13 15 17 20 min med min A[5] < x min max med med min >x A[8] < A[9] x max fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 90 Algoritmos de menor complexidade • Heapsort • Mergesort O(n log n) É possível provar que este limitante é o melhor possível, isto é, estes algoritmos são ótimos! • Problema: dados um vetor A[1] ... A[n] e um valor x, verificar se x é um elemento do vetor. • Qual é o melhor algoritmo? Depende!!! Dados ordenados ou não? Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 91 Algoritmos de menor complexidade • Dados ordenados: - Pesquisa binária: O(log n) • Dados não-ordenados: - Pesquisa seqüencial: O(n) - Ordenar + pesquisa binária: O(n log n) + O(log n) = O(n log n) Pesquisa seqüencial é melhor! Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 92 Algoritmos de menor complexidade • Variante: Há m elementos a serem testados • Dados não-ordenados Pesquisa seqüencial: O(m.n) Ordenar + pesquisa binária: O(n log n) + O(m log n) = O((n + m) log n) • Hipótese: m n Agora, a segunda alternativa é a mais eficiente! O(n log n) vs. O(n2) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 93 Heap • Tipo de dado: Fila de prioridade Implementação: Heap • Conjunto de elementos, cada um com uma prioridade Operações: Inserir Obter e eliminar o elemento com maior prioridade • Exemplo de aplicação: heapsort Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 94 Árvore parcialmente ordenada • Árvore binária valorada onde os rótulos satisfazem as seguintes propriedades: 1. Rótulos dos nós são elementos com uma prioridade (valor de um elemento). 2. O elemento armazenado em um nó tem prioridade maior ou igual à dos filhos deste nó. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 95 Árvore parcialmente ordenada • APO’s são uma boa implementação de filas de prioridade. DeleteMax: – Substituir a raiz pelo nó mais à direita no nível mais baixo; – Reorganizar a árvore fazendo o elemento da raiz descer até a posição apropriada. Inserir: – Criar folha mais à esquerda possível no nível mais baixo e subir até encontrar a posição apropriada. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 96 Árvore parcialmente ordenada balanceada • • As folhas estão no máximo em dois níveis diferentes . As folhas no nível mais baixo estão o mais à esquerda possível. n nós caminho da raiz tem comprimento menor ou igual a log2 n 18 16 18 7 9 3 Setembro 2004 7 5 1 9 Heap: implementação de uma APO balanceada Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 97 Heap • Vetor A com interpretação especial para índice dos elementos • Elementos de APOB aparecem nível a nível em A, começando da raiz, e dentro de um mesmo nível da esquerda para a direita – O filho à esquerda do nó armazenado em A[i] será armazenado em A[2i] e seu filho à direita em A[2i+1] 18 18 16 9 7 1 9 3 7 5 1 Setembro 2004 2 3 4 5 6 7 8 9 10 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 98 Heap Construção da árvore A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 4 1 3 2 16 9 10 14 8 7 4 3 1 2 14 Setembro 2004 16 8 9 10 7 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 99 Heap type IntArray = array [1...max] of integer; procedure swap (var A: intarray;i, j: integer); var temp: integer; início temp A[i]; A[i] A[j]; A[j] temp; fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 100 Heap procedure bubbleUp (var A: intarray;i: integer); início se i > 1 AND A[i] > A[i/2] então início swap (A,i,i/2); bubbleUp (A,i/2) fim fim procedure insert (var A: intarray; x,n: integer); início n n + 1; A[n] x; bubbleUp (A,n) T(n) = O(log n) fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 101 Heap procedure bubbleDown (var A: intarray;i,n: integer); var filho: integer; início filho 2*i; se filho < n então se A[filho+1] > A[filho] então filho filho + 1; se filho n então se A[i] < A[filho] então início swap (A,i,filho); bubbleDown (A,filho,n) fim fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 102 Heap procedure deletemax (var A: intarray; Var n: integer); início swap (A, 1, n); n n – 1; bubbleDown (A, 1, n) fim T(n) = O(log n) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 103 Heapsort • Ordenar um vetor A[1..n] em duas fases: 1. Dar ao vetor a propriedade de ser uma APO balanceada (heap). 2. Repetidamente, selecionar o maior item do heap até que o vetor fique ordenado 1 i (i + 1) n heap (n-i) maiores elementos já ordenados para i = 1 até n faça insert(ai); para i = 1 até n faça deletemax Setembro 2004 O(log n) T(n) = O(n log n) O(log n) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 104 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 4 1 3 2 16 9 10 14 8 7 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 105 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 4 1 3 2 16 9 10 14 8 7 4 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 106 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 4 1 3 2 16 9 10 14 8 7 4 1 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 107 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 4 1 3 2 16 9 10 14 8 7 4 1 Setembro 2004 3 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 108 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 4 1 3 2 16 9 10 14 8 7 4 1 3 Atenção!!! 2 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 109 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 4 1 3 2 16 9 10 14 8 7 4 3 1 2 Setembro 2004 16 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 110 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 4 1 3 2 16 9 10 14 8 7 4 3 1 2 Setembro 2004 16 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 111 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 4 3 2 1 9 10 14 8 7 16 3 4 2 Setembro 2004 1 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 112 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 4 3 2 1 9 10 14 8 7 16 3 4 2 Setembro 2004 1 9 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 113 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 4 3 2 1 9 10 14 8 7 16 3 4 2 Setembro 2004 1 9 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 114 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 4 9 2 1 3 10 14 8 7 16 9 4 2 Setembro 2004 1 3 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 115 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 4 9 2 1 3 10 14 8 7 16 9 4 2 Setembro 2004 1 3 10 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 116 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 4 9 2 1 3 10 14 8 7 16 9 4 2 Setembro 2004 1 3 10 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 117 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 4 10 2 1 3 9 14 8 7 16 10 4 2 Setembro 2004 1 3 9 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 118 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 4 10 2 1 3 9 14 8 7 16 10 4 2 1 3 9 14 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 119 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 4 10 2 1 3 9 14 8 7 16 10 4 2 1 3 9 14 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 120 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 14 10 4 1 3 9 2 8 7 16 10 14 4 1 3 9 2 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 121 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 14 10 4 1 3 9 2 8 7 16 10 14 4 2 Setembro 2004 1 3 9 8 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 122 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 14 10 4 1 3 9 2 8 7 16 10 14 4 2 Setembro 2004 1 3 9 8 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 123 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 14 10 8 1 3 9 2 4 7 16 10 14 8 2 Setembro 2004 1 3 9 4 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 124 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 14 10 8 1 3 9 2 4 7 16 10 14 8 2 Setembro 2004 1 4 3 9 7 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 125 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 14 10 8 1 3 9 2 4 7 16 10 14 8 2 Setembro 2004 1 4 3 9 7 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 126 Heapsort Construção do vetor (primeira parte, usando insert) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 16 14 10 8 7 3 9 2 4 1 16 10 14 8 2 Setembro 2004 7 4 3 9 1 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 127 Heapsort Ordenação do vetor (segunda parte, usando deleteMax) A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 8 9 1 3 4 7 10 14 16 2 4 14 10 82 7 3 9 16 14 8 10 9 73 4 8 144 222 7 277 41 88 1 2 7 4 10 10 9 31 14 7 28 48 9 19 2 2 1 Árvore antes de extrair a raiz Setembro 2004 4 1 4 3 2 3 10 39 1 77 2 9 1 32 3 1 Árvore após extrair a raiz Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 128 Heapsort Implementação melhor: em vez de montar um heap elemento a elemento, ler o vetor e transformá-lo após a leitura. procedure heapsort (var A: intarray; n: integer); var i: integer; início heapify (A, n); O(n) i n; O (n log n) enquanto i > 1 faça swap de A[1] e A[i]; deletemax (A,i); fim diminui n n -1 heapify considera o vetor A após a leitura e o transforma em um heap, começando do nível mais baixo e subindo nível a nível. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 129 Heapsort Nada a fazer no nível mais baixo, começar um nível acima: apenas os n/2 primeiros elementos podem ser afetados, pois são os que têm filhos. procedure heapify (var A: intarray; n: integer); var i: integer; início para i = n/2 downto 1 faça bubbleDown (A,i,n); fim n/2 chamadas a BubbleDown O(n log n) ou menos? Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 130 Heapsort n/2 n/4 + 1 n n/2 + 1 • • • 2a metade: 2º quarto: 2º oitavo: 4 0 chamada 1 chamada 2 chamadas 2 3 1 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 131 Heapsort n/8 ... n/4 2 zona 2 • n/2 n 1 0 zona 1 zona 0 Zona i: 4 n n j i 1 i 2 2 1 • No máximo i chamadas a bubbleDown para cada elemento na zona i • Número de elementos na zona i: Setembro 2004 3 2 n i 1 2 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 132 Heapsort • Zona de maior índice: log2n • Altura: log2n • A[1] é o único elemento na zona log2n de maior índice log 2 n n i. i 1 ? 2 i 1 4 3 2 1 Heapify O(n) Setembro 2004 n n i. i 1 i i 1 2 i 1 i 1 2 log 2 n n i i 2 i 1 2 n .2 n 2 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 133 Heapsort i i i 1 2 1 1 1 1 1 1 1 1 1 1 2 4 4 8 8 8 16 16 16 16 1 1 1 1 1 2 4 8 16 1 1 1 1 4 8 16 2 1 1 1 8 16 4 2 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 134 Algoritmos polinomiais • Diz-se que um algoritmo é polinomial quando sua complexidade de pior caso (T(n)) é limitada por um polinômio em função do tamanho da entrada (n). • Considera-se um determinado tipo de problema como bem resolvido em termos algorítmicos quando se dispõe de um bom algoritmo para sua solução. • Diz-se que um bom algoritmo é aquele cuja complexidade é polinomial Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 135 Algoritmos polinomiais • A taxa de crescimento de qualquer algoritmo polinomial é menor do que a taxa de crescimento dos algoritmos não polinomiais. P(n): polinômio em n P ( n) P ( n) P ( n) lim n lim lim n 0 n 2 n n! n n Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 136 Algoritmos polinomiais • Para n suficientemente grande, um algoritmo polinomial é sempre mais rápido do que um algoritmo não-polinomial. T1(n) = na T2(n) = an T1 (n 1) (n 1) a lim lim 1 a n T ( n) n n 1 T2 (n 1) a n 1 lim lim n a n T ( n) n a 2 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 137 Algoritmos polinomiais n n log n n3 2n n log n n! Setembro 2004 10 33 1000 1024 2099 3628800 100 664 106 1.27 x 1030 1.93 x 1013 10158 1000 9966 109 1.05 x 10 301 7.89 x 10 29 4 x 10 2567 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 138 Algoritmos polinomiais • Propriedade de fechamento: P = {polinômios} é uma constante P1, P2 P · P1 P P1 + P2 P P1 · P2 P Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 139 Algoritmos polinomiais • Melhor utilização de avanços tecnológicos • n1: maior tamanho de problema que pode ser resolvido em um computador disponível hoje, usando um algoritmo de complexidade T(n), em determinado tempo de processamento pré-fixado. • n10: mesma definição, em um computador 10 vezes mais rápido. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 140 Algoritmos polinomiais T(n10) = 10 · T(n1) n n log n n3 2n nlog n n! Setembro 2004 1012 0.948 x 1011 104 40 79 14 (n10)3 = 10 (n1 )3 n10 = 3 10 · n1 1013 0.87 x 1012 2.15 x 104 43 95 15 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 141 Algoritmos polinomiais • Problemas que podem ser resolvidos por algoritmos polinomiais classe • Há muitos problemas para os quais não se conhece algoritmos polinomiais Não existem? Ainda não foram encontrados? Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 142 Teoria da complexidade • Problemas NP-completos • O que fazer quando não se conhece um algoritmo polinomial para um problema? Desenvolver um algoritmo não-polinomial. Procurar algoritmos aproximados de complexidade polinomial. Problemas Setembro 2004 decisão avaliação otimização “sim” “não” Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 143 Teoria da complexidade “NP-difíceis” /“NP-árduos” P-SPACE NP-Completos NP PP P NP ? “fáceis” (algoritmos polinomiais) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 144 Algoritmos pseudopolinomiais Exemplo: ordenação pelo método das caixas A[1] ... A[n]: números inteiros [a,b] FASE 1: Colocar cada elemento A[i] na caixa apropriada (ou seja, a caixa rotulada com i) FASE 2: Percorrer as caixas na ordem por ordem crescente de rótulo, retirando os elementos Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 145 Algoritmos pseudopolinomiais para j = a até b faça n(j) 0; para i = 1 até n faça n[a[i]] n[a[i]] + 1; k 0; para j = a até b faça início enquanto n[j] 0 faça início n[j] = n[j] – 1; k k + 1; a[k] j; fim fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 146 Algoritmos pseudopolinomiais T(n) = (b – a + 1) · O (1) + n · O (1) + O (1) + (b – a + 1) · O (n) · O (1) = O(n · (b – a)) Não, cuidado!!! para : enquanto: n[j] : k : a[k] : Setembro 2004 b–a+1 n + (b – a + 1) n T(n) = O(b – a + n) Não é um algoritmo polinomial, pois T(n) não é um polinômio apenas no tamanho da entrada. Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 147 Algoritmos pseudopolinomiais Exemplo: problema da mochila • Selecionar dentre n objetos aqueles que serão levados em uma mochila de capacidade (peso máximo) limitada. j = 1, ..., n objetos cj “lucro” n aj “peso” maximizar c j x j b “peso máximo” j 1 n sujeitoa: a j x j b j 1 Hipótese: aj b j Setembro 2004 x j 0,1, j 1,...,n Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 148 Problema da mochila • Decomposição do problema em estágios. • Em vez de considerar uma solução (x1,x2,...,xn) completa de uma só vez, visualizar o problema como se as decisões fossem tomadas para um item de cada vez. • Após k decisões, terão sido determinados quais dos primeiros k itens devem ser selecionados e, conseqüentemente, terão sido determinados os valores das variáveis x1,x2,...,xk. k • Neste ponto, o valor acumulado é j1 k • O volume acumulado é c x j 1 Setembro 2004 j a x j j j Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 149 Problema da mochila • Estágio: cada variável do problema • Estado: volume total ocupado com as decisões já tomadas • Decisão: selecionar ou não um item (isto é, fazer xk=1) • Custo da decisão de selecionar o item k: aumento de ck unidades no lucro parcial acumulado • Efeito da decisão de selecionar o item k: aumento do volume ocupado (estado) em ak unidades Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 150 Problema da mochila • Definição: yk(u) = lucro máximo que pode ser obtido com volume total igual a u e usando apenas itens do conjunto {1,...,k} • Quanto vale y0(0)? – y0(0) = 0 (sem objetos selecionados, o peso e o lucro são nulos) • Definir yk(u) = - se é impossível obter um volume total igual a u apenas com itens dentre os do conjunto {1,...,k}. • Quanto valem y0(u) e yk(0)? – y0(u) = - para u > 0 (impossível acumular peso sem itens) – yk(0) = 0 para k = 1,2,...,n (nenhum item selecionado) • Calcular yk(u) para k = 1,...,n e u = 0,...b, a partir de y0(0). Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 151 Problema da mochila • yk(u) = lucro máximo que pode ser obtido com volume total igual a u e usando apenas itens do conjunto {1,...,k} • Calcular yk(u) para k = 1,...,n e u = 0,...b: u 0; k 0 0, yk (u ) , u 1,...,b;k 0 maxy (u ), y (u a ) c , u 0,...,b; k 1,...,n k 1 k 1 k k • Interpretação: há duas alternativas para se obter yk(u), dependendo do item k ser selecionado ou não – yk(u) = yk-1(u), se o item k não é usado – yk(u) = yk-1(u-ak)+ck, se o item k é usado Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 152 Problema da mochila u 0; k 0 0, yk (u ) , u 1,...,b;k 0 maxy (u ), y (u a ) c , u 0,...,b; k 1,...,n k 1 k 1 k k • Observar que o lucro associado ao estado resultante de uma decisão depende apenas do valor desta decisão e do estado atual, mas não depende da forma como este último foi atingido. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 153 Problema da mochila y5(4) = max 3x1 2 x2 2 x3 x4 3x5 sujeito a : 3x1 3x2 x3 x4 2 x5 4 x j {0,1}, j 1,...,5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 154 Problema da mochila max 3x1 2 x2 2 x3 x4 3x5 sujeito a : 3x1 3x2 x3 x4 2 x5 4 x j {0,1}, j 1,...,5 y5(b) = max 3x1 2 x2 2 x3 x4 3x5 sujeito a : 3x1 3x2 x3 x4 2 x5 b x j {0,1}, j 1,...,5 Valor ótimo = maxb=0,...,4 {y5(b)} Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 155 Problema da mochila u=4 y0(4) y5(4) u=3 y0(3) y5(3) u=2 y0(2) y5(2) u=1 y0(1) y5(1) u=0 y0(0) y1(0) y2(0) y3(0) y4(0) y5(0) k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 156 Problema da mochila u=4 y0(4) u=3 y0(3) u=2 y0(2) u=1 y0(1) u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 157 Problema da mochila u=4 - u=3 - u=2 - u=1 - u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 158 Problema da mochila u=4 - ? u=3 - ? u=2 - ? u=1 - ? u=0 0 ? k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 159 Problema da mochila u=4 - u=3 - u=2 - - u=1 - - u=0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 160 Problema da mochila u=4 - u=3 - 3 u=2 - - u=1 - - u=0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 161 Problema da mochila u=4 - - u=3 - 3 u=2 - - u=1 - - u=0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 162 Problema da mochila u=4 - - u=3 - 3 u=2 - - u=1 - - u=0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 163 Problema da mochila u=4 - - ? u=3 - 3 ? u=2 - - ? u=1 - - ? u=0 0 0 ? k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 164 Problema da mochila u=4 - - u=3 - 3 u=2 - - u=1 - - u=0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 165 Problema da mochila u=4 - - u=3 - 3 u=2 - - - u=1 - - - u=0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 166 Problema da mochila u=4 - - u=3 - 3 u=2 - - u=1 - - - u=0 0 0 0 2 - k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 167 Problema da mochila u=4 - - 0 u=3 - 3 u=2 - - u=1 - - - u=0 0 0 0 2 - k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 168 Problema da mochila u=4 - - 0 u=3 - 3 3 u=2 - - u=1 - - - u=0 0 0 0 2 - k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 169 Problema da mochila u=4 - - - u=3 - 3 3 u=2 - - - u=1 - - - u=0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 170 Problema da mochila u=4 - - - u=3 - 3 3 u=2 - - - u=1 - - - u=0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 171 Problema da mochila u=4 - - - ? u=3 - 3 3 ? u=2 - - - ? u=1 - - - ? u=0 0 0 0 ? k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 172 Problema da mochila u=4 - - - u=3 - 3 3 u=2 - - - u=1 - - - u=0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 173 Problema da mochila u=4 - - - u=3 - 3 3 u=2 - - - u=1 - - - 2 u=0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 174 Problema da mochila u=4 - - - u=3 - 3 3 u=2 - - - - u=1 - - - 2 u=0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 175 Problema da mochila u=4 - - - u=3 - 3 3 2 u=2 - - - - u=1 - - - 2 u=0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 176 Problema da mochila u=4 - - - u=3 - 3 3 0 2 u=2 - - - - u=1 - - - 2 u=0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 177 Problema da mochila u=4 - - - u=3 - 3 3 0 3 2 u=2 - - - - u=1 - - - 2 u=0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 178 Problema da mochila u=4 - - - 5 2 u=3 - 3 3 3 u=2 - - - - u=1 - - - 2 u=0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 179 Problema da mochila u=4 - - - 5 u=3 - 3 3 3 u=2 - - - - u=1 - - - 2 u=0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 180 Problema da mochila u=4 - - - 5 ? u=3 - 3 3 3 ? u=2 - - - - ? u=1 - - - 2 ? u=0 0 0 0 0 ? k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 181 Problema da mochila u=4 - - - 5 u=3 - 3 3 3 u=2 - - - - u=1 - - - 2 u=0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 182 Problema da mochila u=4 - - - 5 u=3 - 3 3 3 u=2 - - - - u=1 u=0 - 0 - 0 - 0 2 0 0 1 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 183 Problema da mochila u=4 - - - 5 u=3 - 3 3 3 u=2 - - - - u=1 - - - 2 2 u=0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 184 Problema da mochila u=4 - - - 5 u=3 - 3 3 3 u=2 - - - - 1 u=1 - - - 2 2 u=0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 185 Problema da mochila u=4 - - - 5 u=3 - 3 3 3 u=2 - - - - 3 u=1 - - - 2 2 u=0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 186 Problema da mochila u=4 - - - 5 u=3 - 3 3 3 u=2 - - - - 3 u=1 - - - 2 2 u=0 0 0 0 0 0 0 3 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 187 Problema da mochila u=4 - - - 5 u=3 - 3 3 3 3 u=2 - - - - 3 u=1 - - - 2 2 u=0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 188 Problema da mochila u=4 - - - 5 1 u=3 - 3 3 3 3 u=2 - - - - 3 u=1 - - - 2 2 u=0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 189 Problema da mochila u=4 - - - 5 0 1 u=3 - 3 3 3 3 u=2 - - - - 3 u=1 - - - 2 2 u=0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 190 Problema da mochila u=4 - - - 5 0 5 1 u=3 - 3 3 3 3 u=2 - - - - 3 u=1 - - - 2 2 u=0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 191 Problema da mochila u=4 - - - 5 5 u=3 - 3 3 3 3 u=2 - - - - 3 u=1 - - - 2 2 u=0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 192 Problema da mochila u=4 - - - 5 5 ? u=3 - 3 3 3 3 ? u=2 - - - - 3 ? u=1 - - - 2 2 ? u=0 0 0 0 0 0 ? k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 193 Problema da mochila u=4 - - - 5 5 u=3 - 3 3 3 3 u=2 - - - - 3 u=1 - - - 2 2 u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 194 Problema da mochila u=4 - - - 5 5 u=3 - 3 3 3 3 u=2 - - - - 3 u=1 - - - 2 2 u=0 0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 195 Problema da mochila u=4 - - - 5 5 u=3 - 3 3 3 3 u=2 - - - - 3 u=1 - - - 2 2 u=0 0 0 0 0 0 0 2 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 196 Problema da mochila u=4 - - - 5 5 u=3 - 3 3 3 3 u=2 - - - - 3 u=1 - - - 2 2 2 u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 197 Problema da mochila u=4 - - - 5 5 u=3 - 3 3 3 3 u=2 - - - - 3 0 3 u=1 - - - 2 2 2 u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 198 Problema da mochila u=4 - - - 5 5 u=3 - 3 3 3 3 u=2 - - - - 3 0 3 3 u=1 - - - 2 2 2 u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 199 Problema da mochila u=4 - - - 5 5 u=3 - 3 3 3 3 u=2 - - - - 3 3 u=1 - - - 2 2 2 u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 200 Problema da mochila u=4 - - - 5 5 u=3 - 3 3 3 3 0 3 u=2 - - - - 3 3 u=1 - - - 2 2 2 u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 201 Problema da mochila u=4 - - - 5 5 u=3 - 3 3 3 3 0 5 3 u=2 - - - - 3 3 u=1 - - - 2 2 2 u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 202 Problema da mochila u=4 - - - 5 5 u=3 - 3 3 3 3 5 u=2 - - - - 3 3 u=1 - - - 2 2 2 u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 203 Problema da mochila u=4 - - - 5 5 0 3 u=3 - 3 3 3 3 5 u=2 - - - - 3 3 u=1 - - - 2 2 2 u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 204 Problema da mochila u=4 - - - 5 5 0 6 3 u=3 - 3 3 3 3 5 u=2 - - - - 3 3 u=1 - - - 2 2 2 u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 205 Problema da mochila u=4 - - - 5 5 6 u=3 - 3 3 3 3 5 u=2 - - - - 3 3 u=1 - - - 2 2 2 u=0 0 0 0 0 0 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 206 Problema da mochila u=4 - - - 5 5 6 y5(4) = 6 u=3 - 3 3 3 3 5 y5(3) = 5 u=2 - - - - 3 3 y5(2) = 3 u=1 - - - 2 2 2 y5(1) = 2 u=0 0 0 0 0 0 0 y5(0) = 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 207 Problema da mochila u=4 - - - 5 5 6 y5(4) = 6 u=3 - 3 3 3 3 5 y5(3) = 5 u=2 - - - - 3 3 y5(2) = 3 u=1 - - - 2 2 2 y5(1) = 2 u=0 0 0 0 0 0 0 y5(0) = 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 208 Problema da mochila u=4 - - - 5 5 6 y5(4) = 6 u=3 - 3 3 3 3 5 y5(3) = 5 u=2 - - - - 3 3 y5(2) = 3 u=1 - - - 2 2 2 y5(1) = 2 u=0 0 0 0 0 0 0 y5(0) = 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 209 Problema da mochila x5=1 u=4 - - - 5 5 6 y5(4) = 6 u=3 - 3 3 3 3 5 y5(3) = 5 u=2 - - - - 3 3 y5(2) = 3 u=1 - - - 2 2 2 y5(1) = 2 u=0 0 0 0 0 0 0 y5(0) = 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 210 Problema da mochila x4=1 x5=1 u=4 - - - 5 5 6 y5(4) = 6 u=3 - 3 3 3 3 5 y5(3) = 5 u=2 - - - - 3 3 y5(2) = 3 u=1 - - - 2 2 2 y5(1) = 2 u=0 0 0 0 0 0 0 y5(0) = 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 211 Problema da mochila x3=1 x4=1 x5=1 u=4 - - - 5 5 6 y5(4) = 6 u=3 - 3 3 3 3 5 y5(3) = 5 u=2 - - - - 3 3 y5(2) = 3 u=1 - - - 2 2 2 y5(1) = 2 u=0 0 0 0 0 0 0 y5(0) = 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 212 Problema da mochila x2=0 x3=1 x4=1 x5=1 u=4 - - - 5 5 6 y5(4) = 6 u=3 - 3 3 3 3 5 y5(3) = 5 u=2 - - - - 3 3 y5(2) = 3 u=1 - - - 2 2 2 y5(1) = 2 u=0 0 0 0 0 0 0 y5(0) = 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 213 Problema da mochila x1=0 x2=0 x3=1 x4=1 x5=1 u=4 - - - 5 5 6 y5(4) = 6 u=3 - 3 3 3 3 5 y5(3) = 5 u=2 - - - - 3 3 y5(2) = 3 u=1 - - - 2 2 2 y5(1) = 2 u=0 0 0 0 0 0 0 y5(0) = 0 k=0 k=1 k=2 k=3 k=4 k=5 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 214 Problema da mochila • Os estados em verde e as transições possíveis (arcos com setas) definem um grafo multiestágio para a aplicação da recursão de programação dinâmica. • Número de operações (tempo de processamento) diretamente proporcional ao produto do tamanho da mochila pelo número de variáveis (preencher inteiramente a matriz de dimensões (b+1)x(n+1)): aplicabilidade limitada aos valores de n e de b • Caso seja possível levar múltiplas cópias de cada item, aumenta o número de decisões e a complexidade do problema. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 215 Algoritmos pseudopolinomiais • Calcular: yj(u): lucro máximo que pode ser obtido carregando-se um peso igual a u usando apenas objetos do conjunto {1,..., j} • Recursão: yj-1(k) yj(k) = max yj-1(k-aj) + cj Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 216 Algoritmos pseudopolinomiais y(0,0) 0; para k = 1 até b faça y(k,0) - ; para j = 1 até n faça início para k = 0 até aj–1 faça y(k,j) y(k,j-1); para k = aj até b faça y(k,j) max {y(k,j-1),f(k-aj,j-1) + cj} fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 217 Algoritmos pseudopolinomiais T(n) = O (b) + n · O (b) T(n) = O (n · b) Tamanho da entrada Valor do maior dado na entrada Diz-se que um algoritmo é pseudopolinomial se sua complexidade de pior caso é um polinômio no tamanho da entrada e no valor do maior dado de entrada Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 218 Caixeiro viajante • Grafo orientado com n nós • Distâncias dij S { 2, 3, ..., n} kS C(S,k) = Setembro 2004 custo ótimo de sair do nó 1, visitar todos as cidades de S uma única vez, terminar na cidade k. Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 219 Caixeiro viajante • Início: calcular C(S,k) para |S| = 1, k = 2, ..., n Ck, k d1k • Cálculo de C(S,k) para |S| > 1: a melhor maneira de sair do nó 1, visitar todos os nós de S e retornar a k é considerar visitar m imediatamente antes de k, para cada m, considerando C(S-{k}, m) calculado anteriormente: C s, k minC S k , m d mk m S k Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 220 Caixeiro viajante • Calcular para todos S de dado tamanho e para cada possível nó m em S. • Complexidade: n 1 k (k 1) k 2 k mS adições n n n 1 escolher k dentre n 1 n 1 n k 2 k O n 2 2n n 1 2 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 221 Definições recursivas ou indutivas • Definição recursiva: uma classe de objetos relacionados é definida em termos dos próprios objetos. • Uma definição recursiva envolve uma base (em que um ou mais objetos simples/elementares são definidos) e um passo indutivo (em que objetos maiores são definidos em termos dos objetos menores já definidos). Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 222 Definições recursivas ou indutivas fat(n) = 1 • 2 • ... • n Definição recursiva: Base: 1! = 1 Indução: n! = n • (n – 1)! nº uso do passo indutivo 2º uso do passo indutivo 1º uso do passo indutivo Base Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 223 Definições recursivas ou indutivas • Expressões aritméticas são naturalmente definidas de forma recursiva: Base especificar os operandos atômicos (variáveis, etc.) • Base: variáveis / inteiros/ reais • Indução: Se E1 e E2 são expressões, então: (E1 + E2), (E1 – E2), (E1 • E2), (E1 / E2) e (-E1) também são expressões aritméticas. +•/ Setembro 2004 Operadores binários Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 224 Procedimentos recursivos • Chamados de seu interior • Programas recursivos são freqüentemente mais sucintos ou mais fáceis de serem entendidos. – Base: entrada particular que pode ser resolvida pela base da indução – Parte Indutiva: chamadas recursivas sucessivas ao próprio procedimento Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 225 Procedimentos recursivos function fat (n: integer): integer; início se n 1 então fat 1 senão fat n · fat (n-1) fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 226 Procedimentos recursivos Call fat(4) Call fat(3) Call fat(2) return 24 fat(4) return 6 fat(3) return 2 fat(2) Call return 1 fat(1) Base: T(1) = O(1) Indução: T(n) = O(1) + T(n-1) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro n>1 227 Procedimentos recursivos • É essencial que a indução faça apenas chamadas envolvendo argumentos de menor tamanho e que a base seja sempre necessariamente atingida. SelectionSort 1) Obter menor elemento da cauda do vetor A[i...n] 2) Trocá-lo por A[i] 3) Ordenar o vetor A[i+1... n] • Base: Se i = n, só existe um elemento a ser ordenado. • Indução: Se i < n, obter min {ai, ..., an}, trocá-lo com ai e ordenar recursivamente {ai +1, ... an} Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 228 Procedimentos recursivos procedure SelectionSort (var A: intarray; i, n: integer); var j,smaller, temp: integer; início se i < n então início smaller i; para j i + 1 até n faça se A[j] < A[smaller] então início smaller j; temp A[smaller]; A[smaller] A[i]; A[i] temp; SelectionSort (A,i+1,n) fim T(n) = O(1) + O(n) + T(n-1) fim T(1) = O(1) fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 229 Procedimentos recursivos • Análise de procedimentos recursivos: 1. Definir Tp(n) = tempo de processamento de P em função do tamanho n de seus argumentos. 2. Estabelecer uma relação de recorrência que relacione Tp(n) com outras funções TQ(k) para outros procedimentos Q com argumentos de tamanho k. 3. Escolher uma noção de tamanho de argumento que garanta que os procedimentos são chamados recursivamente com argumentos progressivamente menores com o avanço da recursão. Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 230 Procedimentos recursivos • Quando o argumento se torna suficientemente pequeno, não são feitas novas chamadas recursivas: caso base da definição indutiva de Tp(n) • Enquanto o argumento não se torna suficientemente pequeno, chamadas recursivas podem ocorrer com argumentos menores • Tp(n) é obtido pelo exame do código a) call Q tempo de execução TQ(k) b) avaliar o corpo de P com as técnicas já conhecidas, deixando termos como TQ(k) como incógnitas: duas expressões para o tempo de P (caso base e parte indutiva) c) Substituir O(f(n)) por c·f(n) + d d) Resolver a equação de recorrência Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 231 Procedimentos recursivos procedure SelectionSort (var A: intarray; i, n: integer); var j,smaller, temp: integer; Base (i = n): apenas um início elemento a ordenar se i < n então início Indução (i < n): obter o smaller i; menor elemento em para j i + 1 até n faça A[i...N], colocá-lo em se A[j] < A[smaller] então A[i] e ordenar A[i+1... N] início smaller j; temp A[smaller]; A[smaller] A[i]; A[i] temp; SelectionSort (A,i+1,n) fim fim fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 232 Procedimentos recursivos T(1) = O(1) = a T(n) = O(n) + T(n-1) b.n T(1) = a T(n) = b.n + T(n-1) T(2) = 2b + a T(3) = 3b + 2b + a = 5b + a T(4) = 4b + 5b + a = 9b + a T(n) = n k .b a k 2 n b k a k 2 2n b (n 1) a 2 O(n 2 ) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 233 Procedimentos recursivos Voltando ao cálculo do fatorial: Base: T(1) = O(1) Indução: T(n) = O(1) + T(n-1) n>1 T(1) = a T(n) = b + T(n-1) n>1 T(1) = a T(2) = T(1) + b T(3) = T(2) + b = T(1) + 2b T(4) = T(3) + b = T(1) + 3b T(n) = T(1) + (n-1) · b T(n) = a + (n-1)·b = O(n) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 234 Merge sort • Algoritmo recursivo baseado em listas, utilizando a técnica de divisão-e-conquista. • Princípio de divisão para conquistar: – Dividir a lista em duas listas do mesmo tamanho – Ordenar cada uma das duas listas – Fazer o merge das duas listas ordenadas Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 235 235 Merge sort Lista 1 Merge Lista 2 1 1 2 2 2 4 7 2 7 7 4 8 9 7 7 7 8 9 Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 236 236 Merge sort Merge Lista 1 1 2 … 2 4 … Lista 2 Mergeados recursivamente Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 237 237 Merge sort Call 1 (2 2 4 7 7 7 8 9) merge(1 2 7 7 9, 2 4 7 8) merge(2 7 7 9, 2 4 7 8) merge(7 7 9, 2 4 7 8) merge(7 7 9, 4 7 8) merge(7 7 9, 7 8) merge(7 9, 7 8) merge(9, 7 8) 2 ( 2 4 7 7 7 8 9) 2 (4 7 7 7 8 9) 4 (7 7 7 8 9) 7 (7 7 8 9) 7 (7 8 9) 7 (8 9) merge(9, 8) 8 (9) merge(9, NIL) 9 Return Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 238 238 Merge sort Lista 1 4 6 8 4 1 8 4 12 L4 L24 10 12 14 5 nil L8 > L24 L8 > L28 24 Lista 2 Setembro 2004 28 3 nil 24 26 28 30 2 3 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 8 239 239 Merge sort type cell=record element : integer next : listType function merge (lista1, lista2: listType) : listType início se lista1=NIL então merge lista2 type listType=^cell senão se lista2=NIL então merge lista1 senão se lista1^.elemento lista2^.elemento então lista1^.next merge(lista1^.next, lista2) merge lista1 else lista2^.next merge(lista1, lista2^.next) merge lista2 fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 240 240 Merge sort function split (lista: listType) : listType Var second cell: listType início se lista=NIL então split NIL senão se lista^.next=NIL então split NIL senão second cell list^.next list^.next second cell^.next second cell^.next split(second cell^.next) split second cell fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 241 241 Complexidade de Merge sort Merge n=n1+n2 T(n)=? lista1=NIL ou lista1=NIL O(1) T(n)=O(1)+T(n-1) T(n)=O(n) (percorre a lista) Split n: tamanho da lista lista1=NIL ou lista1^.next=NIL O(1) T(n)=O(1)+T(n-2) T(0)=a T(1)=b T(n)=c + T(n-2) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 242 242 Complexidade de Merge sort T(0) = a T(1) = b T(1) = b T(2) = c + a T(3) = c + b T(4) = c + ( c + a ) = 2c + a T(5) = c + ( c + b ) = 2c + b T(6) = 3c + a T(7) = 3c + b n par: T(n) = ( n/2 ) · c + a n ímpar: T(n) = ( (n-1)/2 ) · c + b T(n) = O(n) Chama-se split recursivamente n/2 vezes, cada vez com cálculos O(1) Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 243 243 Merge sort program sort (input, output) const max = 100 type cell = record elemento: integer next: listType end listType=^cell var A: array [1…max] of integer k, n: integer list: listType procedure merge sort (var list: listType) function merge (lista1, lista2: listType): listType function split (list: listType) : listType Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 244 244 Merge sort function makeList (i, n: integer) : listType var new cell: listType início se i > n então makeList NIL else new(newCell) newCell^.next makeList(i+1, n) newCell^.element A[i] makeList newCell fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 245 245 Merge sort procedure printList (list: listType) início se list = NIL então return else write(list^.element) printList(list^.next) fim início readln(n) para k 1 até n faça read(A[k]) list makeList(1, n) mergeSort(list) printList(list) fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 246 246 Merge sort procedure mergeSort(var list: listType) var secondList: listType início se list <> NIL então se list^.next <> NIL então secondList split(list) mergeSort(list) mergeSort(secondList) list merge(list, secondList) fim Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 247 247 Merge sort list NIL ou list^.next NIL n: tamanho da lista O(1) base: T(1) = O(1) indução: T(n) = O(1) + O(n) + T(n/2) + T(n/2) + O(n) T(1) = O(1) = a T(n) = O(n) + 2 · T(n/2) = b · n + 2 · T(n/2) T(2) = 2a + 2b T(4) = 4a + 8b T(8) = 8a + 24b T(16) = 16a + 64b T(n) = n · a + (n · log2n) · b Setembro 2004 T(n)=O(n log n) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 248 248 Torres de Hanoi Setembro 2004 A A B B A C A C A B X Y Z Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 249 249 Torres de Hanoi A Setembro 2004 A B A B C B C D C D X Y Z Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 250 250 Torres de Hanoi • Repetir n passos 1 e 2 abaixo até que os discos estejam corretamente empilhados: 1. Mover o menor disco do suporte “corrente” para o seguinte no … 2. Fazer o único movimento possível que não envolva o menor disco A Setembro 2004 A B A B C B C D C D X Y Z Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 251 251 Torres de Hanoi n-1 n-1 n N n-1 N X Y Z Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 252 252 Torres de Hanoi hanoi (n, x, y, z) início mover n discos de x para y usando z xy se n =1 então xy senão T(n) = O(1) + T(n-1) hanoi(n-1, x, z, y) T(n) = 1 + T(n-1) xy hanoi(n-1, z, y, x) T(n) = 1 + 2 T(n-1) fim T(n) = O(1) b Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro n>1 n=1 253 253 Torres de Hanoi T n 2 T n 1 a T n 2 2 T n 2 a a T (n) 2 2 T n 2 a 21 a T (n) 2 2 2 T n 3 a T (n) 23 T n 3 a 2 2 a 21 a T (n) 2 2 T n 4 a 3 T n 2 T (n) 2 4 T n 4 a 23 a 2 2 a 21 a k n 1 n2 j T (1) 2 a j 0 2 k 1 1 2 a 1 j 0 j T n b 2 n 1 2 n 1 1 a T n 2 n 1 2 n 1 1 O (1) T n O 2 n Setembro 2004 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro 254 254