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

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

Conjuntos disjuntos dinâmicos

Aula 19 Conjuntos disjuntos (Union-find)

AULA 22. Algoritmos p.793/823

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

Análise de Algoritmos

Melhores momentos AULA 22. Algoritmos p.824/855

Projeto e Análise de Algoritmos

Árvores de Suporte de Custo Mínimo

Algoritmo de Kruskal. Algoritmo de Kruskal. Floresta geradora 26. Subfloresta S 20.3

Árvores de Suporte de Custo Mínimo

CAL ( ) MIEIC/FEUP Estruturas de Dados ( )

Caminho mais curto a partir de um nó Algoritmos de Dijkstra e Bellman-Ford. O problema tem subestrutura óptima

Caminho mais curto a partir de um nó Algoritmos de Dijkstra e Bellman-Ford

Conjuntos disjuntos. Objectivo resolver eficientemente o problema da equivalência estrutura de dados simples (vector) implementação rápida

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

Grafos. Exemplo de árvore geradora mínima. Notas. Notas. Notas. Notas. Árvores espalhadas mínimas. Como construir uma árvore geradora miníma

Conjuntos disjuntos. Relações de equivalência

Sub-grafo. Árvore Geradora Mínima

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

Caminhos mínimos de única origem

INF 1010 Estruturas de Dados Avançadas

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca

Divisão e Conquista: Par de Pontos mais Próximo

Aula 03: Análise de algoritmos melhor caso, pior caso e caso médio

Análise de Algoritmos

Grafos. Notas. Notas. Notas. Notas. Caminhos mais curtos de única origem. Subestrutura ótima. Propriedades de caminhos mais curtos

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

Otimização em Grafos

O estudo utilizando apenas este material não é suficiente para o entendimento do conteúdo. Recomendamos a leitura das referências no final deste

Estruturas de dados para listas arrays e listas ligadas

INF 1010 Estruturas de Dados Avançadas

Heaps binomiais. Gabriel Pedro de Castro. 20 de setembro de 2007

Árvores & Árvores Binárias

Análise e Síntese de Algoritmos. Revisão CLRS, Cap. 4, 6

AED2 - Aula 04 Vetores ordenados e árvores de busca

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

Análise e Síntese de Algoritmos

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

Grafos - Introdução. Pedro Ribeiro 2014/2015 DCC/FCUP. Pedro Ribeiro (DCC/FCUP) Grafos - Introdução 2014/ / 32

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

Projeto e Análise de Algoritmos. Método Guloso

Árvores Conceitos gerais

Projeto e Análise de Algoritmos Aula 8: Algoritmos Gulosos (DPV 5; CLRS 4)

Árvores & Árvores Binárias

Listas (Parte 1) Túlio Toffolo BCC202 Aula 09 Algoritmos e Estruturas de Dados I

Tipos de Dados Dinâmicos

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

ESTRUTURA DE DADOS. Árvores, árvores binárias e percursos. Cristina Boeres

Árvores Árvores Geradoras de Custo Mínimo 0/16

O grau de saída d + (v) de um vértice v é o número de arcos que tem

Projeto e Análise de Algoritmos Aula 8: Algoritmos Gulosos (5)

Árvores. SCC-214 Projeto de Algoritmos. Thiago A. S. Pardo. Um nó após o outro, adjacentes Sem relações hierárquicas entre os nós, em geral

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

Árvores. Algoritmos e Estruturas de Dados I. José Augusto Baranauskas Departamento de Física e Matemática FFCLRP-USP

Edital de Seleção 053/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Árvores & Árvores Binárias

Melhores momentos AULA PASSADA. Complexidade Computacional p. 205

Análise e Síntese de Algoritmos. Algoritmos em Grafos CLRS, Cap. 22

Árvores de Pesquisa. A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação.

Filas de Prioridade. Uma fila de prioridade pode ser vista como uma generalização das filas com as seguintes duas operações:

Aula 16: Pesquisa em Memória Primária - Árvores de Busca. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

