You are on page 1of 53

es e aplicac es Algoritmos gulosos: denic o o

Anderson Rocha anderson.rocha@ic.unicamp.br Leyza Baldo Dorini leyza.dorini@ic.unicamp.br Campinas, 29 de abril de 2004

o Introduc a
o lidam com uma seq ncia de passos, De forma geral, os algoritmos relacionados com otimizac a ue es. Uma estrat sendo que em cada passo h a um conjunto de escolhas/opc o egia para resolver proble o s o que parece ser a melhor no mas de otimizac a ao os algoritmos gulosos, os quais escolhem a opc a tima), e esperam que desta forma consiga-se chegar a uma soluc o o tima global. momento (escolha o a o o tima a partir da utilizac o de algoritmos Embora nem sempre seja poss vel chegar a uma soluc a a gulosos, eles s ao ecientes em uma ampla variedade de problemas, conforme poderemos ver neste trabalho. o dispon Os algoritmos gulosos tomam decis oes com base apenas na informac a vel, sem se , eles nunca reconsideram as decis preocupar com os efeitos futuros de tais decis oes, isto e oes tomadas, ncias. N independentemente das conseq ue ao h a, portanto, necessidade de avaliar as alternativas nem de empregar procedimentos elaborados permitindo que decis oes anteriores sejam desfeitas. Devido a tais caracter sticas, de forma geral eles s ao f aceis de se inventar e implementar, e s ao ecientes quando funcionam [3], [2]. o introdut O Cap tulo 1 apresenta uma noc a oria do assunto, envolvendo as caracter sticas ge apresentada uma formalizac o rais dos algoritmos gulosos, elementos da estrat egia gulosa. Tamb em e a dos algoritmos gulosos segundo a teoria dos matr oides. o O Cap tulo 2 apresenta o relacionamento dos algoritmos gulosos com a programac a din amica. Julgou-se pertinente realizar tal abordagem devido aos dois temas possu rem alguns pontos em comum. Al em disso, outro semin ario tratou deste assunto, o que possibilitou que neste trabalho o din n ao fosse preciso fazer um levantamento te orico sobre programac a amica. Ainda neste cap tulo o de atividade e o problema da mochila. foram apresentados dois problemas: o problema de selec a No Cap tulo 3 ser ao apresentados mais dois exemplos. O primeiro deles foi o C odigo de Huffman, relacionado com a compress ao de dados. O outro busca organizar tarefas de tal forma que o minimizado (a denic o de tarefas e sistema pode tempo m edio que cada tarefa ca no sistema e a variar de um caso para outro, conforme veremos). Os algoritmos gulosos em grafos est ao no Cap tulo 4. Ser ao abordados dois algoritmos para rvore geradora m descobrir a a nima em um grafo conexo e ponderado, e um algoritmo para se com ltimo cap putar o caminho m nimo em um grafo. O quinto e u tulo apresenta um exemplo de como os algoritmos gulosos podem ser utilizados como heur stica. Al em disso, o Anexo 1 apresenta conceitos sobre grafos, os quais s ao importantes em algumas partes do trabalho, especialmente no Cap tulo 4.

Cap tulo 1

Algoritmos Gulosos
o geral de como trabalham os algoritmos gulosos, vamos abordar um Para possibilitar uma noc a exemplo. Suponha que tenhamos dispon veis moedas com valores de 100, 25, 10, 5 e 1. O problema criar um algoritmo que para conseguir obter um determinado valor com o menor n e umero de moedas poss vel (problema do troco). preciso dar um troco de $2.89. A melhor soluc o, isto e , o menor n Suponha que e a umero de moedas poss vel para obter o valor, consiste em 10 moedas: 2 de valor 100, 3 de valor 25, 1 de valor 10 e 4 de valor 1. De forma geral, agimos tal como um algoritmo guloso: em cada est agio adicionamos a moeda de maior valor poss vel, de forma a n ao passar da quantia necess aria. o dif verdade que com os valores dados das moedas, Embora seja uma armac a cil de provar, e e tendo-se dispon vel uma quantidade adequada de cada uma, o algoritmo sempre ir a fornecer uma o o tima para o problema. Entretanto, ressalta-se que para diferentes valores de moedas, ou ent soluc a ao quando se tem uma quantidade limitada de cada uma, o algoritmo guloso pode vir a n ao chegar em o o tima, ou at o nenhuma (mesmo esta existindo). O algoritmo uma soluc a e mesmo n ao chegar a soluc a apresentado a seguir (pr para resolver o problema do troco e oxima p agina).

Algoritmo 1 Algoritmo que d a o troco para n unidades usando o menor n umero poss vel de moedas o T ROCO(n) 1: func a o conjunto de moedas 2: const C {100, 25, 10, 5, 1} Ce o conjunto que ir o 3: S Se a conter a soluc a a soma dos itens em S 4: s0 se 5: enquanto s = n fac a 6: x o maior item em C tal que s + x n 7: se este item n ao existe ent ao o! 8: retorne N ao foi encontrada uma soluc a 9: m se 10: S A {uma moeda de valor x} 11: ss+x 12: m enquanto 13: retorne S o 14: m func a 2

caracterizado como guloso porque a cada passo ele escolhe o maior O algoritmo apresentado e , uma vez que um determinado valor de moeda foi valor poss vel, sem refazer suas decis oes, isto e o [2]. escolhido, n ao se retira mais este valor do conjunto soluc a a programac o din Uma outra estrat egia para resolver este problema e a amica, a qual ir a sempre obter um resultado. Entretanto, segundo [2] os algoritmos gulosos s ao mais simples, e quando tanto o o din mais algoritmo guloso quanto o algoritmo utilizando programac a amica funcionam, o primeiro e eciente. A seguir ser ao apresentadas as caracter sticas gerais dos algoritmos gulosos, propostas por [2].

1.1. Caracter sticas gerais dos algoritmos gulosos


De forma geral, os algoritmos gulosos e os problemas por eles resolvidos s ao caracterizados pelos itens abordados a seguir. Para facilitar o entendimento, cada um dos itens ser a relacionado ao exemplo exposto anteriormente (problema do troco): tima, e para construir a soluc o existe um con h a um problema a ser resolvido de maneira o a junto de candidatos. No caso do problema do troco, os candidatos s ao o conjunto de moedas (que possuem valor 100, 25, 10, 5 e 1), com quantidade de moedas suciente de cada valor; o do algoritmo s durante a execuc a ao criados dois conjuntos: um cont em os elementos que foram avaliados e rejeitados e outro os elementos que foram analisados e escolhidos; o que verica se um conjunto de candidatos produz uma soluc o para o pro h a uma func a a o. No caso blema. Neste momento, quest oes de otimalidade n ao s ao levadas em considerac a o vericaria se o valor das moedas j exatamente igual ao do exemplo, esta func a a escolhidas e valor desejado. o e respons uma segunda func a avel por vericar a viabilidade do conjunto de candidatos, ou ou n seja, se e ao poss vel adicionar mais candidatos a este conjunto de tal forma que pelo o seja obtida. Assim como no item anterior, n o com menos uma soluc a ao h a preocupac a vi otimalidade. No caso do problema do troco, um conjunto de moedas e avel se seu valor total n ao excede o valor desejado; o, denominada func o de selec o, busca identicar qual dos candidatos uma terceira func a a a , que ainda n restantes (isto e ao foram analisados e enviados ou para o conjunto dos rejeitados o melhor (o conceito de melhor depender ou dos aceitos) e a do contexto do problema). No o de selec o seria respons exemplo, a func a a avel por escolher a moeda com maior valor entre as restantes; o objetivo, a qual retorna o valor da soluc o encontrada. No exemplo, por m, existe a func a a o seria respons o. esta func a avel por contar o n umero de moedas usadas na soluc a Busque identicar estas caracter sticas no Algoritmo 1 exposto anteriormente. desejado determinar um Vamos agora denir um problema geral: a partir de um conjunto C , e subconjunto S C tal que [7]: (i) S satisfac a a uma determinada propriedade P ; m o a um crit (ii) S e aximo (ou m nimo, dependendo do contexto do problema)em relac a erio , ,S e o subconjunto de C que possui o maior (ou o menor) tamanho, de acordo com isto e que satisfaz a propriedade P . De uma forma mais detalhada, para resolver o problema, busca-se um conjunto de candida o, e que ao mesmo tempo otimizem a func o objetivo. O conceito tos que constituam uma soluc a a

o ir desejado de otimizac a a depender do contexto do problema. No caso do problema do troco, e minimizar o n umero de moedas. o de selec o e usualmente relacionada com a func o Desta forma, pode-se ver que a func a a a importante ressaltar que a ` s vezes pode-se ter v es de selec o que s objetivo. E arias func o a ao plaus veis, essencial para que o algoritmo funcione corretamente. O Algoritmo e a escolha correta de uma delas e 2 ilustra o funcionamento de um algoritmo guloso gen erico. Algoritmo 2 Algoritmo Guloso gen erico o ALGORITMO G ULOSO(C : conjunto) 1: func a 2: S 3: enquanto C = e n ao soluc a a o(S ) fac 4: x seleciona C 5: C C {x} vi 6: se e avel S {x} ent ao 7: S S {x} 8: m se 9: m enquanto o(S ) ent 10: se soluc a ao 11: retorne S 12: sen ao o! 13: retorne N ao existe soluc a 14: m se o 15: m func a

o conjunto de candidatos Ce o conjunto que ir o Se a conter a soluc a

Pode-se dizer, portanto, que um algoritmo guloso trabalha da seguinte forma: a princ pio o o conjunto S est a vazio, ou seja, n ao h a candidatos escolhidos. Ent ao, a cada passo, utiliza-se a func a o para determinar qual e o melhor candidato (lembrando que a func o de selec o considera de selec a a a apenas os elementos que ainda n ao foram avaliados). Caso o conjunto ampliado de candidatos n ao seja vi avel, ignora-se o termo que est a sendo vi avaliado no momento. Por outro lado, se tal conjunto e avel, adiciona-se o elemento em quest ao mais considerado pela ao conjunto S . O elemento considerado, sendo ele aceito ou rejeitado, n ao e o de selec o nos passos posteriores. func a a ampliado, e vericado se a soluc o Cada vez que o conjunto de candidatos escolhidos (S ) e a do problema foi obtida. De acordo com [2], quando um algoritmo guloso trabalha corretamente, a o encontrada da maneira aqui descrita e o tima. primeira soluc a

1.2. Elementos da estrat egia gulosa


ncia de escolhas, um algoritmo guloso busca encontrar a soluc o o tima para o A partir de uma seq ue a em cada passo escolher a soluc o problema em quest ao. Conforme exposto, a estrat egia utilizada e a que parece ser a melhor. o. No entanto, nem sempre um algoritmo guloso consegue resolver um problema de otimizac a Mas existem duas caracter sticas que podem indicar que os problemas podem ser resolvidos utilizando tima. Estas ser uma estrat egia gulosa. S ao elas a propriedade de escolha gulosa e a subestrutura o ao abordadas a seguir [3].

1.2.1. Propriedade de escolha gulosa o globalmente o tima pode ser alcanc Pela propriedade de escolha gulosa, uma soluc a ada fazendo-se tima (gulosa), isto e , aquela que parece ser a melhor naquele momento, uma escolha localmente o desconsiderando-se resultados de subproblemas. importante ressaltar a necessidade de se provar que realmente uma escolha gulosa em cada E o o tima global. O que normalmente se faz, e examinar uma um dos passos ir a levar a uma soluc a o o tima global para algum subproblema e depois mostrar que ela pode ser modicada em uma soluc a o gulosa. Isto ir soluc a a resultar em um subproblema menor, mas similar. poss Freq uentemente e vel fazer escolhas gulosas de uma forma mais r apida (resultando em algoritmos mais ecientes) se uma estrutura de dados apropriada for utilizada (la de prioridades, por exemplo), ou ent ao se houver um pr e-processamento da entrada (veremos um exemplo de um caso onde isso acontece). tima 1.2.2. Subestrutura o importante quando se trabalha com programac o din Esta caracter stica tamb em e a amica. Diz-se que tima quando uma soluc o o tima para o problema cont um problema possui uma subestrutura o a em es o timas para subproblemas. dentro dela soluc o preciso fazer ent demonstrar que a combinac o de uma escolha gulosa j O que e ao e a a reao o tima para o subproblema resulta em uma soluc o o tima para o problema lizada com uma soluc a a o sobre os subproblemas original. Segundo [1, p. 305] esse esquema utiliza implicitamente a induc a o o tima. para provar que fazer a escolha gulosa em cada etapa produz uma soluc a

1.3. Fundamentos te oricos para m etodos gulosos


o iremos ver um pouco da teoria sobre algoritmos gulosos. Esta teoria envolve estruturas Nesta sec a combinat orias chamadas matr oides. Este tipo de estrutura n ao cobre todo tipo de problema que pode ser resolvido por um algoritmo guloso, como o algoritmo de Huffman (este ser a abordado posteriormente), mas cobre muitos casos de interesse pr atico. o 1.3.1. Denic a um par ordenado M = (S, I ), satisfazendo a ` s seguintes condic es: De acordo com [3], um matr oide e o um conjunto nito n 1. S e ao vazio. uma fam 2. I e lia n ao vazia de subconjuntos de S , chamada de subconjuntos independentes de S , tal que se B I e A B ent ao A I . Observe que o conjunto vazio deve ser heredit necessariamente um membro de I . Neste caso, dizemos que I e ario. 3. Se A I , B I e |A| < |B |, ent ao existe algum elemento x (B A) tal que A {x} I . Dizemos que M satisfez a propriedade da troca. Lema: todo conjunto independente maximal em um matr oide tem o mesmo tamanho. Prova. o: suponha que existam conjuntos independentes maximais A e B , e |A| < |B |. Pela Por contradic a propriedade de troca deve existir x (B A) tal que (A + x) I . Isto contradiz o fato de A ser maximal. Exemplo: considere o problema da mochila 0-1 (o qual tamb em ser a apresentado) onde todos os itens (digamos S ) t em peso unit ario e a mochila tem peso K . Podemos denir o conjunto de um matr independ encia I como sendo o conjunto I = {I S : |I | K }. Ent ao M = (S, I ) e oide.

1.3.2. Algoritmos Gulosos e Matr oides Muitos problemas que podem ser resolvidos atrav es de um algoritmo guloso recaem no problema de encontrar um conjunto independente maximal em um matr oide. Neste caso, vamos considerar que cada elemento x S de um matr oide M = (S, I ) tem um peso estritamente positivo w(x). Neste um matr caso, dizemos que o matr oide M e oide com pesos [3]. Dado um conjunto A S , vamos denotar por w(A) a soma w(A) = eA w(e). O resultado que sempre e poss mais importante relacionando matr oides com pesos e algoritmos gulosos, e vel encontrar um conjunto independente maximal atrav es de um algoritmo guloso. Seja M = (S, I ) um matr oide com pesos w : S propriedade gulosa. Algoritmo 3 Guloso
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
+.

Considere o algoritmo 3 que tem a

o G ULOSO(M , w) func a Onde M = (S, I ) e w : S A0 Seja {e1 , e2 , . . . , en } o conjunto S em ordem n ao crescente de peso para i 1, n fac a se A {ei } I ent ao A A {ei } m se m para retorne A o m func a

um conjunto independente. A complexidade O conjunto A retornado pelo algoritmo Guloso e o tempo para vericar se um deste algoritmo pode ser dada por O(n log n + nf (n)), onde f (n) e conjunto A {x} est a em I . Lema 1: seja M = (S, I ) um matr oide com pesos w : S + e S est a ordenado em ordem independente, se tal n ao decrescente de peso, |S | 1. Seja x o primeiro elemento de S tal que {x} e timo A S que cont x existe. Se x existe, ent ao existe um subconjunto o em x. Lema 2: Seja x o primeiro elemento de S escolhido pelo algoritmo Guloso para o matr oide M = (S, I ). O problema de achar um subconjunto maximal contendo x se restringe a achar um subconjunto maximal no matr oide M = (S , I ) onde,

S T

= {y S : {x, y } I }, = {B S {x} : B {x} I }.

o de M pelo elemento x. Chamamos o matr oide M de contrac a um matr Teorema: se M = (S, I ) e oide com pesos w : S + , ent ao Guloso(M, w) o em |S |. Para um matr retorna um subconjunto independente maximal. Prova: por induc a oide com um elemento, o algoritmo Guloso est a correto. Agora suponha que o algoritmo esteja correto para matr oides com |S | = n 1. Seja M = (S, I ) um matr oide com |S | = n. Uma vez que o primeiro elemento x foi escolhido o o tima. Por outro lado, de forma gulosa pelo Lema 1 nos garante que podemos estend e-lo a uma soluc a

o o tima contendo x e a uni o o tima do matr o Lema 2 nos diz que a soluc a ao da soluc a oide M = (S , I ) o de M pelo elemento x) com x. Note que as pr (contrac a oximas escolhas feitas pelo algoritmo Guloso independente em M se e podem ser interpretadas como se atuando sobre o matr oide M , j a que B e independente em M . Pela hip o, o algoritmo Guloso encontra somente se B {x} e otese de induc a o o tima em M . um conjunto maximal em M . Assim, o algoritmo encontra a soluc a

Cap tulo 2

o Relacionamento com programac a din amica


o din Embora tanto a programac a amica quanto os algoritmos gulosos trabalhem com problemas de o e com uma seq ncia de passos, onde em cada passo e feita uma escolha, eles diferem otimizac a ue realizada. claramente na forma em que esta escolha e o din es para subproblemas, Enquanto na programac a amica a escolha pode depender das soluc o a que parece ser a melhor no momento, n em algoritmos gulosos a escolha feita e ao dependendo das es para os subproblemas (embora possa depender das escolhas at soluc o e o momento). o din Com isso, na programac a amica os subproblemas s ao resolvidos de baixo para cima, ou seja, parte-se de subproblemas menores para maiores. Por outro lado, os algoritmos gulosos progridem , a inst reduzida a cada iterac o, atrav o de cima para baixo, isto e ancia de um problema e a es da realizac a de escolhas gulosas. o din Tendo em vista que o tema de um dos semin arios apresentados foi programac a amica, e que este tema est a fortemente relacionado a algoritmos gulosos, julgou-se pertinente fazer uma abordagem envolvendo os dois temas conjuntamente. o ir o utilizando programac o Desta forma, essa sec a a apresentar um problema, sua soluc a a o para uma soluc o gulosa. Embora de maneira geral nem todas din amica e a convers ao desta soluc a a as etapas que ser ao abordadas a seguir s ao necessariamente utilizadas para desenvolver um algoritmo o din guloso, elas ilustram de forma clara o relacionamento entre programac a amica e algoritmos gulosos [3]. o din Como a programac a amica e os algoritmos gulosos possuem algumas caracter sticas em tima, por exemplo), algumas vezes pode-se pensar em utilizar comum (propriedade de subestrutura o o gulosa quando na verdade seria necess o de programac o din uma soluc a aria uma soluc a a amica, ou o de programac o din o mais simples utilient ao a desenvolver uma soluc a a amica quando uma soluc a es do problema da mochila zando algoritmos gulosos seria suciente. Apresentaremos duas variac o para tentar ilustrar um caso onde esta d uvida acontece.

o de atividade 2.1. Um problema de selec a


Este problema consiste em programar um recurso entre diversas atividades concorrentes, mais especicamente, selecionar um subconjunto de tamanho m aximo de atividades mutuamente compat veis. Seja S = a1 , a2 , . . . , an um conjunto n atividades que desejam utilizar um mesmo recurso, o qual pode ser utilizado por apenas uma atividade por vez. Cada atividade ai ter a associado um tempo , o tempo de in de in cio (si ) e um tempo de t ermino (fi ), sendo que 0 si < fi < (isto e cio deve ser menor que o tempo de m, e este por sua vez, deve ser nito). Caso uma atividade ai seja selecionada, ela ir a ocorrer no intervalo de tempo [si , fi ). Diz-se que duas atividades s ao compat veis se o intervalo de tempo no qual uma delas ocorre n ao se sobrep oe o de que o recurso pode ser utilizado por apenas ao intervalo de tempo da outra (considerando a restric a uma atividade por vez). Sendo assim, as atividades ai e aj s ao compat veis se os intervalos [si , fi ) e [sj , fj ) n ao se sobrep oem, ou seja, se si fj (a atividade ai inicia depois que aj termina) ou ent ao sj fi (a atividade aj inicia depois que ai termina). Como exemplo, considere-se o conjunto S de atividades a seguir, o qual est a ordenado de forma monotonicamente crescente de tempo de t ermino: i si fi 1 1 4 2 3 5 3 0 6 4 5 7 5 3 8 6 5 9 7 6 10 8 8 11 9 8 12 10 2 13 11 12 14

No caso deste algoritmo espec co, temos como conjunto de atividades mutuamente com` restric o explicitada anteriormente, o conjunto {a3 , a9 , a11 }. Este pat veis, ou seja, que atendem a a um subconjunto m por em, n ao e aximo, pois pode-se obter dois conjuntos de atividades compat veis com quatro elementos (subconjuntos m aximos), sendo eles: {a1 , a4 , a8 , a11 } e {a2 , a4 , a9 , a11 }. o utilizando programac o din 2.1.1. Desenvolvendo uma soluc a a amica denir uma subestrutura o tima, e ent A primeira coisa a ser feita e ao utiliz a-la para contruir uma o o tima para o problema em quest es o timas para subproblemas (conforme soluc a ao, a partir de soluc o o din foi explicado com detalhes no semin ario sobre programac a amica). necess o de um espac Para tal, e aria a denic a o de subproblemas apropriado. Inicialmente, dene-se conjuntos Sij = {ak S : fi sk < fk sj } (2.1)

o conjunto de atividades que podem ser executadas entre o nal da atividade ai e o sendo que Sij e in cio da atividade aj . Pode-se ver que tais atividades s ao compat veis com as atividades ai , aj , as que o e n ao terminam depois de ai terminar e as que n ao comec am antes de aj comec ar (esta observac a o de atividades compat o 2.1 - os intervalos direta a partir da denic a veis, apresentada no in cio da sec a de tempo que as atividades est ao executando n ao se superp oem). Para representar o problema todo, s ao adicionadas atividades ct cias a0 e an+1 , e convenciona-se que f0 = 0 e sn+1 = . A partir disso, S = s0,n+1 e os intervalos para i e j s ao dados por 0 i, j n + 1. Para que os intervalos de i e j sejam restringidos ainda mais, sup oe-se que as atividades est ao dispostas em ordem monotonicamente crescente de tempo de t ermino (por isso o foi feita no exemplo dado anteriormente), isto e : tal suposic a

f0 f1 f2 . . . fn < fn+1

(2.2)

o, o espac Com essa suposic a o de subproblemas passa a ser selecionar um subconjunto m aximo de atividades mutuamente compat veis de Sij , para 0 i < j n + 1, sendo que que Sij = i j . o e verdadeira, vamos supor que exista uma atividade ak Sij Para mostrar que tal armac a ncia ordenada, aj e seguido por ai , ou seja, fj fi . para algum i j , de tal forma que na seq ue o que i j e de (2.1) tem-se que fi sk < fk sj < fj , que Entretanto, a partir da suposic a ncia ordenada. contradiz a hip otese que ai segue aj na seq ue o de atividades, considere um subproAgora, para ver a subestrutura do problema de selec a o para este subproblema envolva a atividade ak . No blema n ao vazio Sij 1 , e suponha que uma soluc a o de ak ir entanto, a utilizac a a gerar dois subproblemas: 1. Sik : conjunto de atividades que podem ser executadas entre o in cio da atividade ai e o nal , que comec da atividade ak , isto e am depois de ai terminar e terminam antes de ak comec ar. 2. Skj : conjunto de atividades que podem ser executadas entre o nal da atividade ak e o in cio da atividade aj . um subconjunto das atividades de Sij . Sendo assim, o n onde cada uma das atividades e umero de o para Sij e a soma do tamanho das soluc es de Sik e Skj , mais uma unidade, atividades da soluc a o ` atividade ak . Agora, falta (i) mostrar a subestrutura o tima e (ii) utiliz correspondente a a-la para poss o o tima para o problema a partir de soluc es o timas para mostrar que e vel construir uma soluc a o subproblemas. o o tima para o problema Sij , e suponha que tal soluc o envolva a ativi(i) seja Aij uma soluc a a o implica que as soluc es Aik e Akj (para os problemas Sik e Skj , dade ak . Esta suposic a o timas. Aqui aplica-se o argumento de recortar e colar respectivamente)tamb em devem ser o o din discutido no semin ario sobre programac a amica. denido como: (ii) subconjunto de tamanho m aximo Aij de atividades mutuamente compat veis e Aij = Aik {ak } Akj (2.3)

es do item (i), pode-se armar que a soluc o geral Aij (conIsso porque a partir das denic o a juntos de tamanho m aximo de atividades mutuamente compat veis em Sij ) pode ser obtida a partir da divis ao do problema principal em dois subproblemas, e posterior busca dos conjuntos de tamanho m aximo para cada um destes (Aik e Akj ). o recursiva Uma soluc a o de programac o din o No desenvolvimento de uma soluc a a amica, o segundo passo consiste na denic a o o tima. Seja c[i, j ] o n recursiva do valor de uma soluc a umero de atividades no subconjunto Sij (que cont em o n umero m aximo de atividades mutuamente compat veis com i, j ). Considerando um conjunto n ao vazio Sij (lembrando: Sij = i j ) e considerando o de uma atividade ak implicar que a utilizac a a em outros dois subconjuntos Sik e Skj , a partir de (3) temos que:
` s vezes seja tratado como conjunto de atividades e outras vezes como subproblema, procurou-se deixar embora Sij a ` cada caso. claro no texto quando estamos nos referindo a
1

c[i, j ] = c[i, k ] + c[k, j ] + 1 o n ou seja, o n umero de atividades no subconjunto Sij e umero de atividades em Sik (denotado por c[i, k ]) , o n umero de atividades em Skj (c[k, j ]) mais a atividade ak . o recursiva e que o valor de k n conhecido, sendo que sabe-se O problema com essa equac a ao e apenas que existem j i 1 valores poss veis para k (k = i + 1, . . . , j 1). Mas levando-se em o que o conjunto Sik deve usar um destes valores para k , toma-se o melhor deles. Sendo considerac a o recursiva completa e assim, a denic a
0,

c[ij ] =

se Sij = ; max{c[i,k]+ c[k,j] + 1}, se Sij = .


ik<j

(2.4)

o de programac o din o gulosa 2.1.2. Convertendo uma soluc a a amica em uma soluc a poss o din A partir da recorr encia (2.4) e vel escrever um algoritmo de programac a amica (isto ca es, pode-se simplicar a soluc o. Considere como exerc cio. . .). Mas com base em algumas observac o a o seguinte teorema: Teorema 1: Considere qualquer problema n ao vazio Sij , e seja am a atividade em Sij com tempo de t ermino mais antigo (ou seja, a primeira atividade que terminou). fm = min { fk : ak Sij } Com base no Teorema 1, pode-se armar: utilizada em algum subconjunto de tamanho m (i) a atividade am e aximo de atividades mutuamente compat veis de Sij ; um subconjunto de tamanho m Prova: Suponha que Aij e aximo de atividades mutuamente compat veis com Sij , ordenadas em ordem monotonicamente crescente de tempo de t ermino. Seja ak a primeira atividade em Aij . verdade; (a) se am = ak , prova-se direto que (i) e (b) caso contr ario, constr oi-se o subconjunto Aij = {ak } {am }, cujas atividades s ao disjuntas. Devido a Aij ter o mesmo n umero de elementos que Aij , pode-se armar subconjunto de tamanho m que Aij e aximo de atividades mutuamente compat veis de Sij que inclui a atividade am . vazio, de forma que a escolha de am deixa o subproblema Smj como o (ii) o subproblema Sim e nico que pode ser n u ao vazio. vazio. Ent Prova: Suponha que Sim n ao e ao existe uma atividade ak , tal que fi sk < fk o tamb sm < fm . Tal condic a em implica que ak est a em Sij . Como ak termina antes que am , a escolha de am como atividade com o tempo de t ermino mais antigo n ao est a correta vazio. o). Desta forma, conclui-se que Sim e (chegou-se a uma contradic a t Antes de mostrar porque o Teorema 1 e ao importante, vale ressaltar que a subestrutura tima varia na quantidade: o o o tima para o problema original; de subproblemas usados em uma soluc a de escolhas poss veis para determinar quais os subproblemas que ser ao utilizados.

o proposta anteriormente (utilizando programac o din Na soluc a a amica) para o problema de o de atividades, utilizaram-se dois subproblemas e haviam j i 1 escolhas para se resolver o selec a subproblema Sij . poss No entanto, utilizando-se o Teorema 1, e vel reduzir tais quantidades, passando-se a poss vazio) e tamb utilizar apenas um subproblema (pois e vel garantir que o outro subproblema e em a atividade com tempo mais antigo em passando-se a ter apenas uma escolha para resolver Sij (que e de f o). Sij , a qual e acil determinac a Al em disso, o Teorema 1 possibilita resolver o problema atrav es de uma abordagem top-down, e vez de faz e-lo bottom-up (abordagem esta utilizada em programac ao din amica, conforme exposto no semin ario relativo a este tema). Sendo assim, para resolver o subproblema Sij , primeiro escolhe-se a atividade com tempo de t ermino mais antigo (am ), e ent ao resolve-se Smj (anteriormente, resolvia-se Smj antes). Escolhendo-se sempre a atividade com tempo de t ermino mais antigo, se faz uma escolha poss gulosa. E vel, ent ao, propor um algoritmo guloso. Primeiro ser a discutida uma abordagem recursiva e depois se converter a este algoritmo para uma abordagem iterativa. Algoritmo guloso recursivo dado como: O algoritmo e o recursiva para o problema de selec o de atividades Algoritmo 4 Soluc a a o SELECIONA ATIVIDADE RECURSIVO(s,f ,i,j ) 1: func a s e f s ao, respectivamente os tempos de in cio e t ermino das atividades; e i e j s ao os ndices iniciais do problema Sij que deve ser resolvido 2: mi+1 3: enquanto m < j e sm < fi fac a Encontrar a primeira atividade em Sij 4: mm+1 5: m enquanto 6: se m < j ent ao 7: retorne {am } SELECIONA ATIVIDADE RECURSIVO(s,f ,m,j ) 8: sen ao 9: retorne 10: m se o 11: m func a respons Pode-se descrever o funcionamento do algoritmo como segue: o loop while e avel por , a primeira atividade am que seja compat encontrar a primeira atividade de Sij , isto e vel com ai (uma es de parada se deve ao fato que tal atividade tem sm fi ). O lac das condic o o pode terminar por dois motivos: 1. quando m j , n ao foi encontrada nenhuma atividade compat vel com ai entre as atividades vazio (linha 9), pois m < j e que terminam antes que aj . O retorno do procedimento e Sij = encontrada, o procedimento ir a retornar a uni ao de 2. se uma atividade compat vel com ai e ltimo subconjunto e retornado {am } com o subconjunto de tamanho m aximo de Smj . Este u pela chamada recursiva SELECIONA ATIVIDADE RECURSIVO(s,f,m,j).

SELECIONA ATIVIDADE RECURSIVO(s, f, 0, n + 1), Considerando que a chamada inicial e e supondo que as atividades est ao ordenadas segundo o tempo de t ermino de forma monotonicamente o e (n). Isto porque nas chamadas recursivas realizadas, crescente, temos que o tempo de execuc a examinada na u ltima chamada examina-se uma vez cada atividade no loop while. A atividade ak e feita em que i < k . Caso as atividades n ao estejam ordenadas, gasta-se tempo O(n log n) para tal. Algoritmo guloso iterativo apresentado um vers Agora e ao iterativa para o algoritmo recursivo exposto anteriormente. Este algoritmo tamb em pressup oe que as atividades de entrada estejam ordenadas em ordem monotonicamente crescente por tempo de t ermino. o iterativa para o problema de selec o de atividades Algoritmo 5 Soluc a a o SELECIONA ATIVIDADE ITERATIVO(s,f ) 1: func a s e f s ao, respectivamente os tempos de in cio e t ermino das atividades 2: n comprimento[s] 3: A {1} 4: para todo m 2 at e n fac a 5: se sm fi ent ao 6: A A {am } 7: im 8: m se 9: m para 10: retorne A o 11: m func a ` seO fato de supor que as atividades est ao ordenadas segundo seu tempo de t ermino leva a o: guinte armac a fi = max { fk : ak A } (2.5)

, fi e o tempo de t isto e ermino m aximo de qualquer atividade em A. O funcionamento do algoritmo se d a da seguinte forma: selecionada e ent nas linhas 2 e 3, a atividade a1 e ao inclu da em A e indexada por i; respons o lac o for (linhas 4 a 7) e avel por selecionar a atividade mais antiga a terminar em Si,n+1 , denotada por am ; compat na linha 5 verica-se se am e vel com as demais atividades j a inclu das em A (a partir o (2.5)). Se sim, ela e adicionada a A e a vari denida como m (linhas 6 e da denic a avel i e 7). Supondo que a entrada est a ordenada como necess ario, o procedimento SELECI ONA ATIVIDADE ITERATIVO () tem complexidade (n), assim como o algoritmo recursivo.

2.2. Mais um exemplo: o problema da mochila


tima e utilizada tanto Conforme exposto anteriormente neste trabalho a propriedade de subestrutura o o din ` tentapela programac a amica quanto pelos algoritmos gulosos. No entanto, este fato pode levar a o gulosa quando na verdade seria necess o de programac o tiva de utilizar uma soluc a aria uma soluc a a

o de programac o din o din amica, ou ent ao induzir a desenvolver uma soluc a a amica quando uma soluc a mais simples utilizando algoritmos gulosos seria suciente. O problema exposto a seguir possibilitar a o. identicar as sutilezas de cada tipo de soluc a um problema cl o, e aqui ser O problema da mochila e assico de otimizac a ao abordadas es: o problema da mochila 0-1 e o problema da mochila fracion duas variac o aria. Seja a seguinte o: um ladr congurac a ao que rouba uma loja encontra n itens, onde cada item i vale vi reais e wi quilos, sendo vi e wi inteiros. O ladr ao deseja levar a carga mais valiosa poss vel mas, no entanto, um inteiro). consegue carregar apenas W quilos na sua mochila (W tamb em e De uma maneira mais formal [2]:
n n

maximize
i=1

xi vi

` sujeito a
i=1

xi wi W

o de xi ir onde a denic a a depender do problema sendo tratado. O pr oximo par agrafo denir a xi para cada caso. es s No problema da mochila 0-1, as restric o ao que o ladr ao tem que levar os itens inteiros , xi assume apenas valor inteiro: 0 ou 1), e pode levar um mesmo item apenas uma vez. J (isto e a es de um item, e desta forma xi pode no problema da mochila fracion aria, o ladr ao pode levar frac o tima (a prova assumir valores tal que 0 xi 1. Os dois problemas possuem uma subestrutura o o ca como exerc desta armac a cio...). Pode-se utilizar uma estrat egia gulosa para resolver o problema da mochila fracion aria, mas n ao para resolver o problema da mochila 0-1. Seja o exemplo ilustrado na Figura 2.2 e com a seguinte o: congurac a Item 1 2 3 Valor (R$) 60 100 120 Peso (Kg) 10 20 30 Valor por Kg 6 5 4

(a)

(b)
Figura 2.1: Problema da mochila

(c)

50 Kg. A estrat O peso que a mochila pode suportar e egia gulosa selecionaria primeiro o o escolher o item que possui o maior valor por quilo). item 1 (considerando como crit erio de selec a

` uma No entanto, conforme pode-se observar na Figura 2.2(b) a seguir, a escolha do item 1 n ao leva a o o tima, independente dos itens escolhidos posteriormente (se o item 2 ou o item 3 fossem soluc a escolhidos a mochila n ao poderia ser preenchida totalmente). O problema da mochila 0-1 pode ser o din resolvido atrav es de programac a amica. o, se a estrat No exemplo anterior, vale a pena observar que, com a mesma congurac a egia o o tima utilizada fosse a do problema da mochila fracion aria o problema chegaria a uma soluc a (Figura2.2(c)). No entanto, vamos nos aprofundar um pouco no problema da mochila fracion aria, o a ` s caracter o 1.1 e relacionando sua soluc a sticas gerais dos algoritmos gulosos apresentadas na sec a construindo um algoritmo guloso que resolva este problema. Conforme exposto anteriormente, o problema consiste em
n n

maximize
i=1

xi vi

` sujeito a
i=1

xi wi W

es em vi e wi s es na onde vi > 0, wi > 0 e 0 xi 1, para 1 i n. As condic o ao restric o es em xi s es na soluc o. Como candidatos temos os diferentes objetos inst ancia e as condic o ao restric o a o e dada por um vetor {x1 , . . . , xn } que indica que frac o de cada objeto deve ser inclu e a soluc a a da. o e considerada vi es anteriores. A func o objetivo e o valor Uma soluc a avel se ela respeita as restric o a o de selec o ser total dos objetos na mochila, e a func a a a denida posteriormente.
n

o o tima, Em uma soluc a


i=1

xi wi = W . A estrat egia consiste ent ao em selecionar conveni-

o poss entemente objetos de tal forma a colocar a maior frac a vel do objeto selecionado na mochila, e parar quando a mochila estiver totalmente cheia. dado a seguir. O algoritmo e Algoritmo 6 Problema da Mochila
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:

o MOCHILA(w[1..n], v [1..n], W ) o vetor de pesos, v e o vetor de valores e W e o func a we peso m aximo suportado pela mochila para todo i = 1 at e n fac a vetor contendo a frac o de cada objeto que deve-se selecionar x[i] 0 xe a m para a soma dos pesos dos objetos selecionados at peso 0 peso e e o momento enquanto peso < W fac a loop guloso i o melhor objeto restante veja no texto que segue este algoritmo se peso +w[i] W ent ao x[i] 1 peso peso + w[i] sen ao x[i] (W peso)/w[i] peso W m se m enquanto retorne x o m func a

es de selec o que podem ser utilizadas: Existem tr es func o a 1. escolher a cada est agio o objeto restante que possui o maior valor. O argumento utilizado e que desta forma o valor da carga aumenta t ao r apido quanto poss vel; 2. escolher a cada est agio o objeto restante que possui o menor peso. O argumento utilizado e utilizada t que desta forma a capacidade e ao lentamente quanto poss vel; 3. escolher o item cujo valor por peso seja o maior poss vel. es o timas. Um exemplo As duas primeiras alternativas n ao chegam necessariamente a soluc o o de problema em que isto acontece e o seguinte: de congurac a w v v/w Selecione Max vi Min wi Max vi / wi 10 20 2.0 20 30 1.5 30 66 2.2 xi 1 1 1 40 40 1.0 50 60 1.2 Valor 146 156 164

0 1 1

0 1 1

0.5 1 0

1 0 0.8

o o tima. De fato, isso e sempre verNeste exemplo, a terceira abordagem produziu uma soluc a o o tima para o problema da mochila dade, ou seja, a terceira abordagem sempre conduz a uma soluc a fracion aria, conforme provado a seguir. 2.2.1. Prova de corretude Suponha que os objetos est ao ordenados em ordem decrescente de acordo com o valor por peso, isto : e v2 vn v1 ... w1 w2 wn o encontrada pelo algoritmo guloso. Caso todos os elementos Seja X = {x1 , . . . , xn } a soluc a o e o tima. Caso contr de X possuam valor 1, a soluc a ario, considere j como sendo o menor ndice menor que 1 (neste caso, xi = 1 quando i < j ; xi = 0 quando i > j ; e tal que o elemento xj e n n o de X. a i=1 x1 wi = W ). Seja V (X ) = i=1 x1 vi o valor da soluc o vi Seja tamb em Y = {y1 , . . . , yn } uma soluc a avel qualquer, e desta forma, n i=1 y1 wi n o de Y . W ) e portanto, n ( x y ) wi 0 . Considerando V ( Y ) = y v o valor da soluc a i 1 1 i i=1 i=1 Tem-se ent ao que:
n n

