Você está na página 1de 23

20/11/2014

108561 - ALGORITMOS E
ESTRUTURAS DE DADOS
Prof. Valério Aymoré Martins
Aula 27/28 – Grafos e Árvores:
Usos e Aplicações
Extraído das aulas de David Menotti – DECOM/UFOP

2014/2 Algoritmos e Estruturas de Dados 1


Prof. Valério Aymoré Martins

Usos e Aplicações de Grafos

2014/2 Algoritmos e Estruturas de Dados 2


Prof. Valério Aymoré Martins

1
20/11/2014

Usos e Aplicações
Para que servem os Grafos?

Lembre-se que eles podem ser representados por:


o Listas de Adjacências
o Matriz de Adjacências

2014/2 Algoritmos e Estruturas de Dados 3


Prof. Valério Aymoré Martins

O Problema Fluxo Máximo


O que é o problema de encontrar fluxo máximo?
• Uma empresa possui uma fábrica localizada na cidade X
onde são fabricados produtos que necessitam ser
transportados para o centro de distribuição na cidade Y.
• Dados as estradas direcionadas que ligam os pares de
cidades do país, bem como o número máximo de
caminhões que pode se conduzir ao longo de cada estrada.
Qual é o número máximo de caminhões que a empresa
pode enviar para o centro de distribuição?

2014/2 Algoritmos e Estruturas de Dados 4


Prof. Valério Aymoré Martins

2
20/11/2014

O Problema Fluxo Máximo


De acordo com a Teoria dos Grafos:
• Dado uma rede – um grafo direcionado, em que cada
aresta tem uma capacidade c associada a ele, um vértice
de partida (source) e um vértice de chegada (sink).
Devemos associar um valor não-negativo f , com f <= c
para cada aresta, onde para cada vértice, exceto o source
e o sink, a soma dos valores associados às arestas que
entram deve ser igual a soma dos valores associados às
arestas que o deixam. Nós chamaremos f de o fluxo ao
longo da aresta. Devemos maximizar a soma dos valores
associados às arestas que deixam o source, o fluxo total da
rede.
2014/2 Algoritmos e Estruturas de Dados 5
Prof. Valério Aymoré Martins

O Problema Fluxo Máximo


• A imagem abaixo mostra uma solução ótima
para uma instância deste problema. Cada
aresta apresentada com f/c .

2014/2 Algoritmos e Estruturas de Dados 6


Prof. Valério Aymoré Martins

3
20/11/2014

Como resolver o problema


• Precisamos de duas definições básicas para
entender como resolver fluxo em redes:
• A rede residual
• Tem o mesmo número vértices da rede original e uma
ou duas arestas para cada aresta na rede original. Se o
fluxo ao longo da aresta a-b é menor do que a
capacidade, existe uma aresta a-b com uma capacidade
igual à diferença entre a capacidade e o fluxo
(capacidade residual), e se o fluxo é positivo há uma
aresta b-a com a capacidade igual ao fluxo de a-b.

2014/2 Algoritmos e Estruturas de Dados 7


Prof. Valério Aymoré Martins

Como resolver o problema

2014/2 Algoritmos e Estruturas de Dados 8


Prof. Valério Aymoré Martins

4
20/11/2014

Como resolver o problema

2014/2 Algoritmos e Estruturas de Dados 9


Prof. Valério Aymoré Martins

Como resolver o problema

2014/2 Algoritmos e Estruturas de Dados 10


Prof. Valério Aymoré Martins

5
20/11/2014

Como resolver o problema

2014/2 Algoritmos e Estruturas de Dados 11


Prof. Valério Aymoré Martins

Problema Resolvido!
• O exemplo sugeriu o seguinte algoritmo:
• Inicie com nenhum fluxo em todas as arestas e
aumente o fluxo total na rede enquanto há um
aumento caminho desde o source até o sink - um
caminho de aumento na rede residual.
• O algoritmo (conhecido como o método Ford-
Fulkerson ou Bellman-Ford) sempre termina:
devido às capacidades e fluxos inteiros não-
negativos, a cada passo obtemos um novo fluxo
que está mais próximo do máximo.
Veja: http://www.laynetworks.com/Bellman%20Ford%20Algorithm.htm

6
20/11/2014

Problema Resolvido!
• A função max_flow será similar a esta, independente
do método que utilizamos para encontrar caminhos
de aumento:

