A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Análise e Síntese de Algoritmos Algoritmos GreedyCLRS, Cap. 16.

Apresentações semelhantes


Apresentação em tema: "Análise e Síntese de Algoritmos Algoritmos GreedyCLRS, Cap. 16."— Transcrição da apresentação:

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

2 2003/2004Análise e Síntese de Algoritmos2 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

3 2003/2004Análise e Síntese de Algoritmos3 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.

4 2003/2004Análise e Síntese de Algoritmos4 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: s i tempo de fim: t i execução da actividade durante [s i, t i ) –Actividades i e j compatíveis apenas se [s i, t i ) e [s j, t j ) não se intersectam Objectivo: encontrar conjunto máximo de actividades mutuamente compatíveis

5 2003/2004Análise e Síntese de Algoritmos5 Exemplo (Cont.) Admitir que f 1  f 2  …  f n 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 s i  f j then A = A  { i } j = i return A

6 2003/2004Análise e Síntese de Algoritmos6 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 } f 1  f k –Actividades em B são mutuamente disjuntas e  A  =  B  –B é também solução óptima !

7 2003/2004Análise e Síntese de Algoritmos7 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 : s i  f 1 } –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

8 2003/2004Análise e Síntese de Algoritmos8 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

9 2003/2004Análise e Síntese de Algoritmos9 Outro Exemplo: Problema da Mochila Definição do problema: –Dados n objectos (1, …, n) e uma mochila –Cada objecto tem um valor v i e um peso w i –É possível transportar fracção x i do objecto: 0  x i  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:

10 2003/2004Análise e Síntese de Algoritmos10 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 v i /w i máximo if w i + weight  W then x i = 1; weight += w i else x i = (W-weight)/ w i ; weight = W Tempo de execução: O(n), ou O(n lg n)

11 2003/2004Análise e Síntese de Algoritmos11 Exemplo (Cont.) Se objectos forem escolhidos por ordem decrescente de v i /w i, então algoritmo encontra solução óptima –Admitir: v 1 /w 1  …  v n /w n –X = (x 1, …, x n ): solução calculada por algoritmo greedy –Se x i = 1 para todo o i, solução é necessariamente óptima –Caso contrário, seja j menor indíce tal que x j < 1 Nota: –x i = 1, i < j –x i = 0, i > j –Relação de pesos: –Valor da solução é:

12 2003/2004Análise e Síntese de Algoritmos12 Exemplo (Cont.) –Y = (y 1, …, y n ): uma qualquer solução possível Peso: Valor: –Relação X vs. Y: –Notar que, –Seja j menor indíce tal que x j < 1. Casos possíveis: i < j, x i = 1, x i - y i  0, enquanto v i /w i  v j /w j i > j, x i = 0, x i - y i  0, enquanto v i /w i  v j /w j i = j, v i /w i = v j /w j Verifica-se sempre:

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

14 2003/2004Análise e Síntese de Algoritmos14 Exemplo: Minimizar Tempo no Sistema Dado um servidor com n clientes, com tempo de serviço conhecido (i.e. cliente i leva tempo t i ), 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

15 2003/2004Análise e Síntese de Algoritmos15 Exemplo (Cont.) Algoritmo greedy encontra solução óptima –P = p 1 p 2 …p n, 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 é s i –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 s b s 1 aparece n vezes, e s n aparece 1 vez

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

17 2003/2004Análise e Síntese de Algoritmos17 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

18 2003/2004Análise e Síntese de Algoritmos18 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)

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

20 2003/2004Análise e Síntese de Algoritmos20 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 –d T (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

21 2003/2004Análise e Síntese de Algoritmos21 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)

22 2003/2004Análise e Síntese de Algoritmos22 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

23 2003/2004Análise e Síntese de Algoritmos23 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 !

24 2003/2004Análise e Síntese de Algoritmos24 Exemplo (Cont.) (*)

25 2003/2004Análise e Síntese de Algoritmos25 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

26 2003/2004Análise e Síntese de Algoritmos26 Exemplo (Cont.) (**)

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

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


Carregar ppt "Análise e Síntese de Algoritmos Algoritmos GreedyCLRS, Cap. 16."

Apresentações semelhantes


Anúncios Google