UFJF - DCC - Estrutura de Dados e Laboratório de Programação II

Algoritmos de Ordenação: Cota Inferior

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

Pesquisa: operação elementar

Estruturas de Dados Pilhas, Filas, Listas

Caminho mais curto. 1 - Caminho não pesado

Árvore Binária de Busca

AED Algoritmos e Estruturas de Dados LEEC/LEE / semestre. Motivação Problema da Conectividade

BCC202 - Estrutura de Dados I

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

O estudo utilizando apenas este material não é suficiente para o entendimento do conteúdo. Recomendamos a leitura das referências no final deste

Algoritmos de Ordenação: MergeSort

Algoritmos de ordenação Heapsort

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

8. Árvores. Fernando Silva DCC-FCUP. Estruturas de Dados. Fernando Silva (DCC-FCUP) 8. Árvores Estruturas de Dados 1 / 38

8. Árvores. Fernando Silva. Estruturas de Dados DCC-FCUP. Fernando Silva (DCC-FCUP) 8. Árvores Estruturas de Dados 1 / 38

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches

IPRJ PROJETO E ANÁLISE DE ALGORITMOS LISTA DE EXERCÍCIOS 10

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

ÁRVORE B. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Pesquisa em Grafos. Pedro Ribeiro 2014/2015 DCC/FCUP. Pedro Ribeiro (DCC/FCUP) Pesquisa em Grafos 2014/ / 33

CONCEITO DE ÁRVORE CES-11. A raiz é o único nó que não possui ancestrais. As folhas são os nós sem filhos. Exemplos:

Aula 13: Ordenação - Heapsort. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Árvores Binárias e Busca. Jeane Melo

DFS: Depth-First Search (pesquisa em profundidade) Percursos e Conectividade em Grafos Depth-First Search. Implementação de DFS

Melhores momentos AULAS 1-8

BUSCA EM ARRAYS. Prof. André Backes. Ato de procurar por um elemento em um conjunto de dados

Listas Lineares. Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.1

CES-11. Algoritmos e Estruturas de Dados

Aula 19: Percursos em árvores binárias. Percurso em pré-ordem, ordem simétrica e pós-ordem. Algoritmo para cálculo de altura uma árvore binária

Lista Ligada Linear - Retirar elemento

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Linguagem C: Árvores AVL

Estrutura de Dados Listas

Pesquisa em Memória Primária Árvores de Busca. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Transcrição:

Estruturas de Dados para Conjuntos Disjuntos Fernando Lobo Algoritmos e Estrutura de Dados II 1 / 32 Estruturas de dados para conjuntos disjuntos Também conhecido por UNION-FIND. Objectivo: Manter uma colecção S = {S 1, S 2,..., S k } de conjuntos disjuntos, que se modificam ao longo do tempo. Como modificação apenas é permitido a união de conjuntos (retirar elementos ou partir um conjunto em dois não é permitido). 2 / 32

Estruturas de dados para conjuntos disjuntos Cada conjunto é identificado por um representante. A escolha do representante é irrelevante. O importante é que se tentarmos obter o representante de um conjunto duas vezes (sem modificar o conjunto), obtemos sempre a mesma resposta. Esta Estrutura de Dados tem muitas aplicações. Acabamos de ver uma delas na aula passada. 3 / 32 Operações Make-Set(x): cria S i = {x} e acrescenta-o a S. Find-Set(x): retorna um indentificador do conjunto que contém x. Union(x, y): se x S i e y S j, então S = S S i S j {S i S j} 4 / 32

Análise A análise será feita em termos de: n = n o total de elementos = n o de Make-Sets. m = n o total de operações. m n porque Make-Sets contam para o número total de operações. Só podemos ter no máximo n 1 Unions (depois disso só nos resta um conjunto). 5 / 32 Exemplo de aplicação: Componentes conexas de um grafo Connected-Components(G) for each v G.V Make-Set(v) for each (u, v) G.E if Find-Set(u) Find-Set(v) Union(u, v) 6 / 32

