280 likes | 476 Views
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
E N D
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 • Um exemplo final: Códigos de Huffman Análise e Síntese de Algoritmos
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Exemplo (Cont.) • Exemplo • Código de Huffman para alfabeto C: • Cada caracter cC 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
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
Exemplo (Cont.) • (*) Análise e Síntese de Algoritmos
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
Exemplo (Cont.) • (**) Análise e Síntese de Algoritmos
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
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