2014/2 Algoritmos e Estruturas de Dados 13


Prof. Valério Aymoré Martins

Algoritmos para Caminho de Aumento


• O algoritmo Ford-Fulkerson descrito obtém o
resultado correto, não importa como resolvermos o
sub-problema de encontrar um caminho de
aumento.
• No entanto, a cada novo caminho podemos
aumentar o fluxo total muito pouco, daí o número
de iterações do algoritmo pode ser muito grande se
nos descuidarmos ao escolher qual caminho de
aumento o algoritmo deve usar.

2014/2 Algoritmos e Estruturas de Dados 14


Prof. Valério Aymoré Martins

7
20/11/2014

Algoritmos para Caminho de Aumento


• Agora é necessário uma implementação para a
função find_path.
• A primeira abordagem que me vem à mente é a de
usar uma busca em profundidade, pois ela é
provavelmente a mais fácil de implementar.
Infelizmente, seu desempenho é muito ruim em
algumas redes, e normalmente é menos preferida
em relação à que vamos mostrar a seguir.

2014/2 Algoritmos e Estruturas de Dados 15


Prof. Valério Aymoré Martins

Algoritmos para Caminho de Aumento


• A próxima idéia na simplicidade é uma usar uma
busca em largura. Sabemos que esta pesquisa
normalmente retorna o caminho mais curto em um
grafo não-ponderado. Essa era a base da idéia de
Edmonds-Karp.
No psedo-código a seguir, nós iremos basicamente:
• Encontrar o menor caminho do source ao sink e
determinar a capacidade da aresta de menor capacidade
desse caminho. Então, para cada aresta, ao longo do
caminho, reduzimos a capacidade dela e aumentarmos a
capacidade da aresta oposta.
2014/2 Algoritmos e Estruturas de Dados 16
Prof. Valério Aymoré Martins

8
20/11/2014

Algoritmos para Caminho de Aumento

2014/2 Algoritmos e Estruturas de Dados 17


Prof. Valério Aymoré Martins

Algoritmos para Caminho de Aumento

2014/2 Algoritmos e Estruturas de Dados 18


Prof. Valério Aymoré Martins

9
20/11/2014

Algoritmos para Caminho de Aumento


• Como podemos ver, isto é muito fácil de
implementar.
• Devido ao O(E) da execução da Busca em
Largura (implementada com listas de
adjacência), o pior caso do algoritmo é O
(V*E²), mas, geralmente, o algoritmo roda
num tempo muito melhor.

2014/2 Algoritmos e Estruturas de Dados 19


Prof. Valério Aymoré Martins

Problemas Relacionados
• Como reconhecer problemas de fluxo máximo?
• Muitas vezes eles são difíceis de detectar.
Geralmente, precisamos prestar muita atenção nas
restrições quando achamos que temos uma solução
baseada em fluxo máximo - que deve, pelo menos,
sugerir uma solução O(N³). Se o número de vértices
é grande, um outro algoritmo (como a programação
dinâmica ou o guloso), pode ser mais adequado.

2014/2 Algoritmos e Estruturas de Dados 20


Prof. Valério Aymoré Martins

10
20/11/2014

Problemas Relacionados
Problema 1:
• A descrição do problema poder sugerir múltiplos sources
e/ou múltiplos sinks.

2014/2 Algoritmos e Estruturas de Dados 21


Prof. Valério Aymoré Martins

Problemas Relacionados
Problema 1:
• A descrição do problema poder sugerir múltiplos sources
e/ou múltiplos sinks.

2014/2 Algoritmos e Estruturas de Dados 22


Prof. Valério Aymoré Martins

11
20/11/2014

Problemas Relacionados
Problema 2:
E se também fosse dado o número máximo de caminhões
que podem passar através de cada uma das cidades do
país (exceto as cidades onde a fábrica e o centro de
distribuição estão localizados)? Em outras palavras, se
tivermos de lidar com a capacidade dos vértices também.

2014/2 Algoritmos e Estruturas de Dados 23


Prof. Valério Aymoré Martins

Problemas Relacionados
Problema 2:
E se também fosse dado o número máximo de caminhões
que podem passar através de cada uma das cidades do
país (exceto as cidades onde a fábrica e o centro de
distribuição estão localizados)? Em outras palavras, se
tivermos de lidar com a capacidade dos vértices também.

2014/2 Algoritmos e Estruturas de Dados 24


Prof. Valério Aymoré Martins