V (X ) V (Y ) =
i=1

(xi yi )vi =
i=1

(xi yi )wi

vi wi

maior ou igual a zero, enquanto vi /wi vj /wj . Quando i < j , xi = 1 e ent ao x i y i e menor ou igual a zero, enquanto vi /wi vj /wj . Por m, Quando i > j , xi = 0 e ent ao xi yi e quando i = j , vi /wi = vj /wj . Assim, em todo caso (xi yi )(vi /wi ) (xj yj )(vj /wj ). Portanto,
n

V (X ) V (Y ) (vj /wj )
i=1

(xi yi )wi 0

o vi Com isso, provou-se que nenhuma soluc a avel possui um valor maior que V (X ), e sendo o X e o tima. assim, a soluc a 2.2.2. Complexidade o do algoritmo pode ser considerada simples. Considerando que o custo m A implementac a nimo para O(n log n), e que o loop guloso ordenar os objetos em ordem decrescente segundo seu valor por peso e facilmente observado no algoritmo), temos que o tempo total de execuc o e , executa n vezes (o que e a o O, O(max(n, n log n)) = O(n log n). segundo a regra da soma da notac a Uma abordagem que seria mais r apida quando fossem necess arios poucos objetos para preencher a mochila seria a de manter os objetos em um heap com o maior valor de vi /wi na raiz. O O(n), enquanto cada ciclo do loop guloso custa O(log n). Vale ressaltar que custo para criar o heap e a an alise no pior caso n ao se altera.

Cap tulo 3

Exemplos de problemas que utilizam uma estrat egia gulosa


Neste cap tulo apresentaremos mais dois exemplos de problemas, utilizando a estrat egia gulosa. S ao eles os C odigos de Huffman e o Problema do Planejamento(scheduling). O primeiro est a relacionado ` compress a ao de dados e o segundo busca organizar tarefas de tal forma que o tempo m edio que minimizado (a denic o de tarefas e sistema pode variar de um caso cada tarefa ca no sistema e a para outro. Mas voc e pode imaginar tarefas como pessoas em uma la de banco e o sistema como o operador de caixa, por exemplo). Optou-se por apresentar os problemas envolvendo grafos separadamente no cap tulo seguinte.

3.1. C odigos de Huffman


indiscut A import ancia da compress ao de dados e vel. De forma simplicada pode-se dizer que ela est a ` vantagens relacionada com maneiras de representar os dados originais em menos espac o, o que leva a tais como: menor espac o necess ario para armazenamento, acesso e transmiss ao mais r apidos, entre o custo de codicac o e decodicac o outros [7]. Existe, claro um custo para tais vantagens, que e a a dos dados. o mais conhecidos s Um dos m etodos de codicac a ao os C odigos de Huffman, cuja id eia o menores aos s ncia. A seguir consiste em atribuir c odigos de representac a mbolos com maior freq ue ser a apresentada a id eia principal do problema de compress ao, bem como os C odigos de Huffman. Suponha que deseje-se armazenar de forma compacta um arquivo de dados que possua es s 100.000 caracteres, cujas distribuic o ao dadas na primeira linha da Tabela 1 a seguir: Tabela1 a ncia (em milhares) Freq ue 45 Palavra de c odigo de comprimento xo 000 Palavra de c odigo de tamanho vari avel 0 b 13 001 101 c 12 010 100 d 16 011 111 e 9 100 1101 f 5 101 1100

Existem diferentes formas de representar este arquivo. Considere o problema de projetar um o), no qual utiliza-se c odigo de caracteres bin arios (que iremos denominar c odigo, por simplicac a nica para representar um caractere. Neste caso, s uma cadeia bin aria u ao duas as abordagens: 18

, utiliza-se uma quantidade xa de bits para utilizar um c odigo de comprimento xo, isto e representar cada caractere. No exemplo em quest ao, seriam utilizados 3 bits para representar cada um dos seis caracteres (veja a segunda linha da Tabela 1). Como o arquivo possui 100.000 caracteres, seriam necess arios 300.000 bits para codic a-lo. utilizar um c odigo de comprimento vari avel, o qual possui um desempenho melhor que o item ncia s anterior. Nesta abordagem, caracteres que aparecem com maior freq ue ao representados por uma cadeia de bits menor do que caracteres que aparecem pouco. No caso do exemplo, ncia (45) e representada por um u nico bit, enquanto o o caractere a que possui a maior freq ue representado por 4 bits (veja a terceira linha caractere f, que aparece apenas 5 vezes no texto e da Tabela 1). Para representar o arquivo inicial seriam necess arios 224.000 bits (somat orio ncia de cada caractere vezes n da freq ue umero de bits necess arios para codic a-lo, no caso o de do exemplo, 45*1 + 13*3 + 12*3 + 16*3 + 9*4 + 5*4). Com isso, h a uma reduc a aproximadamente 25% do espac o necess ario para armazenamento. 3.1.1. C odigos de prexo o, ser Com o objetivo de facilitar a codicac a ao considerados apenas c odigos de prexo, que s ao prexo de alguma outra palavra de c aqueles onde nenhum c odigo e odigo (desta forma, n ao teremos importante ressaltar que esta casos onde existem no mesmo problema os c odigos 010 e 0101). E o n ` uma perda de generalidade, pois a compress tima que pode ser obtida restric a ao leva a ao de dados o por meio de um c odigo de caracteres sempre pode ser alcanc ada com um c odigo de prexo. obtido atrav o das palavras de c Um c odigo de caracteres bin arios e es da concatenac a odigo que representam cada caractere. Exemplo: ao codicar os caracteres abc utilizando c odigo de prexo de tamanho vari avel, conforme dados da Tabela 1, ter amos 0 101 100 = 0101100. o, como estamos utilizando c Na decodicac a odigos de prexo de tamanho vari avel, sabemos amb que a palavra que comec a um arquivo codicado n ao e gua (por exemplo: temos que o caractere representado por 101, e devido a ` utilizac o de c be a odigos de prexo, sabemos que nenhuma outra palavra comec a com 101. Sendo assim, se um arquivo possui como primeiros bits 1, 0 e 1, tem-se que o pega-se a palavra inicial o primeiro caractere do arquivo s o pode ser b). Desta forma, na decodicac a do arquivo, e ent ao a decodica, tira do arquivo e repete-se o processo com o arquivo resultante. o e preciso uma representac o conveniente para o Entretanto, neste esquema de decodicac a a rvore bin c odigo de prexo, a qual pode ser obtida atrav es de uma a aria, cujas folhas representam os caracteres. Uma palavra de c odigo para um determinado caractere pode ser interpretado como o cami nho representado percorrido da raiz at e o caractere, sendo que o caminho indo para o lho da esquerda e por 0 e para o lho da direita por 1. rvores da Figura 3.1.1, onde a a rvore (a) representa o c Considere as a odigo de comprimento rvore do c o de problema da xo e (b) a a odigo de comprimento vari avel, ambas para a congurac a Tabela 1. rvore (b) para chegar ao caractere d percorremos o caminho 1, 1, 1, isto e , na a rvore Na a caminha-se para o lho da direita 3 vezes para alcanc ar a folha que representa o caractere d (isso facilmente observado na Figura anterior). e que uma a rvore bin rvore onde Um fato importante a ser considerado e aria completa (uma a folha tem dois lhos) corresponde a um c timo. Observando cada no que n ao e odigo de prexo o rvore (a) n completa. Sendo assim, o c novamente a Figura 3.1.1, vemos que a a ao e odigo de prexo

