Árvores de Suporte de Custo Mínimo



Documentos relacionados
Árvores de Suporte de Custo Mínimo

2006/2007 Análise e Síntese de Algoritmos 2

Grafos Msc. Daniele Carvalho Oliveira. Doutoranda em Computação UFU Mestre em Computação - UFU Bacharel em Computação - UFJF 1

Algoritmos e Estrutura de Dados III. Árvores

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

ESTRUTURAS DE DADOS II

Árvores. Algoritmos e Estruturas de Dados 2005/2006

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Pedro Vasconcelos DCC/FCUP. Programação Funcional 15 a Aula Árvores de pesquisa

Aula 19 Conjuntos disjuntos (Union-find)

DAS5102 Fundamentos da Estrutura da Informação

Fila de Prioridade. Siang Wun Song - Universidade de São Paulo - IME/USP. MAC Estruturas de Dados

Estruturas de Dados para Conjuntos Disjuntos: Union-find Letícia Rodrigues Bueno

Estruturas de Dados para Conjuntos Disjuntos. Estruturas de dados para conjuntos disjuntos

Árvores Binárias de Busca

Árvores B + Prof Márcio Bueno. ed2tarde@marciobueno.com / ed2noite@marciobueno.com. Material da Prof a Ana Eliza Lopes Moura

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

Árvore Binária de Busca

Árvores Balanceadas. Árvore binária completamente balanceada. Ocorre quando a árvore está cheia ou quase cheia com o nível n-1 completo

Hashing. Rafael Nunes LABSCI-UFMG

FILAS DE PRIORIDADE e HEAPS

Utilização do SOLVER do EXCEL

Complexidade de Algoritmos

BCC204 - Teoria dos Grafos

Estruturas de Dados I

Busca. Pesquisa sequencial

Árvores Binárias de Busca

ÁRVORES BINÁRIAS DE PESQUISA

AV2 - MA (a) De quantos modos diferentes posso empilhá-los de modo que todos os CDs de rock fiquem juntos?

BC1424 Algoritmos e Estruturas de Dados I. Aula 16: Árvores (introdução) Prof. Jesús P. Mena-Chalco. jesus.mena@ufabc.edu.br

Algoritmos e Estruturas de Dados II. Trabalho Prático 2

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11

5COP096 TeoriadaComputação

Análise e Complexidade de Algoritmos

Figure 2 - Nós folhas de uma árvore binária representando caracteres ASCII

Sistemas Distribuídos: Princípios e Algoritmos Introdução à Análise de Complexidade de Algoritmos

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.

2. Execução do algoritmo de Huffman para construção de uma árvore binária (árvore de Huffman).

Estruturas de Armazenamento e Indexação. Rafael Lage Moreira Barbosa

ESTRUTURAS DE DADOS II MSc. Daniele Carvalho Oliveira

MANUAL DO UTILIZADOR

EAD Árvore árvore binária

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II

Árvores Binárias Balanceadas

Pesquisa em Memória Primária. Prof. Jonas Potros

Comunicador cco SMOOTH TALKER

Algoritmos de pesquisa. Tabelas de dispersão/hash

Conjuntos disjuntos dinâmicos

EAD Árvore - representação usando listas ligadas

Algoritmos e Estruturas de Dados: Árvore Binária

Aula 4 Estatística Conceitos básicos

Linguagem C: Árvores Binarias

Tecnologia de Redes de Computadores - aula 5

Programação Orientada a Objetos: Lista de exercícios #1. Bruno Góis Mateus

Algoritmos de Busca em Tabelas

Bases Matemáticas. Aula 2 Métodos de Demonstração. Rodrigo Hausen. v /15

PROGRAMAÇÃO II 4. ÁRVORE

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

Unidade 5 Armazenamento e Indexação

Visão Artificial Para a Indústria. Manual do Utilizador

Métodos Computacionais. Árvores

CAPÍTULO 2. Grafos e Redes

Organização e Arquitetura de Computadores I

Árvore - Introdução. Teoria dos Grafos. Árvore Livre. Árvore Enraizada. Algumas Definições. Algumas Definições

1. Introdução Definição Conceitos relacionados... 2

Respostas de MAIO. A sequência é formada elevando-se ao quadrado os números 2,3,4... e somandolhes 2 em cada caso.

Sumário. 5COP096 Teoria da Computação Aula 8 Pesquisa em Memória Primária

Arquitetura de Rede de Computadores

QUESTÃO 1 ALTERNATIVA B

8. Perguntas e Respostas

Complexidade de Algoritmos. Edson Prestes

