2.59k likes | 2.82k Views
Parte 3. Técnicas de projeto de algoritmos. Técnicas de projeto de algoritmos. Divisão e conquista Algoritmos gulosos Programação dinâmica Caminhamento em grafos Heurísticas. Divisão e conquista. Divisão e conquista. Princípio básico :. function DC (x)
E N D
Parte 3 Técnicas de projeto de algoritmos
Técnicas de projeto de algoritmos • Divisão e conquista • Algoritmos gulosos • Programação dinâmica • Caminhamento em grafos • Heurísticas Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Divisão e conquista Princípio básico: function DC (x) se {x é suficientemente pequeno ou simples} então return ADHOC(x) senão decompor x em x1, x2, …, xK para i= 1 até K faça yi DC (xi); recombinar os yi para obter y return y Pesquisa binária Merge Sort Top down Recorrente Balanceamento Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Máximo e mínimo Entrada: a1,, a2, …, an Saída: MIN, MAX com: MIN min { a1, a2, … , an } MAX= max{ a1, a2, … , an } trivial: determinar MIN: (n-1) comparações determinar MAX: (n-1) comparações 2n-2 comparações melhorado: MIN, MAX a1 para i = 2 até n faça se ai > MAX então MAX ai senão se ai < MIN então MIN ai melhor caso: ai n-1 comparações pior caso: ai 2n-1comparações Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Máximo e mínimo procedure MaxMin(i, j, fmax, fmin) integer i, j global n, A(1:n) case : i=j fmax, fmin A(i) : i=j-1 se A(i) < A(j) então fmax A(j) fmin A(i) else fmax A(i) fmin A(j) : else meio (i+j)/2 MaxMin(i, meio, gmax , gmin) MaxMin(meio+1, j, hmax , hmin) fmax max(hmax , gmax) fminmin(hmin , gmin) endcase T(n) = O(1) + 2·T(n/2) T(n) = O(n) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Divisão e conquista Pesquisa binária max min Multiplicação de polinômios Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Divisão e conquista mergesort multiplicação de polinômios Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema de seleção ai x ai x Dado um vetor a1, a2, …, an obter o k-ésimo menor elemento • ordenação: O(n log n) + O(k) • k pequeno: O(k·n) • É possível fazer melhor do que isso? Reorganizar o vetor a em relação a um pivô x: Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema de seleção A x p r partition(A, p, r, x) i p-1 j r+1 enquanto TRUE faça repita j j -1até que A[j] x repita i i+1até que A[i] x se i < j então troca A[i] ↔ A[j] senão retornar j fim Complexidade: O(n) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Exemplo: A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] 5 3 2 6 4 1 3 7 1 6 5 3 j A[j] 5 j A[j] 5 j A[j] 5 j A[j] 5 i A[i] 5 i A[i] 5 i A[i] 5 i A[i] 5 i A[i] 5 j i X = 5 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema de seleção P1 P2 X X • Determinar o k-ésimo menor elemento: • Se |P1| k procurar o k-ésimo em P1 • Se |P1| k procurar o k-|P1| ésimo em P2 • usar o algoritmo de partição Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema de seleção Select(k,n): • Dividir os n elementos em n/5 grupos de 5 elementos cada. • Extrair a mediama de cada um dos n/5 grupos de 5 elementos cada. • Extrair recursivamente a mediana das n/5 medianas usando select: Select (n/10,n/5). Seja x esta mediana: Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema de seleção X m2 m5 m6 m7 m1 m3 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema de seleção • Particionar os dados de entrada utilizando x como pivô usando o algoritmo partition • Sejam b1 e b2 o número de elementos em cada partição.Se k b1: aplicar select para obter o k-ésimo da 1aparte Se k > b1: aplicar select para obter o (k-b1)-ésimo da 2a parte(recursivamente) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de polinômios Polinômio de grau n-1 tem n termos Entrada: p(x) e q(x) têm tamanho n Saída : r(x)=p(x)·q(x) “força bruta”: para i = 0 até 2n-2 faça r(i) 0; para i = 0 até n-1 faça para j= 0 até n-1 faça r(i+j) r(i+j) + p(i)·q(j); T(n) = O(n2) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de polinômios Idéia: substituir “·” por “+” n=2k p(x) + q(x) O(n) p(x) · q(x) O(n2), computacionalmente mais caro Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de polinômios | b1 | b0 | a0b1 a1b1 b0 + b1 a0b0 a1b0 a0 a1 a0+a1 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de polinômios 4 multiplicações 1 adição Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de polinômios Complexidade: É necessário resolver menos de quatro problemas Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de polinômios Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de polinômios Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de polinômios Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de matrizes Multiplicação de matrizes Hipótese: n=2k Particionar A e B em quatro submatrizes n/2 x n/2 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de matrizes Multiplicação de matrizes A · B: oito multiplicações de matrizes (n/2) Adicionar duas matrizes n/2 x n/2: O(n2) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de matrizes Aumentar o número de adições de matrizes para diminuir o número de multiplicações: método de Strassen 7 multiplicações 18 adições Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Multiplicação de matrizes Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema do par mais próximo • Problema do par mais próximo: dados n pontos no plano com coordenadas (xi, yi), i=1,…n, obter o par de pontos mais próximo • “Força bruta”: calcular todas as n(n-1)/2 distâncias: O(n2) É possível fazer melhor do que isso? • Ordenar todos n pontos pelas coordenadas xi O(n log n) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema do par mais próximo • Separar os pontos em duas metades, de acordo com a ordenação pelas coordenadas xi • P1 P2 • d1: menor distância entre pontos de P1 • d2: menor distância entre pontos de P2 • Verificar se existe A1 P1 e A2 P2 tais que: • d(A1,A2) = d < min{d1,d2} • d1 e d2 podem ser calculados recursivamente. • Falta calcular d = min {d(A1,A2): A1 P1 e A2 P2}. Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema do par mais próximo d2 d1 P1 P2 T(n) = 2.T(n/2) + O(n) T(n) = O(n log n) Como calcular d em O(n)? = min {d1,d2} Só é necessário calcular d se d < . • Só é necessário examinar uma faixa de pontos a distância da reta vertical que separa P1 e P2. Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema do par mais próximo • Muitos pontos são eliminados, mas no pior caso podem restar O(n) pontos nesta faixa: o cálculo de d continuaria O(n2). • É possível mostrar que na média há na média. para i =1 até #pontos_na_faixa-1 faça para j = i+1 até #pontos_na_faixa-1 faça se d(pi, pj) < então d(pi, pj) Como melhorar? Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema do par mais próximo • As coordenadas y dos dois pontos que definem d diferem por no máximo , senão d > . • Se os pontos na faixa estão ordenados em ordem crescente pelas coordenadas y, se d(pi,pj) > pode-se abandonar a análise de pi e passar-se a pi+1. • Hipótese: pontos na faixa ordenados por yi. para i =1 até #pontos_na_faixa-1 faça para j = i+1 até #pontos_na_faixa-1 faça se |yi - yj| > então examinar pi+1 e sair do loop interno senão se d(pi,pj) < então d(pi, pj) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema do par mais próximo i • Não pode haver mais do que oito pontos no retângulo x . • Um deles é o ponto sendo examinado. • Verificar no máximo sete pontos: pode ser feito em O(1). Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema do par mais próximo Algoritmo 1: • Ordenar os pontos pelas coordenadas x. • Dividir o conjunto em duas partes P1 e P2. • Recursivamente calcular as distâncias d1 e d2. • Fazer ← min {d1,d2}. • Eliminar os pontos a uma distância superior a da linha de separação. • Ordenar os pontos na faixa de acordo com as coordenadas y. • Investigar os pontos na ordem e computar a distância de cada um deles a no máximo sete vizinhos. Se alguma distância for menor do que , então atualizar . T(n) = O(n log n) + 2.T(n/2) + O(1) + O(n) + O(n log n) + O(n) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema do par mais próximo Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema do par mais próximo Algoritmo 2: • Ordenar os pontos pelas coordenadas x. • Dividir o conjunto em duas partes P1 e P2. • Recursivamente: • Calcular as distâncias minímas d1 e d2. . • Ordenar os pontos em P1 e P2 segundo as coordenadas y. • Combinar as duas listas ordenadas em uma única • Fazer ← min {d1,d2}. • Eliminar os pontos a uma distância superior a da linha de separação. • Investigar os pontos na ordem e computar a distância de cada um deles a no máximo sete vizinhos. Se alguma distância for menor do que , então atualizar . T(n) = 2.T(n/2) + O(n) = O(n log n) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Algoritmos gulosos • Problema de otimização • Extensões sucessivas de soluções parciais • Sempre escolhe a extensão viável que propicia o maior ganho (“gula”) • Otimalidade nem sempre garantida • Sistema de subconjuntos: matróide • Algoritmos simples e eficientes • Análise de complexidade: simples Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Cobertura por nós mínima maior grau (guloso) ordem dos vértices divisão e conquista 2 2 2 2 1 3 1 3 1 3 1 3 4 4 4 4 5 5 5 5 |S| = 3 |S| = 4 |S| = 2 • Grafo não-orientado G(V, E): obter S V tal que: • {u, v} E então uS ou vS • |S| é mínima Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Cobertura por nós mínima Solução gulosa Solução ótima • O algoritmo guloso obtém necessariamente a solução ótima? Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Cobertura por nós mínima • O algoritmo guloso obtém necessariamente a solução ótima? grau 1 n+2 nós n+2 nós grau n+1 grau n+2 n nós A solução pode ser muito ruim! Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Armazenamento em fita • Entrada: L (l1, l2, …, ln) vetor com comprimentos de narquivos a serem armazenados em uma fita suficientemente extensa • Saída: (j, li(j)) para j=1, …, n • i(j)é o índice do j-ésimo arquivo na fita Determinar a ordem de armazenamento dos arquivos na fita, de modo a minimizar o tempo médio TMR (ou total) de recuperação de um arquivo. Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Armazenamento em fita 7 3 5 2 … 7 3 2 5 … Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Armazenamento em fita 2 3 5 7 … • Armazenar arquivos em ordem crescente de tamanhos • Algoritmo auxiliar: ordenar o vetor em O(n log n) Mostrar que o algoritmo é correto Numa solução ótima não existe Supondo-se que existisse: Trocando: B-A? Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Armazenamento em fita a troca diminuiria o custo. Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema da mochila em qualquer solução ótima Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema da mochila Exemplo: Objeto Ganho Volume 1 25 18 2 24 15 3 15 10 total 64 43 Volume disponível na mochila = 20 • Guloso 1: maior ganho primeiro • Guloso 2: menor volume primeiro • Guloso 3: maior densidade primeiro (densidade = ganho/volume) Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema da mochila É permitido fracionar os objetos • guloso 1: ganhos decrescentes • x1: fração do objeto 1 x1 = 1 • volume residual = 20 - 18 = 2 • 15·x2 = 2 x2 = 2/15 • valor total: 25 + 2/15 · 24 = 28.2 • x1 x2 x3 ganho • 2/15 0 28.2 • 4/9 4/5 0 30.3 Enche a mochila muito rapidamente! Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema da mochila x1 x2 x3 valor 1 2/15 0 28.2 4/9 4/5 0 30.3 0 2/3 1 31.0 0 4/5 4/5 31.2 0 1 1/2 31.5 guloso 1 guloso 2 guloso 3 • i ci ai ci/ai • 25 18 ~1.38 3 • 2 24 15 1.60 1 • 3 15 10 1.50 2 • b=20 Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro
Problema da mochila Provar que a solução do guloso com o terceiro critério é ótima: • Ordenar os objetos em ordem decrescente das razões cj/aj • Solução gulosa: (1, 1, 1, …, 1, gj, 0,…, 0, 0) • Diminuir o valor de uma variável em A aumentar uma variável em B Projeto e Análise de Algoritmos - Celso Carneiro Ribeiro