(a)

(b)

da Tabela 1 Figura 3.1: Arvores correspondentes aos esquemas de codicac ao

o timo. A a rvore B por sua vez, e completa, e desta forma de tamanho xo do nosso problema n ao e o timo. podemos armar que o c odigo de prexo de tamanho vari avel do nosso problema e timo, podemos restringir a atenc o somente a `s Como estamos interessados em um c odigo o a rvores bin a arias completas. Neste caso, considere C o alfabeto de onde os caracteres s ao obtidos e ncias de caracteres s rvore para um tamb em considere que as freq ue ao positivas. Temos ent ao que a a timo ter c odigo de prexo o a exatamente |C | folhas (ou seja, uma folha para cada item do alfabeto), rvore bin e |C | 1 n os internos (sendo que o n umero de n os de grau 2 em qualquer a aria n ao vazia e o). uma unidade menor que o n umero de folhas. Isso pode ser provado por induc a Pode ser observado que o tamanho da palavra de c odigo para um determinado caractere e ` profundidade deste caractere na a rvore. Observe, pela Figura 3.1.1, que a profundidade da igual a rvore e tr exatamente o tamanho da palavra de c folha que representa o caracter d na a es, que e odigo ncia que cada caractere aparece no arquivo tamb que representa este caractere (111). A freq ue em conhecida. Com estes dados, podemos denir o custo de uma a rvore que representa um c e odigo de prexo, ou seja, podemos determinar facilmente quantos bits ser ao necess arios para codicar o arquivo. rvore T correspondente a um c ncia do caractere c Sendo uma a odigo de prexo, f (c) a freq ue rvore (tem-se f (c) e c para todo c C ). Ent e dT (c) a profundidade da folha de c na a ao o custo da rvore T e : a B (T ) =
cC