REPRESENTAÇÃO DE DADOS EM SISTEMAS DE COMPUTAÇÃO AULA 03 Arquitetura de Computadores Gil Eduardo de Andrade

Só Matemática O seu portal matemático FUNÇÕES

SISTEMA DE CLIMATIZAÇÃO

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

Matemática SSA 2 REVISÃO GERAL 1

Testador de cabos de rede

BC-0506: Comunicação e Redes Algoritmos em Grafos

SUMÁRIO 1. AULA 6 ENDEREÇAMENTO IP:... 2

Hoje estou elétrico!

Organização e Arquitetura de Computadores I

HASHING. Katia Guimarães. 1

Grafos: árvores geradoras mínimas. Graça Nunes

Sistemas Distribuídos: Conceitos e Projeto Eleição de Coordenador

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Sistema de Controle de Cheques GOLD

Estruturas de Dados Pilhas, Filas e Deques

Contagem (2) Anjolina Grisi de Oliveira / CIn-UFPE. Centro de Informática Universidade Federal de Pernambuco

Dadas a base e a altura de um triangulo, determinar sua área.

Teoria dos Grafos. Edson Prestes

Árvores AVL. Prof. Othon M. N. Batista Estrutura de Dados

Batalha Naval Algoritmos de Busca. Correlações curriculares Matemática: Números: maior que, menor que, iguais a.

Transcrição:

Árvores de Suporte de Custo Mínimo Pedro Ribeiro DCC/FCUP 2014/2015 Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 1 / 28

Árvore de Suporte Uma árvore de suporte ou árvore de extensão (spanning tree) é um subconjunto das arestas de um grafo não dirigido que forma uma árvore ligando todos os vértices. A figura seguinte ilustra um grafo e 3 árvores de suporte: Podem existir várias árvores de suporte para um dado grafo Uma árvore de suporte de um grafo terá sempre V 1 arestas Se tiver menos arestas, não liga todos os nós Se tiver mais arestas, forma um ciclo Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 2 / 28

Árvore de Suporte de Custo Mínimo Se o grafo for pesado (tem valores associados às arestas), existe a noção de árvore de suporte de custo mínimo (minimum spanning tree - MST), que é a árvore de suporte cuja soma dos pesos das arestas é a menor possível. A figura seguinte ilustra um grafo não dirigido e pesado. Qual é a sua árvore de suporte de custo mínimo? Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 3 / 28

Árvore de Suporte de Custo Mínimo Custo total: 46 = 4+8+7+9+8+7+1+2 Custo total: 41 = 4+8+7+9+8+2+1+2 Custo total: 37 = 4+8+7+9+1+2+4+2 E de facto esta última é uma árvore de suporte de custo mínimo! Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 4 / 28

Árvore de Suporte de Custo Mínimo Pode existir mais do que uma MST. Por exemplo, no caso dos pesos serem todos iguais, qualquer árvore de suporte tem custo mínimo! Em termos de aplicações, a MST é muito útil. Por exemplo: Quando queremos ligar computadores em rede gastando a mínima quantidade de cabo. Quando queremos ligar casas à rede de electricidade gastando o mínimo possível de fio Como descobrir uma MST para um dado grafo? Existe um número exponencial de árvores de suporte Procurar todas as árvores possíveis e escolher a melhor não é eficiente! Como fazer melhor? Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 5 / 28

Algoritmos para Calcular MST Vamos falar essencialmente de dois algoritmos diferentes: Prim e Kruskal Ambos os algoritmos são greedy: em cada passo adicionam uma nova aresta tendo o cuidado de garantir que as arestas já selecionadas são parte de uma MST Algoritmo Genérico para MST A Enquanto A não forma uma MST fazer Descobrir uma aresta (u, v) que é segura para adicionar A A (u, v) retorna(a) Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 6 / 28

Algoritmo de Prim Começar num qualquer nó Em cada passo adicionar à árvore já formada o nó cujo custo seja menor (que tenha aresta de menor peso a ligar à árvore). Em caso de empate qualquer um funciona. Vamos ver passo a passo para o grafo anterior... Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 7 / 28

Algoritmo de Prim (imagem de Introduction to Algorithms, 3rd Edition) Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 8 / 28

Algoritmo de Prim (imagem de Introduction to Algorithms, 3rd Edition) Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 9 / 28

Algoritmo de Prim Vamos operacionalizar isto em código: Algoritmo de Prim para descobrir MST de G (começar no nó r) Prim(G, r): Para todos os nós v de G fazer: v.dist v.pai NULL r.dist 0 Q G.V /* Todos os vértices de G */ Enquanto Q fazer u EXTRAIR-MINIMO(Q) /* Nó com menor dist */ Para todos os nós v adjacentes a u fazer Se v Q e peso(u, v) < v.dist então v.pai u v.dist peso(u, v) Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 10 / 28

