Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista (2.1-2.2) DECOM/UFOP 2013/1– 5º. Período Anderson Almeida Ferreira Adaptado do material desenvolvido por Andréa Iabrudi Tavares BCC241/2012-2 Estratégias para problemas tratáveis • Estruturas de Dados ▫ Use uma estrutura adequada • Espaço por Tempo ▫ Gaste mais espaço para economizar tempo • Algoritmos Probabilísticos ▫ Use aleatoriedade para conseguir eficiência • Dividir para conquistar (top-down) ▫ Divida em subproblemas semelhantes e disjuntos, resolva e combine • Programação Dinâmica (bottom-up) ▫ Comece com subproblemas e componha um maior, reusando solução de subproblemas compartilhados • Algoritmos Gulosos ▫ Sempre pegue o “melhor” Ordenação: Um problema, vários algoritmos • Recursão: Inserção • Dividir-para-conquistar: MergeSort e QuickSort • Estrutura de dados: HeapSort • Tempo por espaço: Counting Sort Torre de Hanoi Recursão: Diminuir para conquistar Recursão: Equação de Recorrência Recursão: Análise Tempo de Execução Dividir para Conquistar (Divide and Conquer) • Problema (instância) pode ser dividido em subproblemas menores (parecidos e independentes) que são resolvidos recursivamente e combinados. ▫ Análise por equação de recorrência Dividir para Conquistar • Diminuir complexidade (em geral de linear para logarítmico) de algoritmos polinomiais ▫ ▫ ▫ ▫ Busca Ordenação Multiplicação Exponenciação • Apresentar melhor função de complexidade de pior caso ▫ Mínimo/máximo Busca Sequencial function BuscaSequencial(A,x,e,d) //Entrada: sub-vetor A[e..d] //Saída: x pertence ao sub-vetor 1. i = e; 2. while (i≤d) & (A[i]≠x) 3. i = i +1; 4. return (i ≤ d); Lembre-se, nada sendo dito, utilizaremos sempre análise assintótica de pior caso! Busca Sequencial com Vetor Ordenado function BuscaSequencial2(A,x,e,d) //Entrada: sub-vetor A[e..d] ordenado //Saída: x pertence ao sub-vetor 1. i = e; 2. while (i≤d) & (A[i]≤x) 3. i = i +1; 4. if (i ≤ d): return (A[i]==x); Busca Sequencial Recursiva function BuscaSequencialRec(A,x,e,d) //Entrada: sub-vetor A[e..d] ordenado //Saída: x pertence ao sub-vetor 1. if (e = d): return (A[e]= x); 2. if (A[e]=x): 3. return true; 4. else: 5. if (A[e]>x): 6. return false; 7. else: 8. return BuscaSequencialRec(A,x,e+1,d); D&C: Busca Binária function BuscaBinária(A,x,e,d) //Entrada: sub-vetor A[e..d] ordenado //Saída: x pertence ao sub-vetor 1. 2. 3. 4. 5. 6. 7. 8. 9. if (e = d): return (A[e]= x); m =(e+d)/2; if (A[m]= x): return true; else: if (A[m]> x): return BuscaBinária(A,x,e,m-1); else: return BuscaBinária(A,x,m+1,d); D&C: Passos • Divida ▫ problema em subproblemas menores • Conquiste ▫ resolva recursivamente cada subproblema OU ▫ limite de tamanho: use outro método • Combine ▫ soluções de subproblemas para resolver problema D&C: Meta-algoritmo function DividirConquistar(P) //Entrada: problema P //Saída: solução S para P 1. if (ÉPequeno(P)): 2. S = ResolvePequeno(P); 3. else: 4. Divida(P, P1, … , Pa); 5. for i=1..a: 6. Si = DividirConquistar(Pi); 7. S = Combine(S1,…,Sa); 8. return S; Multiplicação de Inteiros Grandes • x e y de n bits • n multiplicações de 1-n bit • n somas de n-n bits Custo: Θ(n2) Multiplicação de Inteiros Grandes • Podemos fazer melhor usando D&C? ▫ Como dividir? ▫ Como combinar? ▫ Quanto custa? Custo: Θ(n2) D&C para Multiplicação • Gauss em no século XVIII e Karatsuba em 1962: D&C Multiplicação: algoritmo Parada recursão Divide Conquiste: Recursão Combine D&C Multiplicação: Complexidade T (n) nlog2 3 n1.585 D&C Multiplicação - Análise BCC241/2011-2 Forma Geral de Recursão n T n aT f (n) b Custo local da função Número de subproblemas Tamanho dos subproblemas 23 BCC241/2011-2 Árvore de recursão 24 BCC241/2011-2 Teorema Mestre: intuição • A cada nível k da recursão, qual o total de trabalho? • Complexidade é o somatório ▫ Primeiro ou último termos se forem diferentes ▫ Se iguais, multiplica pelo número de termos. 25 BCC241/2011-2 Teorema Mestre – forma simplificada 26 D&C Ordenação: MergeSort • Von Neumann (1945) BCC241/2011-2 D&C: MergeSort 28 BCC241/2011-2 MergeSort: Exemplo Divida/Conquiste C o m b i n e 29 MergeSort: Complexidade Quanto custa? T (n) n log n 34 Seleção (Mediana) • Entrada: Lista de n números S e inteiro k • Saída: k-ésimo menor elemento de S • Qual a complexidade? ▫ Mínimo: Θ(n) ▫ Ordenação: Θ(n log n) • Importância da aleatoriedade (outro paradigma de projeto). 35 D&C Seleção: dividindo... v Partição <= v =v >= v k v <= =v >= v <= v k=v >= v <= v =v k >= v 36 D&C Seleção: conquistando… BCC241/2011-2 Seleção: Algoritmo 37 38 D&C Seleção: Complexidade Quanto custa? Tamanhos das listas dependem do pivô v. Como escolher???? 39 D&C Seleção: Complexidade • Melhor caso: partições sempre balanceadas… ▫ Oráculo 40 D&C Seleção: Complexidade • Pior caso: partição diminui somente de 1… ▫ Primeiro elemento, achar o máximo e lista ordenada. BCC241/2011-2 D&C e Probabilístico: Seleção • Escolher o pivô aleatoriamente… • Ideal: divide no meio ▫ Custo: ▫ Probabilidade (se todos diferentes): • Boa: divide em no mínimo ¾ ▫ Custo: ▫ Probabilidade: ???? 41 BCC241/2011-2 D&C e Probabilístico: Seleção • Boa: divide em no mínimo ¾ ▫ Probabilidade de v estar no 2o. ou 3o. quartil 42 BCC241/2011-2 D&C e Probabilístico: Seleção • Boa: divide em no mínimo ¾ ▫ Probabilidade de v estar no 2o. ou 3o. Quartil P[v dividir em ¾] = 0.5 • Qual o número esperado de escolhas para conseguir uma boa? ▫ Número de jogadas até dar cara… E[número de escolhas até dividir em ¾] = 2 43 BCC241/2011-2 D&C Seleção Aleatório: Complexidade Tempo esperado para n é menor que o tempo esperado para reduzir a 3n/4 e depois resolver 44 BCC241/2011-2 D&C Ordenação: QuickSort • Hoare 1962 46 BCC241/2011-2 D&C: QuickSort 47 Quanto custa? Depende da escolha do pivô!!!!!! Sabemos, contudo, que escolha aleatória provê, em número esperado de duas pivotações, a divisão em 3n/4 . 48 MergeSort e QuickSort Fase MergeSort QuickSort Dividir O(1) O(n) Conquistar 2T(n/2) T(k) T(n-k) Combinar O(n) O(1) 49 D&C: resumo • Problemas menores (fração), independentes e não-sobrepostos • Divisão e combinação são partes não-recursivas ▫ Algoritmos tendem a tornar uma das duas mais complicada ▫ Mergesort, Quicksort • Importante definir o que é pequeno ▫ Parada de recursão (multiplicação de números) 51 D&C: Exercícios • Calcular x em (log n) passos. n 53 Outros exemplos interessantes • • • • • • RSA Fast Fourier Transform Caixa convexa Par de pontos mais próximo Mínimo e máximo Fibonacci BCC241/2011-2 54 Teorema Mestre – forma geral n T n aT f (n), a 1, b 1, f (n) 0 b logb a logb a 1. f (n) O n , 0 T ( n) n 2. f (n) n 3. f (n) n onde logb a log n T (n) n logb a log n logb a c 1 , 0, af (n / b) cf (n) T (n) f (n), BCC241/2011-2 Teorema Mestre: Aplicação Mecânica • • • • Identifique a, b, f(n) Calcule grau = log_b (a) Compare n^grau e f(n) Encontre o maior 55 BCC241/2011-2 Exemplos de Teorema Mestre • T(n) = 9T(n/3)+n • T(n) = T(2n/3)+1 • T(n) = 3T(n/4)+n log n 56 57 Quando não se aplica? function fatorial( n) return n * fatorial(n-1); 1 n 1 T ( n) 1 T (n 1) n 1 Teorema Mestre: Quando não se aplica n T n aT f (n), a 1, b 1, f (n) 0 b 1. f (n) O n logb a , 0 T (n) n logb a 2. f (n) n 3. f (n) n logb a log logb a Polinomialmente n menor T ( n) n logb a log n , 0, af (n / b) cf (n) T (n) f (n) Regularidade Condição de regularidade violada n T n T n sin n 2 2 2 f n n