Escolar Documentos
Profissional Documentos
Cultura Documentos
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
1
20/11/2014
Usos e Aplicações
Para que servem os Grafos?
2
20/11/2014
3
20/11/2014
4
20/11/2014
5
20/11/2014
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:
7
20/11/2014
8
20/11/2014
9
20/11/2014
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.
10
20/11/2014
Problemas Relacionados
Problema 1:
• A descrição do problema poder sugerir múltiplos sources
e/ou múltiplos sinks.
Problemas Relacionados
Problema 1:
• A descrição do problema poder sugerir múltiplos sources
e/ou múltiplos sinks.
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.
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.
12
20/11/2014
Problemas Relacionados
Problema 3:
• E se, além das capacidades nas cidades, as estradas se
tornarem não-direcionadas?
Problemas Relacionados
Problema 3:
E se, além das capacidades nas cidades, as estradas se
tornarem não-direcionadas?
13
20/11/2014
14
20/11/2014
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.
15
20/11/2014
Algoritmo de Hopcroft-Karp
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
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
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
Reconstrução da Mensagem
Como reconstruir a mensagem corretamente?
Descartar os pacotes repetidos
Ordenar os pacotes
Como implementar tal algoritmo?
Utilizando Árvores Binárias
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
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
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
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
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:
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
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.
23