Exemplo de aplicação: Componentes conexas de um grafo Uma vez obtidas as componentes conexas, a função Same-Component permite verificar se dois nós estão na mesma componente. Same-Component(u, v) if Find-Set(u) == Find-Set(v) return true else return false 7 / 32 Exemplo (b,d) (e,g) (a,c) (h,i) (a,b) (e,f) (b,c) Colecção de conjuntos disjuntos {a} {b} {c} {d} {e} {f} {g} {h} {i} {j} {a} {b,d} {c} {e} {f} {g} {h} {i} {j} {a} {b,d} {c} {e,g} {f} {h} {i} {j} {a,c} {b,d} {e,g} {f} {h} {i} {j} {a,c} {b,d} {e,g} {f} {h,i} {j} {a,b,c,d} {e,g} {f} {h,i} {j} {a,b,c,d} {e,f,g} {h,i} {j} {a,b,c,d} {e,f,g} {h,i} {j} 8 / 32

Como implementar estas operações de modo eficiente? Primeira abordagem: usar uma lista para cada conjunto. Cada elemento da lista tem: um elemento do conjunto. apontador para o representante do conjunto (o primeiro elemento da lista). apontador para o elemento seguinte da lista. A lista tem apontador para a cabeça e para a cauda. 9 / 32 10 / 32

1 a abordagem (cont.) Make-Set(x) cria-se uma nova lista com um único elemento O(1). Find-Set(x) basta retornar o elemento apontado para o representante (o primeiro da lista) O(1). 11 / 32 Union(x, y) temos que concatenar a lista que contém x no final da lista que contém y, ou vice-versa. Apontador para a cauda permite fazê-lo em O(1). Mas mesmo assim, é necessário actualizar O(n) apontadores para o representante do conjunto. Logo a complexidade é O(n). 12 / 32

Heurística: fazer a concatenação da lista pequena na lista grande A união que vimos pode ser problemática quando fazemos a concatenção de uma lista grande na cauda de uma lista pequena. Podemos melhorar a performance se fizermos sempre a concatenação da lista mais pequena na lista grande. Fácil, basta manter para cada lista um atributo adicional que indica o comprimento da lista. Mesmo assim, uma união pode demorar Ω(n). Pode-se provar (demo. no vosso livro) que uma sequência de m operações sobre n elementos demora O(m + n lg n). O(m) para as operações Make-Set e Find-Set. O(n lg n) para as operações Union. 13 / 32 2 a abordagem É possível fazer melhor. Em vez de representar um conjunto por uma lista, representamo-lo por uma árvore invertida. Cada nó aponta apenas para o seu pai. A raíz aponta para si própria. O elemento que está na raíz é o representante do conjunto. 14 / 32

15 / 32 2 a abordagem (cont.) Make-Set(x) Faz uma árvore com um só nó. Find-Set(x) Segue apontadores até chegar à raíz. Retorna o elemento que está na raíz. Union(x, y) Faz a raíz de uma das árvores ficar filha da raíz da outra árvore. 16 / 32

Exemplo: Union(e, f ) 17 / 32 Exemplo (cont.) 18 / 32

Melhorando a performance Com esta estrutura de dados, também é possível obtermos uma árvore degenerada em lista. Podemos melhorar com duas heurísticas: 1. Union by rank pendurar a árvore de menor altura na árvore de maior altura. 2. Path compression ao fazer um Find-Set(x) rearranja-se a árvore de modo a que todos os nós no caminho de x até à raíz passem a apontar directamente para a raíz. 19 / 32 Union by rank Usamos o rank da raíz um limite superior para a altura da árvore. (Por enquanto pensem no rank como sendo a altura da árvore.) Ao fazer a união, compara-se o rank das raízes. Pendura-se a de menor rank como filha da raíz da de maior rank. A ideia é evitar que a altura da árvore resultante cresça demasiado. 20 / 32