Algoritmo de Prim A complexidade do algoritmo de Prim depende da operação EXTRAIR-MINIMO Vamos chamar EXTRAIR-MINIMO V vezes Cada aresta vai ser considerada uma vez no ciclo que actualiza os valores de dist A complexidade final é O( E + V custo EXTRAIR MINIMO) Uma implementação naive em que o mínimo é descoberto de forma linear (um ciclo para ver qual o menor) daria uma complexidade de O( E + V 2 ) É possível reduzir para um tempo linearítmico se usarmos uma estrutura de dados que suporte a operação de extrair o mínimo em tempo logarítmico! Uma estrutura de dados para esta função (devolver o elemento mínimo ou máximo) é conhecida como fila de prioridade Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 11 / 28

Algoritmo de Prim Uma heap suporta retirar o elemento mínimo em tempo logarítmico (Ainda se recordam do que é uma heap?) Mas como actualizar o elemento também em tempo logarítmico? Duas hipóteses: Como o elemento só pode ficar com dist menor, é só fazê-lo subir na heap até chegar à posição ou Inserimos novamente o elemento na heap com a nova distância (cada elemento será inserido no máximo tantas vezes quanto o seu grau) A complexidade final é O( E log V + V log V o que é o mesmo que O( E log V ) (existem assintoticamente pelo menos tantas arestas como nós, caso contrário nem uma árvore de suporte conseguiriamos fazer) Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 12 / 28

Recordando o que é uma Heap Uma heap é uma estrutura de dados organizada como uma árvore binária equilibrada, implementando uma fila de prioridade Existem dois tipos básicos de heaps: max-heaps: o elemento mais prioritário é o de máximo valor min-heaps: o elemento mais prioritário é o de menor valor Para termos uma heap a seguinte condição tem de ser respeitada: o pai de um nó tem sempre mais prioridade do que ele. Dito de outro modo, numa max-heap os filhos de um nó têm menor valor que ele, e numa min-heap os filhos têm maior valor. Uma heap deve ser uma árvore binária completa até ao seu penúltimo nível, e o último nível deve estar preenchido da esquerda para a direita. Isto garante que a altura máxima de uma árvore com n nós é proporcional a log 2 n Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 13 / 28

Recordando o que é uma Heap Uma heap é tipicamente implementada com um array, onde: Os filhos do nó (i) são os nós nas posições (i 2) e (i 2 + 1) O pai de um nó (i) é o nó na posição (i/2). A figura seguinte ilustra uma min-heap e o array correspondente: Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 14 / 28

Recordando o que é uma Heap Existem duas operações importantes numa heap: remover e inserir Remover um elemento passa por remover a raiz Numa min-heap a raíz é o menor elemento de todos Numa max-heap a raíz é o maior elemento de todos Depois de remover a raíz é necessário repor as condições de heap. Para isso, faz-se o seguinte: Pega-se no último elemento e coloca-se na posição da raíz O elemento baixa (down-heap), trocando com o mais prioritário dos filhos, até que a condição de heap esta reposta No máximo faz-se O(log n) operações, porque a árvore é equilibrada! Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 15 / 28

Recordando o que é uma Heap Inserir um elemento passa por: Colocá-lo na última posição O elemento sobe (up-heap), trocando com o pai, até que a condição de heap esteja reposta No máximo faz-se O(log n) operações, porque a árvore é equilibrada! Exemplo para inserção do elemento 2 Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 16 / 28

Recordando o que é uma Heap Voltando ao algoritmo de Prim, bastava usar uma min-heap para tornar o algoritmo linearítimo: O( E log V ) Cada operação de retirar o nó mais perto vai custar O(log V ) (é chamar a remoção da heap) Cada operação de actualização vai também custar O(log V ) (como uma actualização só pode reduzir o valor, é chamar um up-heap) As linguagens de programação tipicamente trazem já disponível uma fila de prioridade que garante complexidade logarítimica para inserção e remoção C++: priority queue Java: PriorityQueue Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 17 / 28

Algoritmo de Kruskal Manter uma floresta (conjunto de árvores), onde no início cada nó é uma árvore isolada e no final todos os nós fazem parte da mesma árvore Ordenar as arestas por ordem crescente de peso Em cada passo selecionar a aresta de menor valor que ainda não foi testada e, caso esta aresta junte duas árvores ainda não ligadas, então juntar a aresta, combinando as duas árvores numa única árvore. Vamos ver passo a passo para o grafo anterior... Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 18 / 28

Algoritmo de Kruskal (imagem de Introduction to Algorithms, 3rd Edition) Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 19 / 28

Algoritmo de Kruskal (imagem de Introduction to Algorithms, 3rd Edition) Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 20 / 28

Algoritmo de Kruskal (imagem de Introduction to Algorithms, 3rd Edition) Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 21 / 28

Algoritmo de Kruskal Vamos operacionalizar isto em código: Algoritmo de Kruskall para descobrir MST de G Kruskal(G, r): A Para todos os nós v de G fazer: MAKE-SET(v) /* criar árvore para cada nó */ Ordenar arestas de G por ordem crescente de peso Para cada aresta (u, v) de G fazer: /* segue ordem anterior */ Se FIND-SET(u) FIND-SET(v) então /* estão em árvores difer. */ A A {(u, v)} UNION(u,v) /* juntar duas árvores */ retorna(a) Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 22 / 28

Algoritmo de Kruskal Para além da ordenação, a complexidade do algoritmo de Kruskall depende das operações MAKE-SET, FIND-SET e UNION Vamos chamar MAKE-SET no início V vezes Cada aresta vai levar a duas chamadas a FIND-SET e potencialmente a uma chamada a UNION Uma implementação naive em que um conjunto é mantido numa lista, daria um MAKE-SET com O(1) (criar lista com o nó), um FIND-SET com O( V ) (procurar lista com elemento ) e um UNION com O(1) (juntar duas filas é só fazer o apontador do último nó de uma lista apontar para o início do primeiro nó da outra lista.) Isto daria uma complexidade de O( E V ) Se mantivermos um atributo auxiliar para cada nó dizendo qual o conjunto onde está, podemos fazer o FIND-SET em O(1), mas o UNION passa a custar O( V ) (mudar esse atributo para os nós de uma das listas a ser unida), pelo que a complexidade final não melhora. Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 23 / 28

Union-Find É possível reduzir para um tempo linearítmico se usarmos uma estrutura de dados que suporte estas operações em tempo logarítmico ou constante (supondo que a ordenação demora O(n log n))! Uma estrutura de dados para esta função (manter conjuntos, suportando as operaçãos FIND-SET e UNION) é conhecida como union-find, e uma boa maneira de a implementar é usando florestas de conjuntos disjuntos. Cada conjunto é representando por uma árvore Cada nó guarda uma referência para o seu pai O representando de um conjunto é o nó raíz da árvore do conjunto Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 24 / 28

Union-Find Uma maneira naive de implementar florestas de conjuntos disjuntos: Naive UNION-FIND MAKE-SET(x): x.pai x /* Raíz aponta para ela própria */ FIND(x): Se x.pai = x então retorna x Senão retorna FIND(x.pai) UNION(x, y): xraiz FIND(x) yraiz FIND(y) xraiz.pai yraiz Com esta implementação podemos continuar a ter tempo linear por operação porque as árvores podem ficar desiquilibradas (e com altura igual ao número de nós). Para melhorar vamos usar duas coisas... Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 25 / 28

Union-Find - Melhoria Union by Rank Union by Rank - Juntar sempre a árvore mais pequena à árvore maior quando se faz uma união. O que queremos é não fazer subir tanto a altura das árvores Isto garante que a altura das árvores só aumenta se as duas árvores já tiveram altura igual. A ideia é manter um atributo rank que nos diz essencialmente a altura da árvore. Esta melhoria, por si só, já garante uma complexidade logarítmica para os FIND e UNION! Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 26 / 28

Union-Find - Melhoria Union by Rank UNION-FIND com Union by Rank MAKE-SET(x): x.pai x x.rank 0 UNION(x, y): xraiz FIND(x) yraiz FIND(y) Se xraiz = yraiz então retorna /* x e y não estão no mesmo conjunto - temos de os unir */ Se xraiz.rank < yraiz.rank então xraiz.pai yraiz Senão, Se xraiz.rank > yraiz.rank então yraiz.pai xraiz Senão yraiz.pai xraiz xraiz.rank xraiz.rank + 1 Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 27 / 28

Union-Find - Melhoria Path Compression A segunda melhoria é comprimir as árvores ( path compression ), fazendo que todos os nós por onde um FIND passa passem a apontar directamente para a raíz, potencialmente diminuindo assim a altura da árvore UNION-FIND com Path Compression FIND(x): Se x.pai x então x.pai FIND(x.pai) retorna x.pai Com union by rank e path compression o custo amortizado por operação é, na prática, constante (para mais pormenores espreitar por exemplo o livro desta unidade curricular). O tempo para o algoritmo de Kruskall passa a ser dominado... pela ordenação das arestas! Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 28 / 28