1 / 28

Análise e Síntese de Algoritmos

Análise e Síntese de Algoritmos. Algoritmos Greedy CLRS, Cap. 16. Resumo. Algoritmos Greedy: Um primeiro exemplo Problema de Selecção de Actividades Características das abordagens greedy Exemplo: Problema da Mochila Exemplo: Minimizar Tempo no Sistema

dougal
Download Presentation

Análise e Síntese de Algoritmos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Análise e Síntese de Algoritmos Algoritmos Greedy CLRS, Cap. 16

  2. Resumo • Algoritmos Greedy: • Um primeiro exemplo • Problema de Selecção de Actividades • Características das abordagens greedy • Exemplo: Problema da Mochila • Exemplo: Minimizar Tempo no Sistema • Um exemplo final: Códigos de Huffman Análise e Síntese de Algoritmos

  3. Técnicas para Síntese de Algoritmos • Dividir para conquistar • Programação dinâmica • Algoritmos greedy • Estratégia: a cada passo da execução do algoritmo escolher opção que localmente se afigura como a melhor para encontrar solução óptima • Estratégia permite obter solução óptima? • Exemplos: • Kruskal, Prim, Dijkstra, etc. Análise e Síntese de Algoritmos

  4. Exemplo: Selecção de Actividades • Seja S = { 1, 2, …, n } um conjunto de actividades que pretendem utilizar um dado recurso • Apenas uma actividade pode utilizar recurso de cada vez • Actividade i: • tempo de início: si • tempo de fim: ti • execução da actividade durante [si, ti) • Actividades i e j compatíveis apenas se [si, ti) e [sj, tj) não se intersectam • Objectivo: encontrar conjunto máximo de actividades mutuamente compatíveis Análise e Síntese de Algoritmos

  5. Exemplo (Cont.) • Admitir que f1 f2 …  fn • Escolha greedy: • Escolher actividade com o menor tempo de fim • Porquê? • Maximizar espaço para restantes actividades serem realizadas function Selecionar_Actividades_Greedy(s,f) n = length[s] A = { 1 } j = 1 for i = 2 to n if si  fjthen A = A  { i } j = i return A Análise e Síntese de Algoritmos

  6. Exemplo (Cont.) • Algoritmo encontra soluções de tamanho máximo para o problema de selecção de actividades • Existe uma solução óptima que começa com escolha greedy, i.e. actividade 1 • A: solução óptima que começa em k • B = A - { k }  { 1 } • f1 fk • Actividades em B são mutuamente disjuntas e A = B • B é também solução óptima ! Análise e Síntese de Algoritmos

  7. Exemplo (cont.) • Após escolha greedy, problema reduz-se a encontrar solução para actividades compatíveis com actividade 1 • Seja A solução óptima, e que começa em 1 • A’ = A - { 1 } é solução óptima para S’ = { i  S : si  f1} • Caso contrário, existiria uma solução B’ > A’ para S’ que permitiria obter solução B para S com mais actvidades do que A; uma contradição ! • Aplicar indução no número de escolhas greedy • Algoritmo calcula solução óptima ! • Exemplo Análise e Síntese de Algoritmos

  8. Características das Abordagens Greedy • Propriedade da escolha greedy • Óptimo (global) para o problema pode ser encontrado realizando escolhas locais óptimas • Sub-estrutura óptima • Solução óptima do problema engloba soluções óptimas para sub-problemas Análise e Síntese de Algoritmos

  9. Outro Exemplo: Problema da Mochila • Definição do problema: • Dados n objectos (1, …, n) e uma mochila • Cada objecto tem um valor vi e um peso wi • É possível transportar fracção xi do objecto: 0  xi 1 • Peso transportado pela mochila não pode exceder W • Objectivo: • maximizar o valor transportado pela mochila e respeitar a restrição de peso • Formalização: Análise e Síntese de Algoritmos

  10. Exemplo (Cont.) • Observações: • Soma do peso dos n objectos deve exceder peso limite W • Solução óptima tem que encher mochila completamente, • Caso contrário poderiamos transportar mais fracções, com mais valor ! • Algoritmo: function Encher_Mochila_Greedy(v,w,W) while weight < W escolher elemento i com vi/wi máximo if wi + weight  W then xi = 1; weight += wi else xi = (W-weight)/ wi; weight = W Tempo de execução: O(n), ou O(n lg n) Análise e Síntese de Algoritmos

  11. Exemplo (Cont.) • Se objectos forem escolhidos por ordem decrescente de vi/wi, então algoritmo encontra solução óptima • Admitir: v1/w1 … vn/wn • X = (x1, …, xn): solução calculada por algoritmo greedy • Se xi = 1 para todo o i, solução é necessariamente óptima • Caso contrário, seja j menor indíce tal que xj < 1 • Nota: • xi = 1, i < j • xi = 0, i > j • Relação de pesos: • Valor da solução é: Análise e Síntese de Algoritmos

  12. Exemplo (Cont.) • Y = (y1, …, yn): uma qualquer solução possível • Peso: • Valor: • Relação X vs. Y: • Notar que, • Seja j menor indíce tal que xj < 1. Casos possíveis: • i < j, xi = 1, xi - yi  0, enquanto vi/wi vj/wj • i > j, xi = 0, xi - yi  0, enquanto vi/wi vj/wj • i = j, vi/wi = vj/wj Verifica-se sempre: Análise e Síntese de Algoritmos

  13. Exemplo (Cont.) • Verifica-se, • V(X) é a melhor solução possível entre todas as soluções possíveis • Algoritmo calcula solução óptima ! Análise e Síntese de Algoritmos

  14. Exemplo: Minimizar Tempo no Sistema • Dado um servidor com n clientes, com tempo de serviço conhecido (i.e. cliente i leva tempo ti), objectivo é minimizar tempo total dispendido no sistema (pelo total dos n clientes) • Exemplo • Solução (greedy): • Servir clientes por ordem crescente do tempo de serviço Análise e Síntese de Algoritmos

  15. Exemplo (Cont.) • Algoritmo greedy encontra solução óptima • P = p1p2…pn, permutação dos inteiros de 1 a n • Seja • E.g. • Com clientes servidos pela ordem P, tempo de serviço do cliente a ser servido na posição i é si • Tempo total passado no sistema por todos os clientes é: • Assumir clientes não ordenados por ordem crescente de tempo de serviço em P • Então existem a e b, com a < b, e sa > sb s1 aparece n vezes, e sn aparece 1 vez Análise e Síntese de Algoritmos

  16. Exemplo (cont.) • Trocar ordem dos clientes a e b, de modo a obter ordem P’ • Corresponde a P com inteiros pa e pb trocados • Obtendo-se, • P’ é uma ordem melhor (com menor tempo de serviço) • Algoritmo calcula solução óptima ! Análise e Síntese de Algoritmos

  17. Exemplo: Códigos de Huffman • Aplicação: compressão de dados • Exemplo: • Ficheiro com 100000 caracteres • Tamanho do ficheiro comprimido: 3x100000 = 300000 bits • Código de largura variável pode ser melhor do que código com largura fixa • Aos caracteres mais frequentes associar códigos de menor dimensão Análise e Síntese de Algoritmos

  18. Exemplo (Cont.) • Código de comprimento variável: • Número de bits necessário: • (45*1 + 13*3 + 12*3 + 16*3 + 9*4 + 5*4)*1000 = 224000 bits • Códigos livres de prefixo: • Nenhum código é prefixo de outro código • 001011101  0.0.101.1101 • Código óptimo representado por árvore binária (completa) Análise e Síntese de Algoritmos

  19. 100 0 1 55 a:45 1 0 25 30 0 1 0 1 14 c:12 b:13 d:16 0 1 f:5 e:9 Códigos Livres de Prefixo Árvore binária completa: cada nó interno com 2 filhos Código óptimo representado por árvore completa Análise e Síntese de Algoritmos

  20. Exemplo (Cont.) • Dada uma árvore T associada a um código livre de prefixo • f(c): frequência (ocorrências) do caracter c no ficheiro • dT(c): profundidade da folha c na árvore • Código de Huffman: construir árvore T que corresponde ao código livre de prefixo óptimo • Começar com |C| folhas (para cada um dos caracteres do ficheiro) e realizar |C| - 1 operações de junção para obter árvore final Número de bits necessário para representar ficheiro Análise e Síntese de Algoritmos

  21. Exemplo (Cont.) function Huffman(C) n = |C| Q = C // Constrói fila de prioridade for i = 1 to n - 1 z = AllocateNode() x = left[z] = ExtractMin(Q) y = right[z] = ExtractMin(Q) f[z] = f[x] + f[y] Insert(Q, z) return ExtractMin(Q) Tempo de execução: O(n lg n) Análise e Síntese de Algoritmos

  22. Exemplo (Cont.) • Exemplo • Código de Huffman para alfabeto C: • Cada caracter cC com frequência f[c] • x, y caracteres em C com as menores frequências • Código óptimo para C representado por árvore binária T Análise e Síntese de Algoritmos

  23. Exemplo (Cont.) • Facto 1: (propriedade da escolha greedy) • Existe código livre de prefixo para C tal que os códigos para x e y (com as menores frequências) têm o mesmo comprimento e diferem apenas no último bit • T árvore que representa código óptimo • b e c caracteres são nós folha de maior profundidade em T • Admitir, f[b]  f[c], e f[x]  f[y] • Notar também que, f[x] f[b], e f[y]  f[c] • T’: trocar posições de b e x em T • T’’: trocar posições de c e y em T’ • B(T)  B(T’)  B(T’)  B(T’’) (*) • Mas, T é óptimo  B(T’), B(T’’)  B(T) •  T’’ é uma árvore óptima ! Análise e Síntese de Algoritmos

  24. Exemplo (Cont.) • (*) Análise e Síntese de Algoritmos

  25. Exemplo (Cont.) • Facto 2: (subestrutura óptima) • Sendo z um nó interno de T, e x e y nós folha • Considerar um caracter z com f[z] = f[x] + f[y] • Então T’ = T - {x, y} é óptima para C’ = C - {x, y}  { z } • B(T) = B(T’) + f[x] + f[y] (**) • Se T’ é não óptimo, então existe T’’ tal que B[T’’] < B[T’] • Mas z é nó folha também em T’’ (devido a facto 1) • Adicionando x e y como filhos de z em T’’ • Código livre de prefixo para C com custo: • B[T’’] + f[x] + f[y] < B[T] • mas T é óptimo (B[T’’] + f[x] + f[y]  B[T]); pelo queT’ também é óptimo Análise e Síntese de Algoritmos

  26. Exemplo (Cont.) • (**) Análise e Síntese de Algoritmos

  27. Exemplo (Cont.) • O algoritmo Huffman produz um código livre de prefixo óptimo • Ver factos anteriores • Propriedade da escolha greedy • Sub-estrutura óptima Análise e Síntese de Algoritmos

  28. Revisão • Algoritmos greedy • Características das abordagens greedy • Exemplos de aplicação • String Matching (CLRS, Cap. 32) Análise e Síntese de Algoritmos

More Related