Implementação A implementação é muito simples. Cada nó só necessita de saber quem é o seu pai e o seu rank. = basta ter um array para representar a floresta. 21 / 32 Pseudocódigo para union by rank Make-Set(x) parent[x] = x rank[x] = 0 Find-Set(x) while x parent[x] x = parent[x] return x 22 / 32

Pseudocódigo para union by rank Union(x, y) rx = Find-Set(x) ry = Find-Set(y) if rx == ry return if rank[rx] > rank[ry] parent[ry] = rx else parent[rx] = ry if rank[rx] == rank[ry] rank[ry] = rank[ry] + 1 23 / 32 Observações sobre a heurística union by rank O rank de um nó é a altura da sub-árvore que tem esse nó como raíz. Propriedade 1: Para qualquer nó x excepto a raíz, rank[x] < rank[parent[x]] (porque um nó raíz de rank k é criado por junção de duas árvores com raízes de rank k 1) Propriedade 2: Qualquer nó raíz de rank k tem pelo menos 2 k nós na sua árvore. (pode ser facilmente demonstrado por indução.) Propriedade 3: Se tivermos n elementos, só poderá haver no máximo n/2 k nós com rank k. ( = rank máximo é lg n = todas as árvores têm altura lg n.) 24 / 32

Path compression Ao fazer um Find-Set(x) temos de percorrer o caminho do nó x até à raíz da árvore. Podemos aproveitar isso para pendurar todos os nós ao longo do caminho directamente como filhos da raíz. Pode ser feito gastando apenas tempo constante por elemento ao longo do caminho de x até à raíz. Todas as operações find subsequentes sobre elementos que estavam no caminho de x até à raíz, serão feitas de forma mais rápida. As árvores tornam-me mais largas e menos profundas. 25 / 32 Path compression. Exemplo 26 / 32

Pseudocódigo para path compression Find-Set(x) if x parent[x] parent[x] = Find-Set(parent[x]) return parent[x] Make-Set(x) and Union(x, y) ficam inalterados. 27 / 32 Observações sobre path compression Os ranks dos nós não se alteram devido à operação de path compression. Mas o rank deixa de poder ser interpretado como sendo a altura da árvore. O rank passa a ser um limite superior para altura da árvore. 28 / 32

Complexidade Pode-se provar que a complexidade temporal de uma sequência de m operações sobre n elementos é O(m lg n) = O custo amortizado por operação é O(lg n) m é o número total de operações (Make-Sets, Find-Sets e Unions). n é o número de Make-Sets. lg n é o número de aplicações consecutivas da função logaritmo que é necessário aplicar a n para obter um número igual ou inferior a 1 (iterated log function). 29 / 32 lg cresce de forma muito lenta lg 2 = 1 lg 4 = lg 2 2 = 2 lg 16 = lg 2 22 = 3 lg 65536 = lg 2 222 = 4 lg 2 65536 = lg 2 2222 = 5 2 65536 = 2 2222 é ENORME, muito maior que o n o de átomos do universo! = Em qualquer aplicação prática, lg n 5. O tempo gasto para uma sequência de m operações é um nadinha superior a linear em m. Para efeitos práticos (i.e., para n < 2 65536 ), uma sequência de m operações é O(m) = custo amortizado por operação é O(1). 30 / 32

Revisitando a complexidade do algoritmos de Kruskal Primeiro ciclo for: O(V ) Make-Sets Ordenar E: O(E lg E) Segundo ciclo for: O(E) Find-Sets e Unions 31 / 32 Revisitando a complexidade do algoritmos de Kruskal Com a implementação de UNION-FIND com union by rank e path compression: Primeiro ciclo for: O(V ) Segundo ciclo for: O(E lg E) (para efeitos práticos, lg E 5 = O(1). A complexidade total é dominada pela ordenação dos arcos: O(E lg E) = O(E lg V ). Porquê? Porque E V 2 = lg E lg V 2 = 2 lg V = O(lg V ) 32 / 32