Conjuntos disjuntos Objectivo

Slides:



Advertisements
Apresentações semelhantes
Árvores CC/EC/Mestrado Teoria dos Grafos ‏ 1.
Advertisements

Teoria dos Grafos – Aula 2
Análise de Decisão Aplicada a Gerência Empresarial – UVA Grafos - V
DESENHO de BASE de DADOS RELACIONAL
Sistemas operacionais
Exercícios PAA- Grafos
Pesquisa em profundidade
Problemas de fluxo numa rede
Árvores Equilibradas Sumário Splay B-tree Vermelho-Preto AA e BB
Estrutura de Dados e Algoritmos e Programação e Computadores II
Engenharia de Computação.
Algoritmos e Estrutura de Dados I
Padrão de Projeto Iterator
Árvores.

Introdução Redes LAN - abrangência: edifícios e campos.
Pesquisa em Memória Primária
Medida do Tempo de Execução de um Programa
HeapSort Filas de Prioridade – Heap
Medida do Tempo de Execução de um Programa
Medida do Tempo de Execução de um Programa
Pesquisa em Memória Primária
Listas lineares Listas Lineares Fila Dupla Pilha Fila Saída restrita
Listas lineares Listas Lineares Fila Dupla Pilha Fila Saída restrita
Árvores Introdução e Aplicações Árvores de Busca Binária Fundamentos
Classificação e Pesquisa de Dados
Walfredo Cirne walfredo.dsc.ufpb.br
Análise Léxica Supondo o trecho de programa abaixo:
Construção de Compiladores
Indução Métodos de prova já vistos Excepções
Robson Godoi / Sandra Siebra
Prof. Ernesto Lindstaedt
Árvore Geradora Mínima
Buscas em Grafos Prof. André Renato 1º Semestre/2012
Formas de representação e manipulação básica
Aula prática 6 Vetores e Matrizes
Pesquisa em Memória Primária
Exercícios PAA- Grafos
Algorítmos e estrutura de dados III
Aula 03 – BCC202 Análise de Algoritmos (Parte 1) Túlio Toffolo www
Aula T06 – BCC202 Análise de Algoritmos (Parte 4) Túlio Toffolo
Subset Sum Algoritmos e Estruturas de Dados – IF672
1. Se este nó é raiz de uma árvore QuasiEquilibrada de ordem k, e
Árvores Balanceadas Liliane Rose Benning Salgado.
Estruturas de Dados e Ordenação
Listas de Prioridades Em muitas aplicações, dados de uma coleção são acessados por ordem de prioridade A prioridade associada a um dado pode ser qualquer.
Escola Superior de Tecnologia e Gestão de Beja Engenharia Informática – Ano Lectivo 2010/2011 Estruturas de Dados e Algoritmos Apresentação do Trabalho.
© Copyright 2007 Algoritmos e Estruturas de Dados - Todos os direitos reservados Átila Valgueiro Malta Moreira Juliana Medeiros de Lucena Rafael Alberto.
Árvore Binária de Busca
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Busca Combinatorial e Métodos de Heurística
Estruturas de Dados Aula 15: Árvores
Linguagem de Programação II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
© 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice.
Conjuntos Algoritmos e Estruturas de Dados - IF672
Coleções em Java - Parte 2
Algoritmos FPT para o Problema da k-Cobertura por Vértices
POO - I PROF.: JEAN CARLO MENDES
Análise e Síntese de Algoritmos Estruturas de Dados p/ Conjuntos DisjuntosCLRS, Cap. 21.
JAVA – Fila ATAI.
Conjuntos - 1 Conjuntos disjuntos Objectivo ° resolver eficientemente o problema da equivalência ° estrutura de dados simples (vector) ° implementação.
1 TAD Fila com Prioridade -FCP ATAI. 2 TAD Fila com Prioridade (Priority Queue) TAD Fila com Prioridade armazena uma colecção de elementos com prioridade.
Estruturas de Dados Murilo Salgado Razoli.
Array e ArrayList LPOO – 01/09/14.
Arrays Outline 7.1 Introdução 7.2 Arrays 7.3 Declarando e Criando Arrays 7.4 Exemplos usando arrays 7.5 Ordenando arrays 7.6 Procurando em.
Estrutura de Dados Prof. André Cypriano M. Costa
Comportamento Assintótico
Aplicativos para Web Collections Prof. Odair
Transcrição da apresentação:

Conjuntos disjuntos Objectivo ° resolver eficientemente o problema da equivalência ° estrutura de dados simples (vector) ° implementação rápida Desempenho ° análise complicada Uso ° problemas de grafos ° equivalência de tipos em compiladores