12
20/11/2014

Problemas Relacionados
Problema 3:
• E se, além das capacidades nas cidades, as estradas se
tornarem não-direcionadas?

2014/2 Algoritmos e Estruturas de Dados 25


Prof. Valério Aymoré Martins

Problemas Relacionados
Problema 3:
E se, além das capacidades nas cidades, as estradas se
tornarem não-direcionadas?

2014/2 Algoritmos e Estruturas de Dados 26


Prof. Valério Aymoré Martins

13
20/11/2014

Emparelhamento Máximo em Grafos Bipartidos


• Esta é uma das mais importantes aplicações de fluxo
máximo, e muitos problemas podem ser reduzidos a
ela.
• O emparelhamento em um grafo bipartido é um
conjunto de arestas tal que nenhum vértice é tocado
por mais de uma aresta.
• Obviamente, um emparelhamento com máxima
cardinalidade é um emparelhamento máximo. Para
um grafo geral, este é um problema bem mais difícil
de resolver.
2014/2 Algoritmos e Estruturas de Dados 27
Prof. Valério Aymoré Martins

Emparelhamento Máximo em Grafos Bipartidos


• A redução para fluxo máximo é bem simples,
vamos a um exemplo:
• Seja o grafo bipartido: o primeiro conjunto de
vértices de empregados, enquanto o segundo
contém um conjunto de trabalhos a ser feito.
Existe uma aresta de um empregado para cada
um dos trabalhos que podem ser atribuídos a ele.

2014/2 Algoritmos e Estruturas de Dados 28


Prof. Valério Aymoré Martins

14
20/11/2014

Emparelhamento Máximo em Grafos Bipartidos

— Ao ver o grafo, percebemos que este problema é


semelhante a encontrar o fluxo máximo num grafo de
múltiplos sources e multiplos sinks, que já resolvemos.

2014/2 Algoritmos e Estruturas de Dados 29


Prof. Valério Aymoré Martins

Algoritmo de Hopcroft-Karp
• Agora descreveremos um algoritmo mais rápido. A
sua complexidade é .
• Dado um grafo bipartido não-direcionado G(X,Y),
seja M um emparelhamento em G. Dizemos que um
caminho simples P em G é um caminho de aumento
com respeito a M se ele começa em um vértice não
emparelhado em X, termina em um vértice não
emparelhado em Y e suas arestas pertencem
alternadamente a M e a M.

2014/2 Algoritmos e Estruturas de Dados 30


Prof. Valério Aymoré Martins

15
20/11/2014

Algoritmo de Hopcroft-Karp

2014/2 Algoritmos e Estruturas de Dados 31


Prof. Valério Aymoré Martins

Algoritmo de Hopcroft-Karp
• Problema 1:
• Precisamos de um algoritmo O(E) para encontrar
um conjunto máximo de caminhos disjuntos de
aumento, P1, P2, P3,...

• Problema 2:
• Mostrar que o número máximo de iterações do
algoritmo é 2 . E concluir que o tempo de
execução total do Hopcroft-karp é
2014/2 Algoritmos e Estruturas de Dados 32
Prof. Valério Aymoré Martins

16
20/11/2014

Usos e Aplicações de Árvores

2014/2 Algoritmos e Estruturas de Dados 33


Prof. Valério Aymoré Martins

Usos e Aplicações
Para que servem as Árvores Binárias?

Exemplos de aplicações:
Redes de Comunicação de Dados
Envio de pacotes ordenados e/ou redundantes
Codificação de Huffman
Compressão e Descompressão de arquivos

2014/2 Algoritmos e Estruturas de Dados 34


Prof. Valério Aymoré Martins

17
20/11/2014

1) Redes de Comunicação
A maioria dos protocolos de comunicação
fragmenta as mensagens em pacotes que são
numerados e enviados através da rede
Não há garantia da chegada em ordem dos
pacotes
Perdas de pacotes geram novos envios e estes
podem causar duplicatas dos mesmos

2014/2 Algoritmos e Estruturas de Dados 35


Prof. Valério Aymoré Martins

Reconstrução da Mensagem
Como reconstruir a mensagem corretamente?
Descartar os pacotes repetidos
Ordenar os pacotes
Como implementar tal algoritmo?
Utilizando Árvores Binárias

2014/2 Algoritmos e Estruturas de Dados 36


Prof. Valério Aymoré Martins