f (c) dT (c)

(3.1)

o de um c 3.1.2. A construc a odigo de Huffman um guloso que produz um A seguir ser a apresentado um algoritmo do C odigo de Huffman, que e timo, e ap o (baseando-se na propriedade de escolha c odigo de prexo o os ser a provada sua correc a tima, que foram abordadas na sec o 1.2). gulosa e subestrutura o a

Algoritmo 7 C odigos de Huffman o HUFFMAN(C ) 1: func a 2: n |C | 3: QC 4: para todo i = 1 at e n 1 fac a 5: alocar um novo n oz 6: esquerda[z ] x EXTRAI MIN(Q) 7: direita[z ] y EXTRAI MIN(Q) 8: f [z ] f [x] + f [y ] 9: INSIRA(Q, z ) 10: m para 11: retorne EXTRAI MIN(Q) o 12: m func a inicializada O funcionamento do algoritmo se d a da seguinte forma: a la de prioridades Q e na linha 2, recebendo os elementos de C. De forma geral, o objetivo d lac o for nas linhas 4-10 e ncia (n substituir, na la de prioridades, os dois n os de mais baixa freq ue os x e y , no caso do algoritmo), o. por um novo n o (z ) que representa sua intercalac a lho da esquerda e qual e O novo n o z possui como lhos x e y ( e indiferente qual deles e lho da direita, pois independentemente da ordem o c odigo ter a o mesmo custo), e como frequ encia a ncias de x e y . Ap es, retorna-se a raiz da a rvore na linha 9. soma das freq ue os n 1 intercalac o descrito a seguir na Figura 3.2 (pr O funcionamento do algoritmo e oxima p agina). 3.1.3. Prova de corretude o do algoritmo, ser Conforme exposto, para provar a correc a a mostrado que o problema de determinar tima. Sejam um c odigo de prexo otimo exibe as propriedades de escolha gulosa e de subestrutura o v os dois lemas seguintes (o primeiro mostra que a propriedade de escolha gulosa e alida e o segundo timos tem a propriedade de subestrutura o tima). que o problema de construir c odigos de prexo o