Relações de equivalência o relação R definida num conjunto S se a R b = V ou a R b = F " a, b Î S a R b Þ a está relacionado com b o propriedades das relações de equivalência ° reflexiva a R a, " a Î S ° simétrica a R b ® b R a ° transitiva a R b, b R c ® a R c a b c d e f g h o exemplos de relações ° £ - reflexiva, transitiva; não é simétrica Þ não é de equivalência ° "pertencer ao mesmo país" (S é o conjunto das cidades) - reflexiva, simétrica, transitiva Þ relação de equivalência o classe de equivalência de a Î S ° subconjunto de S que contém os elementos relacionados com a ° relação de equivalência induz uma partição de S: cada elemento pertence exactamente a uma classe

Problema da equivalência dinâmica R: relação de equivalência Problema: dados a e b, determinar se a R b Solução: relação armazenada numa matriz bidimensional de booleanos Þ resposta em tempo constante Dificuldade: relações definidas implicitamente {a1, a2, a3, a4, a5} (25 pares) a1 R a2, a3 R a4, a5 R a1, a4 R a2 Þ todos relacionados ° pretende-se obter esta conclusão rapidamente Observação: a R b ¬ a e b pertencem à mesma classe de equivalência

Algoritmo abstracto o Entrada: colecção de n conjuntos, cada um com seu elemento - disjuntos - só propriedade reflexiva o Duas operações ° Busca - devolve o nome do conjunto que contém um dado elemento ° União - dados dois conjuntos substitui-os pela respectiva união (preserva a disjunção da colecção) o Método: acrescentar o par a R b à relação ° usa Busca em a e em b para verificar se pertencem já à mesma classe - se sim, o par é redundante - se não, aplica União às respectivas classes ° algoritmo dinâmico (os conjuntos são alterados por União) e em-linha (cada Busca tem que ser respondido antes de o algoritmo continuar) ° valores dos elementos irrelevantes Þ basta numerá-los com uma função de dispersão ° nomes concretos dos conjuntos irrelevantes Þ basta que a igualdade funcione

Privilegiando a Busca o Busca com tempo constante para o pior caso: ° implementação: vector indexado pelos elementos indica nome da classe respectiva ° Busca fica uma consulta de O(1) ° União(a, b): se Busca(a) = i e Busca(b) = j, pode-se percorrer o vector mudando todos os i's para j Þ custo Q(n) ° para n-1 Uniões (o máximo até ter tudo numa só classe) Þ tempo Q(n^2) ° se houver W(n^2) Busca, o tempo é O(1) para operação elementar; se não é mau o Melhoramentos: ° colocar os elementos da mesma classe numa lista ligada para saltar directamente de uns para os outros ao fazer a alteração do nome da classe (mantém o tempo do pior caso em O(n^2) ) ° registar o tamanho da classe de equivalência para alterar sempre a mais pequena; cada elemento é alterado no máximo log n vezes (cada fusão duplica a classe) Þ com n-1 fusões e m Buscas O(n log n + m)

Privilegiando a União o Representar cada conjunto como uma árvore • a raiz serve como nome do conjunto • as árvores podem não ser binárias: cada nó só tem um apontador para o pai • as árvores são armazenadas implicitamente num vector - p[i] contém o número do pai do elemento i - se i for uma raiz p[i] = 0 o União: fusão de duas árvores - pôr a raiz de uma a apontar para a outra ( O(1) ) - convenção: União(x, y) tem como raiz x o Busca(x) devolve a raiz da árvore que contém x - tempo proporcional à profundidade de x (n-1 no pior caso) - m operações podem durar O(mn) no pior caso o Não é possível ter tempo constante simultaneamente para União e Busca

Exemplo inicial 1 2 3 4 5 6 7 8 após União(5, 6) 1 2 3 4 5 7 8 6 representação implícita 0 0 0 0 0 5 5 7 8 1 2 3 4 5 6 7 8

Implementação construtor União (fraco) Busca simples Disj_Sets(int Num_Elements) { S_Size = Num_Elements; S_Array = new int [S_Size + 1]; for( int i=0; i <= S_Size; i++) S_Array[i] = 0; } Void Unir( int Root1, int Root2 ) { S_Array [ Root2 ] = Root1; } Busca simples int Busca( int X ) { if ( S_Array [ X ] <= 0 ) return X; else return Busca( S_Array[ X ] ); }

Análise no caso médio o Como definir "médio" relativamente à operação União? • depende do modelo escolhido (ver exemplo anterior; última situação) como no exemplo restaram 5 árvores, há 5*4 = 20 resultados equiprováveis da próxima União - 2/5 de hipóteses de envolver a árvore maior considerando como equiprováveis as Uniões entre dois quaisquer elementos de árvores diferentes - há 6 maneiras de fundir dois elementos de {1, 2, 3, 4} e 16 maneiras de fundir um elemento de {1, 2, 3, 4} e um de {5, 6, 7, 8} - probabilidade de a árvore maior estar envolvida: 16/22 o O tempo médio depende do modelo: Q(m), Q(m log n), Q(m n) • tempo quadrático é mau, mas evitável