18
20/11/2014

Exemplo:
P3
R
R P3
P1 Ok P3

P2 ? A P2 P2 B
P3 Ok
R P2
P2
P1
P1 P1
P1
R
R

Ordem de Chegada: Confirmação de envio: P1 e P3.


P3 P1 P2 Reenvio de P2.

Problemas: ordens e redundância dos pacotes

2014/2 Algoritmos e Estruturas de Dados 37


Prof. Valério Aymoré Martins

Algoritmo
• O primeiro pacote é colocado na raiz da árvore. Cada
pacote sucessivo é comparado com o da raiz
• Se for igual, descarta-se a réplica. Se for menor ou
maior, percorre-se os lados esquerdo ou direito da
árvore
• Subárvore vazia implica inserção do novo pacote
• Subárvore não vazia implica comparação dos pacotes
com a mesma

2014/2 Algoritmos e Estruturas de Dados 38


Prof. Valério Aymoré Martins

19
20/11/2014

Problemas resolvidos?
Problema da ordenação
• A ordenação dos pacotes pode ser feita
trivialmente com apenas uma chamada ao
método inOrder() da árvore binária
Problema da redundância
• Solucionado com o algoritmo de inserção na
árvore, visto que o pacote, antes de ser inserido, é
comparado com os demais que já se encontram
na árvore binária

2014/2 Algoritmos e Estruturas de Dados 39


Prof. Valério Aymoré Martins

2) Codificação de Huffman
Algoritmo utilizado para comprimir arquivos
Todo o algoritmo é baseado na criação de uma
Árvore Binária
Programas como Winzip e WinRAR utilizam este
algoritmo
Criado por David Huffman em 1952

2014/2 Algoritmos e Estruturas de Dados 40


Prof. Valério Aymoré Martins

20
20/11/2014

Códigos e Caracteres
• Caracteres são letras, números e símbolos
• Códigos são sequências de bits que podem
representar de maneira ÚNICA um caracter.
• b bits para representar c caracteres: c = 2b
Exemplos:

ASCII (7 bits) Extended ASCII (8 bits)

27 = 128 caracteres 28 = 256 caracteres

2014/2 Algoritmos e Estruturas de Dados 41


Prof. Valério Aymoré Martins

Como comprimir arquivos?


• No código ASCII, todos os caracteres têm um
número fixo de bits
• Números variáveis de bits implica menor
capacidade de armazenamento
• Associações com bits variáveis podem
comprimir consideravelmente o arquivo
G Como comprimir arquivos desta maneira?
CUtilizando a Codificação de Huffman!
2014/2 Algoritmos e Estruturas de Dados 42
Prof. Valério Aymoré Martins

21
20/11/2014

Exemplo:
l Considere o arquivo com o seguinte texto:
AAAAAAAAAABBBBBBBBCCCCCCDDDDDEE

• Freqüências: A = 10; B = 8; C = 6; D = 5; E = 2
• Construção da Árvore Binária
• Comparação do número de bits
• Tamanho Fixo (8 bits) à Total = 248 bits
• Tamanho Variável à Total = 69 bits
2014/2 Algoritmos e Estruturas de Dados 43
Prof. Valério Aymoré Martins

Compressão
• Depois da geração da árvore, o arquivo é
percorrido novamente e cada caracter do
arquivo é substituído pelo código binário
contido na árvore, gerando uma cadeia de bits
• Criação da tabela de caracteres e códigos
binários
• O que é armazenado?
o Cadeia de bits gerada
o Tabela de caracteres e códigos
2014/2 Algoritmos e Estruturas de Dados 44
Prof. Valério Aymoré Martins

22
20/11/2014

Descompressão
• Regeneração da árvore binária através da
tabela de caracteres e códigos
• A cadeia de bits é percorrida e, à medida que
uma subcadeia é encontrada na tabela de
caracteres e códigos, a mesma é substituída
pelo caracter correspondente

2014/2 Algoritmos e Estruturas de Dados 45


Prof. Valério Aymoré Martins

Conclusões
• As árvores binárias são uma das estruturas de
dados mais importantes devido a grande
aplicabilidade das mesmas.
• A maioria dos algoritmos das árvores binárias
são de simples entendimento, facilitando
sobremaneira o desenvolvimento de sistemas.

2014/2 Algoritmos e Estruturas de Dados 46


Prof. Valério Aymoré Martins

23

Você também pode gostar