Figura 3.2: Funcionamento do algoritmo de Huffman

ncia f [c]. Sejam x e y dois Lema 1: Seja C um alfabeto em que cada caractere c C tem freq ue ncias mais baixas. Ent timo para c caracteres em C que tem as freq ue ao, existe um c odigo de prexo o ltimo bit. no qual as palavras de c odigo para x e y t em o mesmo comprimento e diferem apenas no u modicar uma a rvore que possua um c timo em uma Prova do lema 1: a id eia e odigo de prexo o rvore que possua um outro c timo, de tal forma que os caracteres x e y aparec a odigo de prexo o am rvore. Se isso for feito, as palavras de c como folhas irm as na profundidade m axima da nova a odigo ltimo bit. para x e y ter ao o mesmo comprimento e ir ao diferir apenas no u Considere a Figura 3.3 a seguir.

Figura 3.3: Passo chave do lema 2

rvore T , os caracteres a e b representam folhas irm Na a as de profundidade m axima. Suponha que f [a] f [b] e f [x] f [y ] (isso n ao implica em perda de generalidade). Disso decorre que ncias mais baixas de folhas). f [x] f [a] e f [y ] f [b] (sendo que f [x] e f [y ] s ao as duas freq ue rvore T e resultado da permutac o de a com x em T , e a a rvore T e resultado da troca Aa a o (3.1) a diferenc 0, assim como a diferenc de b com y em T . Pela equac a a de custo entre T e T e a 0 (isso pode ser facilmente vericado utilizando a equac o (3.1). de custo entre T e T tamb em e a igual a ` profundidade de a em T , e vice-versa). Dica: observe que a profundidade de x em T e o tima, B (T ) B (T ), o que implica que Ent ao, temos que B (T ) B (T ) e, como T e uma a rvore o tima na qual os caracteres x e y aparecem como B (T ) = B (T ). Desta forma, T e folhas de profundidade m axima, e a partir disso decorre o Lema 1. ncia f [c] denida para cada caractere c C . Sejam dois Lema 2: Seja C um dado alfabeto com freq ue ncia m caracteres x e y em C com freq ue nima. Seja C o alfabeto C com os caracteres x, y removidos e o (novo) caractere z adicionado, de forma que C = C {x y } {z }; dena f para C como rvore representando um c para C , exceto pelo fato de que f [z ] = f [x] + f [y ]. Seja T qualquer a odigo timo para o alfabeto C . Ent rvore T, obtida a partir de T pela substituic o do n de prexo o ao a a a o de timo para folha para z por um n o interno que tem x e y como lhos, representa um c odigo de prexo o o alfabeto C . mostrar que o custo B (T ) da a rvore T pode ser expresso em Prova do lema 2: o primeiro passo e rvore T . Tem-se que para todo c C {x, y }, dT (c) = dT (c), e desta termos do custo B (T ) da a forma f [c] dT (c) = f [c] dT (c). Com menos formalidade, para todos os caracteres c exceto para rvore T e igual a ` sua profundidade em T . Em resumo, tirando-se os x e y , a sua profundidade na a rvores s caracteres x e y de T e o caractere z de T , os custos das duas a ao iguais. igual a ` profundidade de z +1 em T, isto e : dT (x) = dT (y ) = A profundidade de x e y em T e dT (z ) + 1. Assim, temos que: f [x]dT (x) + f [y ]dT (y ) = (f [x] + f [y ]) (dT (z ) + 1) = f [z ]dT (z ) + f [x] + f [y ] Pode-se concluir ent ao que

B (T ) = B (T ) + f [x] + f [y ] ou, equivalentemente, B (T ) = B (T ) f [x] f [y ] o. Vamos supor que a a rvore T n A partir de tais fatos, podemos provar o lema por contradic a ao timo para C . Ent rvore T tal que B (T ) < B (T ). represente um c odigo de prexo o ao existe uma a rvore T com o pai comum de x e y Pelo lema 1, T tem x e y como irm aos. Por m, seja T a a ncia f [z ] = f [x] + f [y ]. Assim, substitu do por uma folha z com freq ue B (T ) = B (T ) f [x] f [y ] < B (T ) f [x] f [y ] = B (T ) o para a hip Neste ponto chegou-se a uma contradic a otese (que T representa um c odigo de timo para C ), e desta forma T deve representar um c timo para C . prexo o odigo de prexo o imediata: A partir dos lemas 1 e 2, a prova do teorema a seguir e timo. Teorema 2: O procedimento HUFFMAN produz um c odigo de prexo o apresentada a compress Em [7], p. 327, e ao de Huffman utilizando palavras, que possui as consimesmas id eias b asicas que o caso apresentado neste trabalho: cada palavra diferente do texto e ncias s derado um s mbolo, suas respectivas freq ue ao determinadas e ent ao um c odigo de Huffman e gerado para representar as palavras. 3.1.4. Complexidade implementada como um heap Na an alise da complexidade do algoritmo 7, suponha que a la Q e rvore bin bin ario (denido como um objeto arranjo que pode ser visto como uma a aria praticamente o da linha 3 pode ser completa. Mais detalhes podem ser obtidos em [3], p. 103). A inicializac a o 6.3 em [3], p. 107). realizada em O(n) (veja a sec a o, sendo que o loop e executado n 1 O loop for contribui O(n log n) no tempo de execuc a o de heap exige tempo O(log n). Sendo assim o tempo total de execuc o do vezes e cada operac a a O(n log n). algoritmo para uma entrada de tamanho n e

3.2. Planejamento (scheduling)


organizar tarefas de tal forma que o tempo m miniA id eia e edio que cada tarefa ca no sistema e aquele onde cada tarefa possui um prazo de t mizado. Um problema mais complexo e ermino, e o maximizar o lucro (este lucro depender do t ermino da tarefa no prazo. Neste problema, o objetivo e apresentado em [2], p.207). problema e No nosso exemplo, vamos pensar em um sistema como sendo um caixa de banco, e em uma ent tarefa como um cliente. O objetivo e ao minimizar o tempo que cada cliente espera desde quando

entra no banco at e o momento em que termina de ser atendido. Formalizando um pouco, temos n clientes, sendo que cada cliente i ir a exigir um tempo de servic o ti (1 i n), e queremos minimizar o tempo m edio que cada cliente i gasta no sistema. xo, o problema e minimizar o tempo total gasto no Como n (n umero de consumidores) e : sistema por todos os clientes, isto e
n

T =
i=1

(tempo no sistema gasto pelo consumidor i)

Agora um exemplo pr atico: suponha que existam tr es clientes, com t1 = 5, t2 = 10 e t3 = 3. As poss veis ordens que os clientes podem ser atendidos s ao: Ordem 123 132 213 231 312 321 T 5 + (5 + 10) + (5 + 10 + 3) = 38 5 + (5 + 3) + (5 + 3 + 10) = 31 10 + (10 + 5) + (10 + 5 + 3) = 43 10 + (10 + 3) + (10 + 3 + 5) = 41 o o tima) 3 + (3 + 5) + (3 + 5 + 10) = 29 (soluc a 3 + (3 + 10) + (3 + 10 + 5) = 34

o e simples: a primeira linha indica que o cliente 1 foi atendido imediatamente, A interpretac a o cliente 2 precisou esperar pelo cliente 1 e o cliente 3 precisou esperar os dois anteriores serem atendidos. o da soluc o o tima encontrada foi a seguinte: atende-se os Pode-se observar que a congurac a a o o sistema, isto e , quem gasta menos tempo e atendido clientes segundo o tempo que eles utilizac a antes. o resulta em um planejamento o timo, pense em um algoritmo Para provar que esta congurac a timo item a item. Suponha que ap guloso que constr oi o planejamento o os os clientes i1 , i2 , . . . , im o tivessem suas tarefas agendadas, fosse adicionado o cliente j . O tempo em T neste momento e o tempo necess tempo necess ario para os clientes i1 , i2 , . . . , im , mais tj , que e ario para o novo cliente j. Como um algoritmo guloso nunca rev e as escolhas j a realizadas (ou seja, ele n ao vai alterar a o feita para os clientes i1 , i2 , . . . , im ), o que podemos fazer e minimizar tj . Desta forma, o congurac a algoritmo guloso se torna simples, pois a cada passo seleciona-se entre os clientes que restam aquele que necessita de menos tempo, e coloca-o no nal da lista de agendamentos. 3.2.1. Prova de corretude preciso provar que este algoritmo guloso e o timo. Considere ent Agora e ao P = p1 p2 . . . pn como o de inteiros de 1 at sendo qualquer permutac a e n, e seja si = Tpi . Se os clientes s ao atendidos na ordem P, ent ao o i- esimo cliente necessitar a de um tempo si para ser atendido. O tempo gasto por ent todos os clientes e ao: T (P ) = s1 + (s1 + s2 ) + (s1 + s2 + s3 ) + . . . = ns1 + (n 1)s2 + (n 3)s3 + . . .

=
k=1

(n k + 1)sk

Suponha agora que P n ao esteja organizado de forma crescente segundo os tempos de servic o. , o a- atendido Ent ao podem existir dois inteiros a e b, tal que a < b e sa > sb , isto e esimo cliente e antes mesmo exigindo mais tempo que o b- esimo cliente. Observe a Figura 3.4.

Figura 3.4: Trocando dois clientes de lugar

trocar a ordem do cliente a com a do cliente b, o que leva o cliente que O que fazemos e o de gasta menos tempo a ser atendido antes. Com essa troca, temos uma nova ordem de congurac a o, o tempo total gasto no servic os, que denominaremos P . Caso P seja utilizado como congurac a : sistema por todos os clientes e
n

(n a + 1)sb + (n b + 1)sa +
k=1; k=a,b

(n k + 1)sk

Se zermos a diferenc a entre P e P , temos que: T (P ) T (P ) = (n a + 1)(sa sb ) + (n b + 1)(sb sa ) = (b a)(sa sb) > 0 o P e melhor, pois possui um custo menor que Pode-se observar ent ao que a congurac a o da Figura 3.4. Comparando as P . O mesmo racioc nio pode ser realizado atrav es da observac a es P e P , vemos que os tempos de sa ltimos clientes congurac o do dos a 1 primeiros e os n b u o para outra. n ao s ao alterados mudando de uma congurac a o P pode-se observar que os clientes nas posic es a + 1 . . . b 1 deixam o Na congurac a o sistema antes, sendo que o cliente b gasta menos tempo que o cliente a. Em resumo: como b deixa de es a+1 . . . b-1) tamb utilizar o sistema antes, os demais clientes (neste caso, os clientes das posic o em s ao atendidos antes. poss De acordo com o que foi exposto, pode-se ver que e vel melhorar o funciomento de sistemas que possuam atividades que demoram mais tempo executando antes que atividades que de nicos planejamentos que restam s mandam menos tempo. Com isso, os u ao aqueles onde as tarefas

(ou no nosso exemplo, os clientes) est ao organizadas de acordo com os tempos demandados para o do servic timos. realizac a o, e desta forma tamb em s ao o 3.2.2. Complexidade o do algoritmo para realizar tal tarefa, o essencial e ordenar os clientes em ordem Na implementac a crescente de acordo com os tempos de servic o, o que custa no m nimo O(n log n). Escrever o algoritmo ca como exerc cio.

Cap tulo 4

Algoritmos Gulosos em Grafos


rvore geradora m Em seguida, s ao apresentados dois algoritmos para se descobrir a a nima em um grafo conexo e ponderado, um problema que cobre muitos casos de interesse pr atico como em redes de computadores. apresentado um algoritmo para se computar o caminho m Finalmente, e nimo em um grafo. de muito interesse em v reas da computac o como a de otimizac o de Este problema tamb em e arias a a a projeto de circuitos l ogicos. es relativas a grafos. Recomendamos que voc O Anexo 1 apresenta algumas denic o e o leia antes de continuar este cap tulo, pois ser a poss vel relembrar alguns conceitos.

4.1. Arvore geradora m nima


, onde a cada aresta e atribu Supondo um grafo valorado, isto e do um peso, podemos distinguir as rvores geradoras desse grafo em relac o a ` soma total dos pesos. Temos aqui um problema intea a rvore que minimiza essa soma? Vamos chamar esta a rvore de a rvore ressante: como identicar a a geradora m nima de tal grafo. rvore geradora m Para identicar a a nima de um grafo, existem dois algoritmos bastante conhecidos Kruskal e Prim que apresentam a propriedade gulosa e resolvem o problema. Esses algoritmos podem ser usados para se denir a topologia m nima e de custo m nimo de o que relacionasse uma rede durante o projeto da mesma. Os pesos, nesse caso, poderiam ser uma func a as dist ancias entre os roteadores e o custo do cabeamento. Um outro uso do destes algoritmos, seria us a-los em conjunto com algoritmos de roteamento din amicos. Tais algoritmos recalculam as rotas entre os roteadores da rede sempre que h a necessidade. Por exemplo, quando o tr afego aumenta muito entres dois roteadores (modicando os pesos das arestas do grafo da rede) ou quando uma falha f sica elimina uma ou mais rotas (modicando o grafo da rede). rvore de menor custo indicaria a melhor rota que conectasse todos os roteadores. Nesses casos, a a o a velocidade ou o throughput da rede. Melhor, neste caso leva em considerac a Seja G = (V, E ) um grafo conexo n ao direcionado e valorado. O problema consiste em rvore e a soma dos pesos e a menor poss achar um subconjunto A de E , tal que A forme uma a vel. es: Aplicando o algoritmo Guloso nesse caso, teremos as seguintes denic o 28

um conjunto de arestas distintas de G. O conjunto S de candidatos e vi O conjunto S e avel se ele n ao cont em nenhum circuito. uma soluc o se ele cont O conjunto S e a em todos os v ertices de G. promissor se ele pode ser completado para produzir uma soluc o Um conjunto S de arestas e a tima. Em particular, o conjunto vazio e promissor. o Uma aresta toca um conjunto S de v ertices se exatamente um v ertice ligado por essa aresta existe em S . 4.1.1. Algoritmo de Kruskal Funcionamento do algoritmo vazio, e supomos um grafo nulo composto Seja G = (V, E ) um grafo de n v ertices. No in cio, A e , um grafo de n v o conjunto das arestas de dos n v ertices (isto e ertices isolados). O conjunto B e G. Selecionamos a aresta de B que tem o menor valor. Se ela conecta dois componentes diferentes, colocamo-la no conjunto A e juntamos os dois componentes para formar um novo componente. Se rejeitada, dado que isso formaria um circuito. ela liga dois v ertices de um mesmo componente, ela e o de um u nico componente. Nesse caso, o conjunto A constitui uma Continuamos assim at e a obtenc a o. soluc a Para ilustrar o funcionamento do algoritmo considere o grafo da Figura 4.1. O pseudoc odigo apresentado no algoritmo 8 e est de Kruskal e a baseado em [3]. O funcionamento passo a passo e mostrado na gura 4.2.

Figura 4.1: Grafo do qual se deseja a arvore geradora m nima

Algoritmo 8 AGM Kruskal


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:

o K RUSKAL(G) func a Entrada: G = (V, E ), custo : E + . Sa da: A (AGM) A Conjunto de arestas de A C Conjunto de componentes para todo v V fac a C C + {v } m para ordene as arestas de E em ordem n ao decrescente de peso para cada aresta {x, y } E , em ordem n ao decrescente fac a seja cx e cy os conjuntos de x e de y em C se cx = cy ent ao A A + {x, y } C C cx cy + {(cx cy )} m se m para cada retorne A o m func a

Figura 4.2: Kruskal: passo a passo

: {a, b}, {b, c}, Na Figura 4.2, o conjunto de A de arestas ordenadas pelo seu peso igual e {d, e}, {f, g }, {a, d}, {b, e}, {d, g }, {c, e}, {b, d}, {c, f }, {e, g } e {e, f }. O algoritmo funciona como segue:

Passo Inicializac a o 1 2 3 4 5 6 7 {d, g }. Prova de corretude

Aresta considerada {a, b} {b, c} {d, e} {f, g } {a, d} {b, e} {d, g }

Componentes conectados {a} {b} {c} {d} {e} {f } {g } {a, b} {c} {d} {e} {f } {g } {a, b, c} {d} {e} {f } {g } {a, b, c} {d, e} {f } {g } {a, b, c} {d, e} {f, g } {a, b, c, d, e} {f, g } Rejeitada {a, b, c, d, e, f, g }

Ao nal do algoritmo, A cont em as arestas escolhidas {a, b}, {b, c}, {d, e}, {f, g } {a, d} e

rvore geradora de peso m Teorema: o algoritmo de Kruskal encontra uma a nimo. por induc o matem Prova 1: A prova e a atica no n umero de arestas no conjunto A. N os promissor, i.e, pode nos levar a ` soluc o o tima, em qualquer est precisamos mostrar que se A e a agio do algoritmo, ent ao ele continuar a sendo promissor quando uma aresta extra for adicionada. Quando o uma soluc o para nosso problema. Desde que A continue sendo promissor ent algoritmo p ara, A e a ao o: O conjunto vazio e o e o tima. Base da induc promissor pois o nosso grafo G e conexo e a soluc a a o: Assuma que A e o, existe uma soluc o. Passo da induc um conjunto promissor assim, por denic a a a no exato momento em que iremos adicionar a aresta e = {u, v }. As arestas em A dividem os n os de G em dois ou mais componentes conexos; o n o u est a em um desses componentes e v est a em um componente diferente. Seja B o conjunto de n os no componente que inclui u. Temos, um subconjunto estrito de n , ele n O conjunto B e os de G. Isto e ao inclui v . um conjunto promissor de arestas tais que nenhuma aresta em A deixa B . Para uma aresta Ae qualquer em A ou ela liga dois v ertices em B ou ela nem est a em B . a aresta de menor peso que deixa B (todas as arestas com peso menor, ou foram adicionada ee a A ou foram rejeitadas por estarem no mesmo componente conectado). es acima satisfeitas, podemos concluir que o conjunto A {e} tamb A partir das condic o em promissor. Isto completa a nossa prova. Dado que A continua um conjunto promissor em qualquer e uma simples soluc o mas a soluc o o tima [2]. est agio do algoritmo, quando o algoritmo p ara A n ao e a a Prova 2: (por matr oides). Vamos denir um conjunto de independ encia I de G = (V, E ) um grafo ac um matr como I = {X E : G[X ] e clico}. Ent ao, provando que M = (E, I ) e oide, rvore de peso m podemos usar o teorema 1 para provar que o algoritmo de Kruskal devolve uma a nimo. Vamos provar a propriedade de troca dado que as outras duas s ao diretas. o. Seja A e B dois conjuntos de I tal que Vamos provar esta propriedade por contradic a |A| < |B |. Suponha que n ao exista aresta em b tal que (A + e) I . Seja G1 , . . . , Gk o conjunto de componentes conexos de G[A], cada grafo Gi com ni v ertices e ni 1 arestas. Ent ao cada aresta de B liga v ertices de um mesmo componente em G[A]. Como o n umero m aximo de arestas de um grafo ni 1. Portanto, n 1, a quantidade m ac clico com n v ertices e axima de arestas de B em Gi e |B | (n1 1) + (n2 1) + . . . + (nk 1) = |A|, (4.1)

contrariando o fato de |A| < |B | [3]. o). Suponha por absurdo que o algoritmo de Kruskal n Prova 3: (por contradic a ao encontra uma AGM (Arvore Geradora M nima). Seja K = {e1 , e2 , . . . , en1 } as arestas selecionadas pelo algoritmo de Kruskal, nesta ordem. Seja i o maior ndice tal que {e1 , e2 , . . . , ei1 } pertence a alguma rvore geradora de custo m a nimo, mas ei n ao pertence, i.e, {e1 , e2 , . . . , ei } n ao pertence a nenhuma AGM. Seja T uma AGM contendo {e1 , e2 , . . . , ei1 }. Vamos considerar o exato momento em que o algoritmo Kruskal insere a aresta ei . Ent ao ei + T , cont em um circuito, digamos C . Ent ao deve existir uma outra aresta f de C que n ao est a em K (pois caso todas fossem, K teria um circuito, contrariando rvore). Certamente, o custo de f e pelo menos o custo de ei , pois o algoritmo de o fato de K ser a uma aresta de menor custo tal que {e1 , e2 , . . . , ei1 } + ei Kruskal escolheu ei exatamente porque e uma a rvore geradora de custo menor ou igual a T . n ao contivesse circuito. Ent ao, T = T + ei f e uma AGM, T tamb Como T e em deve ser. Isto contradiz o fato de {e1 , e2 , . . . , ei } n ao pertencer a nenhuma AGM [3]. Complexidade o utilizada para manipular conA complexidade do algoritmo de Kruskal depende da implementac a o dos valores de E consome O(|E | log |E |) [3]. juntos. Note que a ordenac a o usa um vetor, indexado pelos v Vetor de etiquetas. Esta implementac a ertices de G, onde o tem um valor (etiqueta) diferente inicialmente. Encontrar a etiqueta de um conjunto concada posic a some O(1). Para fazer a uni ao de dois conjunto podemos trocar todas as etiquetas de um dos conjuntos o pelo do outro, gastando tempo O(|V |). Como fazemos (|V | 1) uni oes, temos uma implementac a 2 de complexidade de tempo O(|E | log |E | + |V | ). o da estru Estrutura para conjuntos disjuntos (Union-Find). Considere a implementac a tura de dados de conjuntos disjuntos atrav es da oresta de conjuntos disjuntos com as heur sticas de o e compress a implementac o assintoticamente mais uni ao por ordenac a ao de caminho, pois essa e a o do conjunto A pode ser feita em O(1). r apida conhecida. A inicializac a o dos conjuntos de componentes consome O(|V |) pois cada conjunto ter A inicializac a a1 es FIND e v ertice e temos |V | v ertices. O loop da linha 8 do algoritmo executa O(|E |) operac o es de construc o dos UNION sobre a oresta de conjuntos disjuntos. Juntamente com as |V | operac o a es consomem o tempo O((|V | + |E |)|V |) onde e uma conjuntos de componentes, essas operac o o de crescimento muito lento (inverso da func o de Ackermann). Pelo fato de G ser supostafunc a a es sobre conjuntos disjuntos demoram mente conectada, temos |E | |V | 1, e assim, as operac o tempo O(|E ||V |). Al em disso, tendo em vista que |V | = O(log |V |) = O(log |E |), o tempo de o total do algoritmo de Kruskal e O(|E | log |E |). Observando que |E | < |V |2 , tempos que execuc a o do algoritmo de Kruskal log |E | = O(log |V |), e portanto podemos redenir o tempo de execuc a como O(|E | log |V |). 4.1.2. Algoritmo de Prim que ele seleciona a melhor aresta sem se preoA principal caracter stica do algoritmo de Kruskal e uma proliferac o de a rvores que cupar com a conex ao das arestas selecionadas antes. O resultado e a rvore. eventualmente se juntam para formar uma a rvore s J a que sabemos que no nal temos que produzir uma a o, por que n ao tentar fazer com rvore cresc o da a rvore geradora m que uma a a naturalmente at e a obtenc a nima? Assim, a pr oxima

` arvore que j a id aresta selecionada seria sempre uma que se conecta a a existe. Essa e eia do algoritmo de Prim. rvore a partir de um v A id eia do algoritmo consiste em comec ar uma a ertice qualquer, e ir rvore com arestas, sempre mantendo-a ac incrementando esta a clica e conexa. A pr oxima aresta a ser guloso. A chave para se ter inclu da deve ser uma de menor peso, da porque este algoritmo tamb em e o para este algoritmo e fazer a busca da pr uma boa implementac a oxima aresta de forma eciente. apresentado no algoritmo 9 e est O pseudoc odigo de Prim e a baseado em [3] e [2]. Algoritmo 9 AGM Prim
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:

o P RIM(G, r) func a Entrada: G = (V, E ), w : E + . Sa da: A (AGM) V Q. Inicialmente A e vazio QV O conjunto de v ertices inseridos em A e para todo v Q fac a peso(v ) pred(v ) N U LL m para peso(v ) 0 enquanto Q = fac a inserido a aresta {u, pred(u)} em A u ExtraiM in(Q) E para cada v ertice v adjacente a u fac a se v Q e w(u, v ) < peso(v ) ent ao pred(v ) u peso(v ) w(u, v ) Decrementa o peso m se m para cada m enquanto o m func a

Para entender o funcionamento do algoritmo considere novamente o grafo da Figura 4.1. O apresentado na Figura 4.3. passo a passo do algoritmo e O algoritmo funciona como segue: arbitrariamente selecionamos o v ertice a como inicial. Passo Inicializac a o 1 2 3 4 5 6 Aresta considerada {a, b} {b, c} {a, d} {d, e} {d, g } {g, f } N os conectados {a} {a, b} {a, b, c} {a, b, c, d} {a, b, c, d, e} {a, b, c, d, e, g } {a, b, c, d, e, f, g }

O resultado A = {a, b}, {b, c}, {a, d}, {d, e}, {d, g } e {g, f }.

Prova de corretude rvore geradora de peso m Teorema: o algoritmo de Prim encontra uma a nimo.

Figura 4.3: Prim: passo a passo

v rvores constru Prova 1: vamos supor que o teorema e alido para a das com at e m arestas. rvores constru verdadeiro. Vamos provar que para a das com m + 1 arestas, o teorema tamb em e Vamos provar este passo por contradic a ao seja v alido para m + 1 arestas. o: suponha que o teorema n rvore encontrada na iterac o anterior, e a pr Neste caso, seja T = (V , E ) a a a oxima aresta de menor rvore o tima tal que T e subgrafo de T . Assim, T + e tem peso ligando V a V V , e T uma a apenas um circuito. Certamente deve existir uma aresta f = e ligando v ertices em V e V V pois uma a rvore m se ao ligar e criamos um circuito. Portanto T + e f tamb em e nima, contrariando o rvore o tima englobando T e e [3]. fato de n ao existir a falso. Ent rvore T gerada o tima (note Prova 2: suponha que o teorema e ao deve existir uma a rvore que e expand rvore de peso m aa rvore contendo apenas o que uma a vel para uma a nimo e rvore gerada que n expand rvore o tima. Seja e a v ertice r). Seja T uma menor a ao e vel para uma a ltima aresta inserida em T e T = (T e). Seja T uma expans rvore o tima. u ao de T para uma a Assim, T + e tem um circuito. Remova a aresta f deste circuito, tal que f = e e f tem apenas uma uma AGM, contrariando a escolha de extremidade nos v ertices de T . Pela escolha de e, T + e f e T [3].

Complexidade o utilizada para manipular conjuntos A complexidade do algoritmo de Prim depende da implementac a [3]. Heap bin ario. Podemos usar a rotina Constr oi-Heap nos passos 1-5, com complexidade o do loop do passo 8, e removido um elemento de Q, e portanto de tempo O(|V |). A cada iterac a iterado por |V | vezes. Como o ExtraiMin(Q) e executado em tempo O(log |V |), o passo 9 o loop e executado O(|V | log |V |). O loop do passo 8 juntamente com o loop do passo 10 percorre todas e as arestas, visitando cada uma duas vezes, uma para cada extremidade. Portanto, os passos 11-13 uma operac o de decrementac o, que s ao executados O(|E |) vezes. Especicamente o passo 13 e a a em um heap bin ario pode ser implementado em tempo O(log |V |). Finalmente, o tempo total desta o e O(|V | log |V | + |E | log |V |), i.e, O(|E | log |V |). implementac a Para exemplicar, suponha: V = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Peso = 9, 7, 10, 8, 14, 16, 4, 2, 3, 1 PosHeap = 2, 5, 6, 4, 3, 1, 9, 8, 7, 10

Figura 4.4: Estrutura de dados heap

a estrutura de Arvores balanceadas. Outra estrutura que tamb em pode ser utilizada e rvore AV L. Nesta a rvore, temos a construc o da a rvore em O(n log n) e qualquer consulta, inserc o a a a o em O(log n). Portanto, a complexidade do algoritmo usando esta estrutura tamb ou remoc a em e O(|E | log |V |).

4.2. Caminho m nimo grafo


o pred[]. Para representar o caminho m nimo de um v ertice s at e um v ertice v , usaremos uma func a o e respons o predecessor de um dado v Esta func a avel por dizer quem e ertice. Deste modo, estando em um v ertice y e tendo que pred[x] = y sabemos que chegamos em x a partir de y . O algoritmo que iremos considerar utiliza a t ecnica de relaxamento. Para cada v ertice u V , manteremos um atributo d[v ] que ser a um limitante superior para um caminho m nimo de s a v . De fato, a cada momento, usando pred, teremos um caminho de peso d[v ]. Os valores de pred[v ] e feito pelo d[v ] devem ser inicializados pelo algoritmo 10. O relaxamento sobre uma aresta (u, v ) e algoritmo 11. O valor de d[v ] signica que h a um caminho de s para v com peso d[v ].

Algoritmo 10 InicializeCaminhoM nimo


1: 2: 3: 4: 5: 6: 7:

procedimento I NICIALIZE C AMINHO M I NIMO (G, s) para cada v ertice v V fac a d[v ] pred[v ] N U LL m para cada d[s] 0 m procedimento

Entrada: G = (V, E )

Algoritmo 11 Relax 1: procedimento R ELAX (u, v, w ) 2: se d[v ] > d[u] + w(u, v ) ent ao 3: d[v ] > d[u] + w(u, v ) 4: pred[v ] u 5: m se 6: m procedimento

Entrada: v ertice u e v e conjunto de pesos das arestas (w)

4.2.1. Algoritmo de Dijkstra um algoritmo guloso para encontrar caminhos m O algoritmo de Dijkstra e nimos a partir de um v ertice sobre grafos com pesos n ao negativos. O algoritmo mant em um conjunto S que cont em os v ertices com os caminhos m nimos cal o o algoritmo seleciona um novo v culados at e o momento. A cada iterac a ertice v para ser inclu do em S , tal que v e escolhido entre os v ertices de V S com menor valor de d[v ]. O v ertice v e inclu do em S e todas as arestas que saem de v s ao processadas pela rotina Relax. apresentado no algoritmo 12. O pseudoc odigo de Dijkstra e Algoritmo 12 Dijkstra
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:

procedimento D IJKSTRA(G, w, s) Entrada: G = (V, E ), conjunto de pesos das arestas (w) e o v ertice inicial s S QV enquanto ( fac aQ = ) o a d[] u EstraiM in(Q) Em relac a S S {u } a lista de arestas para o v para cada v ertice v Adj (u) fac a Adj (u) e ertice u Relax(u,v ,w) m para cada m enquanto m procedimento Para entender o funcionamento do algoritmo considere as guras 4.5 a Figura 4.14 nesta

ordem.

Figura 4.5: Dijkstra: passo 1

Figura 4.6: Passo 2

Figura 4.7: Passo 3

Figura 4.8: Passo 4

Figura 4.9: Passo 5

Figura 4.10: Passo 6

Figura 4.11: Passo 7

Figura 4.12: Passo 8

Figura 4.13: Passo 9

Figura 4.14: Passo 10

Prova de corretude o de algoritmo de Dijkstra sobre um grafo orientado, com pesos n Ap os a nalizac a ao negativos nas arestas w : E + e v ertice de in cio s, temos d[u] = (s, u), para todo v ertice u V . Nota: (u, v ) denota o valor da soma dos pesos das arestas de u at e v sendo quando n ao h a um caminho de u a v . inserido em S , d[u] = (s, u). Vamos Prova: Vamos mostrar que no instante em que u e o. Suponha que exista um v mostrar por contradic a ertice u tal que ao inserir u em S , d[u] = (s, u). Escolha u como o primeiro v ertice em que isso ocorre. Claramente, u = s, j a que d[s] = (s, s) = 0; de peso m Se o caminho associado a d[u] n ao e nimo ent ao deve existir um outro caminho P de s a u de peso (s, u) < d[u]. Seja (x, y ) a primeira aresta de P que liga um v ertice x S com um v ertice y (V S ). Como x S e y Adj [x] temos, pelos passos 7 e 8 (chamada de Relax), que:

Figura 4.15: d[y ] d[x] + w(x, y ).

Como todos os pesos de P s ao n ao negativos e (x, y ) P , temos que d[y ] d[x] + w(x, y ) (s, u). escolhido antes de y temos que Como x e y pertencem a (V S ) e u e d[u] d[y ] es 4.2 e 4.3 temos que Das inequac o d[u] d[y ] d[x] + w(x, y ) (s, u). o 4.4 contraria a escolha de u. Claramente, a inequac a Complexidade O(|V |). No entanto, a complexidade total A complexidade de tempo de InicializaCaminhoM nimo e o de Q (a la de prioridades). do algoritmo de Dijkstra depende da implementac a Vetores lineares. O uso de vetores lineares para representar os vetores d[] e pred[], indexa o de lista de vizinhanc dos pelos v ertices e usando a implementac a as para os grafos podemos realizar (4.4) (4.3) (4.2)

o passo 5 com complexidade de tempo total O(|V |2 ) e o passo 8 com complexidade de tempo total executada em tempo constante). Desta forma, a complexidade O(|E |) (a chamada da rotina Relax e o e O(|V |2 ). nal do algoritmo nesta implementac a Heap bin ario. O uso de um heap bin ario para representar Q, nos permite construir o heap o ExtraiMin(Q) (passo 5) e executada |V | vezes e pode ser (passo 3) com tempo O(|V |). A operac a , O(|V | log |V |). A operac o de decremento de feita com complexidade de tempo O(log |V |), isto e a um valor do heap (passo 2 da rotina Relax) pode ser feita em tempo O(log |V |) e portanto Relax pode ser implementada em O(log |V |). Como pode haver at e |E | chamadas de Relax no passo 8, temos uma complexidade total de O(|V | + |E | log |V |).

Cap tulo 5

Algoritmos Gulosos como heur stica


o o tima, mas Existem problemas para os quais nenhum algoritmo guloso conhecido produz uma soluc a es boas. para os quais algoritmos gulosos possuem uma alta probabilidade de produzirem soluc o o quase o tima, ou seja, aquela que ca uma certa porcentagem acima Nos casos em que uma soluc a o o tima, e aceit da soluc a avel, os algoritmos gulosos freq uentemente fornecem a maneira mais r apida o boa. para se chegar a tal soluc a o o tima de um problema e preciso realizar Na verdade, quando para se chegar a uma soluc a uma t ecnica de busca exaustiva, a escolha de um algoritmo guloso (ou outra heur stica) pode ser a o o tima. alternativa vi avel, mesmo n ao produzindo uma soluc a A seguir, ser a apresentado o Problema do Caixeiro Viajante (TSP - Traveling Salesman Pro nicos algoritmos conhecidos que produzem uma soluc o o tima s blem), no qual os u a ao do tipo tentar o que s todas as possibilidades. Tais algoritmos podem ter tempos de execuc a ao exponenciais no tamanho da entrada [1]. Resumidamente, pode-se dizer que o problema consiste em encontrar em um grafo n aodirecionado, com pesos nas arestas, um caminho (ciclo simples que inclua todos os v ertices) de tal freq forma que a soma dos pesos das arestas seja m nimo. Um caminho e uentemente chamado de ciclo Halmitoniano. es pr o de rotas at Exemplos de aplicac o aticas deste problema incluem deste a determinac a eo ltimo, o objetivo e encontrar uma problema do caminho do cavalo (knights tour problem). Neste u ncia de movimentos de tal forma que o cavalo visite cada quadro do tabuleiro de xadrez somente seq ue ` sua posic o inicial. Para tornar a id uma vez e retorne a a eia do problema mais clara, considere a Figura 5.1 a seguir. O item (a) da Figura 5.1 mostra uma inst ancia do problema TSP, onde s ao dadas as coorde dado nadas de cada v ertice (no problema TSP estes s ao chamados cidades), e o peso de cada aresta e pelo seu tamanho. Aqui assumimos que todas as arestas existem. Os demais itens da Figura 5.1 ((b) (e)) mostram quatro diferentes caminhos entre as cidades, que possuem tamanhos 50.00, 49.73, 48.39 o dado em (d). e 49.78, respectivamente. O caminho mais curto, portanto, e

41

Figura 5.1: Uma instancia do problema do caixeiro viajante

uma variante do algoritmo de Kruskals O algoritmo guloso idealizado para o problema TSP e o, isto e , como crit apresentado anteriormente. Como crit erios de aceitac a erios para determinar se uma o ir ` s j o: aresta sob considerac a a ou n ao se unir a a selecionadas, temos que a aresta sob considerac a n ao leve um v ertice a ter grau tr es ou mais; n ao venha a formar um c rculo, a menos que o n umero de arestas selecionadas seja igual ao n umero de v ertices no problema. Grupos de arestas selecionadas sobre tais crit erios ir ao formar um grupo de caminhos n ao ltimo passo, onde o u nico caminho restante e fechado para formar um caminho. conectados at eou o representado pelo Voltando ao exemplo apresentado na Figura 5.1 o caminho escolhido e o caminho a b c d e f (e eventualmente, a f para item (b) da gura, que e o o tima, e uma soluc o com um custo a mais de completar o caminho). Embora n ao seja a soluc a a uma diferenc es apenas 4%, que e a aceit avel (considerando nosso crit erio inicial de aceitar soluc o timas). Achar o caminho ca como exerc a aresta (d,e), quase o cio (Dicas: (i) a primeira aresta pega e que possui tamanho 3; (ii) as arestas (a,c), (d,f), (b,e) e (b,d) s ao descartadas por n ao obedecerem aos o relacionados anteriormente. Agora cou f crit erios de aceitac a acil fazer o exerc cio).

Cap tulo 6

Conclus oes
o tem-se a id Muitas vezes na computac a eia de que quanto mais sosticado um algoritmo mais preciso . Esta e uma id ele e eia errada. E poss vel combinar eleg ancia e simplicidade quando se conhece bem o que nos prova a teoria dos algoritmos gulosos. Os algoritmos de o problema sendo tratado. Isso e Kruskal, Prim e Dijkstra s ao exemplos de id eias de certa forma intuitivas ao ser humano (a busca do timo no momento atual) e que d que nos parece o ao certo. Obviamente, nem sempre essa abordagem ir a funcionar. No entanto, uma vez que o problema intrinsecamente tenha a propriedade de ser resolvido por essa abordagem, muito trabalho poder a ser evitado na busca de algoritmos capazes de resolv e-lo.

43

Anexo 1 - Grafos
` teoria de grafos. Estes conceitos ser Neste anexo mostraremos alguns conceitos relacionados a ao im es anteriores, principalmente quando tratarmos de algoritmos gulosos portantes em algumas das sec o em grafos. Os conceitos foram tirados de [2], [3] e [4].

es 6.1. Conceitos e denic o


um conjunto V de v Um grafo G = (V, E ) e ertices e um conjunto E de arestas (edges em ingl es) um par de v representado gracamente usando onde cada aresta e ertices (Ex.: (v, w)). Um grafo e conectores para v ertices e retas ou curvas para arestas. Veja um exemplo na Figura 6.1.

Figura 6.1: Exemplo de um grafo simples

O grafo da Figura 6.1 possui V = {a, b, c, d, e, f} e E = {(a, b), (b, c), (b, e), (c, e), (c, d), uma aresta entre os v (d, f)} onde (a, b) e ertices a e b. Normalmente, arestas do tipo (a, a) n ao s ao permitidas. Um grafo pode ser dirigido ou n ao dirigido. Em um grafo dirigido, a ordem entre os v ertices importante. Esta aresta e diferente da aresta (w, v ) e e representada com uma de uma aresta (v, w) e echa de v para w como mostra a Figura 6.2.

Figura 6.2: Exemplo de um grafo dirigido

44

Em um grafo n ao dirigido, (v, w) = (w, v ). uma seq ncia de v Um caminho (path) e ue ertices v1 , v2 , . . . , vn conectados por arestas (v1 , v2 ), (v2 , v3 ), . . . , (vn1 , vn ). As arestas s ao tamb em consideradas como parte do caminho. Veja um exemplo na Figura 6.3.

Figura 6.3: Um caminho em um grafo

um caminho onde v1 = vn , como b, c, d, e, f, d, b. Um circuito e

Figura 6.4: Circuito em um grafo

Um circuito ser a simples se nenhum v ertice aparecer mais de uma vez, exceto o primeiro e o ltimo. Um circuito simples e chamado de ciclo. u o 1: dado um grafo, dizemos que o v adjacente ao v Denic a ertice v e ertice w se existe aresta (v, w) no grafo. o 2: um grafo e conectado se existe um caminho entre dois v Denic a ertices quaisquer do grafo. o 3: d um grafo dirigido. Denic a grafo e o 4: o grau de um v o n Denic a ertice e umero de arestas adjacentes a ele. Em um grafo o n o dirigido, o grau de entrada de um v ertice v e umero de arestas (w, v ) e o grau de sa da e n umero de arestas (v, w). Veja um exemplo na gura 6.5.

Figura 6.5: Grau de um vertice. v possui grau de entrada 2 e grau de sa da 1

o 5: uma fonte e um v Denic a ertice com grau de entrada 0 e grau de sa da 1. Um sumi um v douro e ertice com grau de sa da 0 e grau de entrada 1. o 6: um grafo e completo quando existe uma aresta entre dois v Denic a ertices quaisquer do denotado por Kn . Veja um exemplo na gura 6.6. grafo. O grafo completo de n v ertices e o 7: Um subgrafo G = (V , E ) de um grafo G = (V, E ) e um grafo tal que V V Denic a e E E . Veja exemplo na gura 6.7.

Figura 6.6: Grafos completos

Figura 6.7: Subgrafos

o 8: Um grafo G = (V, E ) e bipartido se V pode ser dividido em dois conjuntos V1 Denic a e V2 tal que toda aresta de G une um v ertice de V1 a outro de V2 . Veja exemplo na gura 6.8

Figura 6.8: Grafos bipartidos

o 9: Dados dois grafos G1 = (V1 , E1 ) e G2 = (V2 , E2 ), dizemos que G1 e isomorfo Denic a o f : V1 V2 tal que (v, w) E1 se a G2 se e somente se existe uma func a (f (v ), f (w)) E2 v, w V1 . Veja exemplo na Figura 6.9. (6.1)

Figura 6.9: Grafos isomorfos. f = (1, b), (5, c), (3, d), (2, a), (4, e)

6.2. Hist oria


O primeiro problema de teoria dos grafos estudado foi o das pontes de K onisberg.

Figura 6.10: As pontes de Konisberg

Esta cidade possu a um rio com duas ilhas conectadas por sete pontes. A gura 6.10 apresenta saber se e poss uma vers ao simplicada. O problema e vel caminhar de um ponto qualquer da cidade e retornar a este ponto passando por cada ponte exatamente um vez. v aresta Euler resolveu este problema criando um grafo em que terra rme e ertice e ponte e como na Figura 6.11.

Figura 6.11: Proposta de Euler ao problema das pontes de Konisberg

Quando caminhamos por um v ertice, temos que entrar e sair dele (ou vice-versa, no caso do ponto inicial), o que signica que usamos um n umero par de arestas cada vez que passamos por um v ertice. Como o grafo acima possui v ertices com n umero mpar de arestas, a resposta para o problema NAO. e

6.3. Estruturas de dados para grafos


usualmente representado por uma matriz de adjac Um grafo G = (V, E ) e encias ou por uma lista de vizinhanc as. Matriz de adjac encias uma matriz A = (aij ) nxn Sendo n o n umero de v ertices de G, uma matriz de adjac encia para G e tal que aij = 1 se (vi , vj ) E . o e que ela ocupa muito espac A desvantagem desta representac a o se h a poucas arestas. Neste in que podemos saber se uma aresta existe ou n caso, a maior parte da matriz e util. A vantagem e ao em tempo constante.

Veja exemplo na Figura 6.12

de grafos por matriz de adjacencia Figura 6.12: Representac ao

Lista de vizinhanc as es cada uma apontando para uma lista. A posic o i do vetor aponta para uma H a um vetor de n posic o a lista contendo n umeros j tal que (vi , vj ) E . Para o grafo da Figura 6.12 temos a lista de vizinhanc as da Figura 6.13.

de grafos por lista de vizinhanc Figura 6.13: Representac ao a

6.4. Caminhos
6.4.1. Caminho Euleriano o: um grafo G n Euleriano se existe um caminho fechado (circuito) que inclui Denic a ao dirigido e chamado de caminho Euleriano. cada aresta de G. Este caminho e Arestas em um circuito n ao se repetem. Assim, um caminho Euleriano cont em cada aresta do grafo exatamente uma vez. Veja exemplo na Figura 6.14.

Figura 6.14: Caminho Euleriano em um grafo

6.4.2. Caminho Hamiltoniano o: um circuito Hamiltoniano em um grafo conectado G e um circuito que inclui cada v Denic a ertice de G exatamente uma vez. claramente mais dif Encontrar um circuito Hamiltoniano (CH) e cil que encontrar um caminho Euleriano (CE), pois cada vez que atingimos (num percurso) um v ertice v a partir de uma aresta e, nunca mais podemos usar v e quaisquer de suas arestas. Em um CE, n ao poder amos usar e, mas poder amos usar v e suas outras arestas. Veja exemplo na Figura 6.15.

Figura 6.15: Caminho Hamiltoniano em um grafo

6.4.3. Caminho ponderado entre v ertices o: um grafo com comprimentos (ou pesos) associa a cada aresta um comprimento que e um Denic a a soma dos comprimentos de suas arestas. n umero real positivo. O comprimento de um caminho e Veja exemplo na Figura 6.16.

Figura 6.16: Caminhos ponderados em um grafo

Refer encias
[1] Alfred V. Aho, John E. Hopcroft, and Jeffrey D. Ullman. Data Structures and Algorithms. AddisonWesley Publishing Company, California, 1987. ISBN 0-201-00023-7. [2] Gilles Brassard and Paul Bratley. Fundamentals of Algorithmics. Prentice Hall, Nova Iorque, 1995. ISBN 01-333-5068-1. [3] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Algoritmos, teoria e pr atica. Editora Campus, Rio de Janeiro, 2002. ISBN 85-352-0926-3. [4] Udi Manber. Introduction to Algorithms: A Creative Approach. Pearson Education POD, Nova Iorque, 1989. ISBN 02-011-2037-2. [5] Fl avio Keidi Miyazawa. Notas de aula de complexidade de algoritmos. Dispon vel para download em www.ic.unicamp.br/fkm, 2002. [6] Pedro J. Rezende. Complexidade de algoritmos i. www.ic.unicamp.br/rezende, 2002. Dispon vel para download em

[7] Nivio Ziviani. Projeto de Algoritmos. Pioneira Thomson Learning, S ao Paulo, 2004. ISBN 85-2210390-9. []

Exerc cios propostos


Todos os exerc cios s ao referentes a [2] e [3]. 1. em [2]: (a) (b) (c) (d) (e) (f) (g) 2. em [3]: (a) (b) 6.1: Caracter sticas gerais dos algoritmos gulosos; 6.7: Grafos; 6.9 : Kruskal; 6.10: Kruskal e Prim; 6.11: Sobre a exist encia de mais de uma AGM para um mesmo grafo; o de Prim com heaps, 6.13: Implementac a 6.14 e 6.15: Dijkstra. o de atividades; 16.1-4: Selec a 16.2-3: Sugest ao de algoritmo guloso para uma variante do problema da mochila;

UNICAMP - Univeridade Estadual de Campinas o Instituto de Computac a MO417 - Complexidade de Algoritmos

Algoritmos Gulosos

Alunos: Leyza E. Baldo Dorini Anderson de Rezende Rocha

Campinas, Maio de 2004

You might also like