União melhorada após União(4, 5) (altura 3) 1 2 3 4 5 6 7 8 União-por-Tamanho colocar a árvore menor como sub-árvore da maior (arbitrar em caso de empate) 1 2 3 5 após União(4, 5) (altura 2) 4 6 7 8

União-por-Tamanho o profundidade de cada nó — nunca superior a log n - um nó começa por ter profundidade 0 - cada aumento de profundidade resulta de uma união que produz uma árvore pelo menos com o dobro do tamanho - logo, há no máximo log n aumentos de profundidade - Busca é O( log n ); m operações é O(m log n) Pior caso para n=16 (União entre árvores de igual tamanho) 1 5 9 2 3 13 6 7 10 11 4 14 15 8 12 16 o registar a dimensão de cada árvore (na raiz respectiva e com sinal negativo) - o resultado de uma União tem dimensão igual à soma das duas anteriores - para m operações, dá O(m)

União-por-Altura o em vez da dimensão, regista-se a altura • coloca-se a árvore mais baixa como subárvore da mais alta • altura só se altera quando as árvores a fundir têm a mesma altura representação vectorial da situação após União(4, 5) União (melhorado) void União_por_Altura( int Root1, int Root2 ) { if (S_Array [ Root2 ] < S_Array[ Root1] ) S_Array[ Root1 ] = Root2; else if (S_Array [ Root1 ] == S_Array[ Root2] ) S_Array [ Root1 ]--; S_Array [ Root2 ] = Root1; } União-por-Tamanho -1 -1 -1 5 -5 5 5 7 1 2 3 4 5 6 7 8 União-por-Altura 0 0 0 5 -2 5 5 7 1 2 3 4 5 6 7 8

Compressão o algoritmo descrito é linear na maior parte das situações; mas no pior caso é O(m log n) - já não é fácil melhorar o União : actuar na Busca Compressão do caminho ao executar Busca(x), todos os nós no caminho de x até à raiz ficam com a raiz como pai Compressão após Busca_e_Compressão( 15 ) 1 15 13 5 9 2 3 16 14 6 7 10 11 4 8 12

Busca modificada a compressão é compatível com União-por-Tamanho Busca com compressão profundidade de vários nós diminui com União arbitrária, a compressão garante m operações, no pior caso, em tempo O(m log n) desconhece-se qual é, em média, o comportamento só da compressão int Busca ( int X ) { if ( S_Array [ X ] <= 0 ) return X; else return S_Array[ X ] = Busca ( S_Array[ X ] ); } a compressão é compatível com União-por-Tamanho não é completamente compatível com União-por-Altura: não é fácil computar eficientemente as alturas modificadas pela compressão não se modificam os valores: passam a ser entendidos como estimativas da altura, designados por nível ambos os métodos de União garantem m operações em tempo linear: não é evidente que a compressão traga vantagem em tempo médio: melhora o tempo no pior caso; a análise é complexa, apesar da simplicidade do algoritmo

Aplicação rede de computadores com uma lista de ligações bidireccionais; cada ligação permite a transferência de ficheiros de um computador para o outro • é possível enviar um ficheiro de um qualquer nó da rede para qualquer outro? • o problema deve ser resolvido em-linha, com as ligações apresentadas uma de cada vez o algoritmo começa por pôr cada computador em seu conjunto • o invariante é que dois computadores podem transferir ficheiros se estiverem no mesmo conjunto • esta capacidade determina uma relação de equivalência • à medida que se lêem as ligações vão-se fundindo os conjuntos o grafo da capacidade de transferência é conexo se no fim houver um único conjunto • com m ligações e n computadores o espaço requerido é O(n) • com União-por-Tamanho e compressão de caminho obtém-se um tempo no pior caso praticamente linear

Lema (para resultados de complexidade- Rever) Ao executar uma sequência de Uniões, um nó de nível r tem que ter 2^r descendentes (incluindo o próprio) Prova por indução a base, r = 0 é verdadeira: 2^0 = 1, e uma folha só tem um descendente (o próprio nó) seja T uma árvore de nível r com o mínimo número de descendentes e seja x a raiz de T suponha-se que a última União que envolveu x foi entre T1 e T2 e que x era a raiz de T1 se T1 tivesse nível r, T1 seria uma árvore de altura r com menos descendentes do que T, o que contradiz o pressuposto de T ser uma árvore com o número mínimo de descendentes. Portanto, o nível de T1  r-1. O nível de T2  nível de T1. Uma vez que o nível de T é r e o nível só pode aumentar devido a T2, segue-se que nível de T2 = r-1. Então também o nível de T1 = r-1. pela hipótese de indução, cada uma das árvores tem 2^(r-1) descendentes, dando um total de 2^r e estabelecendo o lema.