• Nenhum resultado encontrado

Análise do Union-Find

N/A
N/A
Protected

Academic year: 2021

Share "Análise do Union-Find"

Copied!
46
0
0

Texto

(1)

Análise do Union-Find

(2)

Coleção de conjuntos disjuntos

Queremos uma ED boa para representar uma partição de um conjunto

e as seguintes operações sobre a partição:

MakeSet(x): cria um conjunto unitário com o elementox.

FindSet(x): devolve o identificador do bloco da partição

que contémx.

Union(x,y): substitui os blocos da partição que contêm

xeypela união deles. Idéia:

Usar um elemento do conjunto (orepresentante) como identificador.

(3)

Coleção de conjuntos disjuntos

Queremos uma ED boa para representar uma partição de um conjunto

e as seguintes operações sobre a partição:

MakeSet(x): cria um conjunto unitário com o elementox.

FindSet(x): devolve o identificador do bloco da partição

que contémx.

Union(x,y): substitui os blocos da partição que contêm

xeypela união deles.

Idéia:

Usar um elemento do conjunto (orepresentante) como identificador.

(4)

Coleção de conjuntos disjuntos

Queremos uma ED boa para representar uma partição de um conjunto

e as seguintes operações sobre a partição:

MakeSet(x): cria um conjunto unitário com o elementox.

FindSet(x): devolve o identificador do bloco da partição

que contémx.

Union(x,y): substitui os blocos da partição que contêm

xeypela união deles. Idéia:

(5)

Como analizar?

Uso típico:

n− 1 Union, m FindSet, mn

em sequência arbitrária.

O custo de uma operação pode variar muito - é muito pessimista supor o pior caso em cada uma.

Vale a pena considerar uma sequência completa de operações, em vez de analizar uma a uma.

Isso se chamaAnálise Amortizada.

É um método especialmente útil para analizar estruturas adaptativas, em que uma operação pode preparar caminho para a execução de operações futuras.

(6)

Como analizar?

Uso típico:

n− 1 Union, m FindSet, mn

em sequência arbitrária.

O custo de uma operação pode variar muito - é muito pessimista supor o pior caso em cada uma.

Vale a pena considerar uma sequência completa de operações, em vez de analizar uma a uma.

Isso se chamaAnálise Amortizada.

É um método especialmente útil para analizar estruturas adaptativas, em que uma operação pode preparar caminho para a execução de operações futuras.

(7)

Como analizar?

Uso típico:

n− 1 Union, m FindSet, mn

em sequência arbitrária.

O custo de uma operação pode variar muito - é muito pessimista supor o pior caso em cada uma.

Vale a pena considerar uma sequência completa de operações, em vez de analizar uma a uma.

Isso se chamaAnálise Amortizada.

É um método especialmente útil para analizar estruturas adaptativas, em que uma operação pode preparar caminho para a execução de operações futuras.

(8)

Como analizar?

Uso típico:

n− 1 Union, m FindSet, mn

em sequência arbitrária.

O custo de uma operação pode variar muito - é muito pessimista supor o pior caso em cada uma.

Vale a pena considerar uma sequência completa de operações, em vez de analizar uma a uma.

Isso se chamaAnálise Amortizada.

É um método especialmente útil para analizar estruturas adaptativas, em que uma operação pode preparar caminho para a execução de operações futuras.

(9)

Como analizar?

Uso típico:

n− 1 Union, m FindSet, mn

em sequência arbitrária.

O custo de uma operação pode variar muito - é muito pessimista supor o pior caso em cada uma.

Vale a pena considerar uma sequência completa de operações, em vez de analizar uma a uma.

Isso se chamaAnálise Amortizada.

É um método especialmente útil para analizar estruturas adaptativas, em que uma operação pode preparar caminho para a execução de operações futuras.

(10)

Não é tão novidade assim

Numa busca em grafos:

1 para cadau∈G.V

2 para cadav∈u.Estrelafaça

Análise ingênua:

Como cada estrela tem tamanhoO(n), os dois laços combinados levamO(n2).

Análise amortizada:

Como na linha 2 cada arco é examinado uma única vez, os dois laços combinados levamO(m).

(11)

Não é tão novidade assim

Numa busca em grafos: 1 para cadau∈G.V

2 para cadav∈u.Estrelafaça

Análise ingênua:

Como cada estrela tem tamanhoO(n), os dois laços combinados levamO(n2).

Análise amortizada:

Como na linha 2 cada arco é examinado uma única vez, os dois laços combinados levamO(m).

(12)

Não é tão novidade assim

Numa busca em grafos: 1 para cadau∈G.V

2 para cadav∈u.Estrelafaça

Análise ingênua:

Como cada estrela tem tamanhoO(n), os dois laços combinados levamO(n2).

Análise amortizada:

Como na linha 2 cada arco é examinado uma única vez, os dois laços combinados levamO(m).

(13)

Não é tão novidade assim

Numa busca em grafos: 1 para cadau∈G.V

2 para cadav∈u.Estrelafaça

Análise ingênua:

Como cada estrela tem tamanhoO(n), os dois laços combinados levamO(n2).

Análise amortizada:

Como na linha 2 cada arco é examinado uma única vez, os dois laços combinados levamO(m).

(14)

Não é tão novidade assim

Numa busca em grafos: 1 para cadau∈G.V

2 para cadav∈u.Estrelafaça

Análise ingênua:

Como cada estrela tem tamanhoO(n), os dois laços combinados levamO(n2).

Análise amortizada:

Como na linha 2 cada arco é examinado uma única vez, os dois laços combinados levamO(m).

(15)

Não é tão novidade assim

Numa busca em grafos: 1 para cadau∈G.V

2 para cadav∈u.Estrelafaça

Análise ingênua:

Como cada estrela tem tamanhoO(n), os dois laços combinados levamO(n2).

Análise amortizada:

Como na linha 2 cada arco é examinado uma única vez, os dois laços combinados levamO(m).

(16)

Implementação 1 do union-find

I Cada conjunto é uma lista ligada, com cabeçalho apontando início e fim - facilitaUnion.

I Cada elemento da lista tem um apontadornomepara o cabeçalho - facilitaFindSet.

MakeSet(x) cria uma lista contendo sóx.

FindSetrespondido direto pelonome.

Union: juntar as duas listas é fácil, mas é preciso atualizar

onomedos membros de um dos conjuntos.

MakeSeteFindSetlevamO(1), mas váriosUnion

(17)

Implementação 1 do union-find

I Cada conjunto é uma lista ligada, com cabeçalho apontando início e fim - facilitaUnion.

I Cada elemento da lista tem um apontadornomepara o cabeçalho - facilitaFindSet.

MakeSet(x) cria uma lista contendo sóx.

FindSetrespondido direto pelonome.

Union: juntar as duas listas é fácil, mas é preciso atualizar

onomedos membros de um dos conjuntos.

MakeSeteFindSetlevamO(1), mas váriosUnion

(18)

Implementação 1 do union-find

I Cada conjunto é uma lista ligada, com cabeçalho apontando início e fim - facilitaUnion.

I Cada elemento da lista tem um apontadornomepara o cabeçalho - facilitaFindSet.

MakeSet(x) cria uma lista contendo sóx.

FindSetrespondido direto pelonome.

Union: juntar as duas listas é fácil, mas é preciso atualizar

onomedos membros de um dos conjuntos.

MakeSeteFindSetlevamO(1), mas váriosUnion

(19)

Implementação 1 do union-find

I Cada conjunto é uma lista ligada, com cabeçalho apontando início e fim - facilitaUnion.

I Cada elemento da lista tem um apontadornomepara o cabeçalho - facilitaFindSet.

MakeSet(x) cria uma lista contendo sóx.

FindSetrespondido direto pelonome.

Union: juntar as duas listas é fácil, mas é preciso atualizar

onomedos membros de um dos conjuntos.

MakeSeteFindSetlevamO(1), mas váriosUnion

(20)

Implementação 1 do union-find

I Cada conjunto é uma lista ligada, com cabeçalho apontando início e fim - facilitaUnion.

I Cada elemento da lista tem um apontadornomepara o cabeçalho - facilitaFindSet.

MakeSet(x) cria uma lista contendo sóx.

FindSetrespondido direto pelonome.

Union: juntar as duas listas é fácil, mas é preciso atualizar

onomedos membros de um dos conjuntos.

MakeSeteFindSetlevamO(1), mas váriosUnion

(21)

Implementação 1 do union-find

I Cada conjunto é uma lista ligada, com cabeçalho apontando início e fim - facilitaUnion.

I Cada elemento da lista tem um apontadornomepara o cabeçalho - facilitaFindSet.

MakeSet(x) cria uma lista contendo sóx.

FindSetrespondido direto pelonome.

Union: juntar as duas listas é fácil, mas é preciso atualizar

onomedos membros de um dos conjuntos.

MakeSeteFindSetlevamO(1), mas váriosUnion

(22)

Melhoria

NaUnion, pendure a lista menor na maior (cabeçalho

precisa guardar o tamanho da lista).

Agora, cada vez que um elemento muda denome,

o conjunto em que ele está pelo menos dobra de tamanho. Assim, seunomemuda no máximo lgnvezes

.

Tempo total den Union:O(nlgn)

.

(23)

Melhoria

NaUnion, pendure a lista menor na maior (cabeçalho

precisa guardar o tamanho da lista).

Agora, cada vez que um elemento muda denome,

o conjunto em que ele está pelo menos dobra de tamanho. Assim, seunomemuda no máximo

lgn vezes

.

Tempo total den Union:O(nlgn)

.

(24)

Melhoria

NaUnion, pendure a lista menor na maior (cabeçalho

precisa guardar o tamanho da lista).

Agora, cada vez que um elemento muda denome,

o conjunto em que ele está pelo menos dobra de tamanho. Assim, seunomemuda no máximo lgn vezes.

Tempo total den Union:O(nlgn)

.

(25)

Melhoria

NaUnion, pendure a lista menor na maior (cabeçalho

precisa guardar o tamanho da lista).

Agora, cada vez que um elemento muda denome,

o conjunto em que ele está pelo menos dobra de tamanho. Assim, seunomemuda no máximo lgn vezes.

Tempo total den Union:O(nlgn).

(26)

Melhoria

NaUnion, pendure a lista menor na maior (cabeçalho

precisa guardar o tamanho da lista).

Agora, cada vez que um elemento muda denome,

o conjunto em que ele está pelo menos dobra de tamanho. Assim, seunomemuda no máximo lgn vezes.

Tempo total den Union:O(nlgn). Tempo total:O(m+nlgn)

(27)

Implementação 2 do union-find

Cada conjunto é uma árvore apontando para a raíz.

MakeSet(x)

1 x.pai←x

FindSet(x)

1 sex=x.pai 2 devolvax

3 devolvaFindSet(x.pai)

FindSet(x)

1 enquantox.pai,xfaça 2 x←x.pai

3 devolvax

Union(x,y) xeyrepresentantes distintos

1 y.paix

Consumo de tempo:doFindSetpode ser muito ruim...Ê(n).

(28)

Implementação 2 do union-find

Cada conjunto é uma árvore apontando para a raíz.

MakeSet(x)

1 x.pai←x

FindSet(x)

1 sex=x.pai 2 devolvax

3 devolvaFindSet(x.pai)

FindSet(x)

1 enquantox.pai,xfaça 2 x←x.pai

3 devolvax

Union(x,y) xeyrepresentantes distintos

1 y.paix

Consumo de tempo:doFindSetpode ser muito ruim...Ê(n).

(29)

Implementação 2 do union-find

Cada conjunto é uma árvore apontando para a raíz.

MakeSet(x)

1 x.pai←x

FindSet(x)

1 sex=x.pai 2 devolvax

3 devolvaFindSet(x.pai)

FindSet(x)

1 enquantox.pai,xfaça 2 x←x.pai

3 devolvax

Union(x,y) xeyrepresentantes distintos

1 y.paix

Consumo de tempo:doFindSetpode ser muito ruim...Ê(n).

(30)

Implementação 2 do union-find

Cada conjunto é uma árvore apontando para a raíz.

MakeSet(x)

1 x.pai←x

FindSet(x)

1 sex=x.pai 2 devolvax

3 devolvaFindSet(x.pai)

FindSet(x)

1 enquantox.pai,xfaça 2 x←x.pai

3 devolvax

Union(x,y) xeyrepresentantes distintos

1 y.pai←x

(31)

Implementação 2 do union-find

Cada conjunto é uma árvore apontando para a raíz.

MakeSet(x)

1 x.pai←x

FindSet(x)

1 sex=x.pai 2 devolvax

3 devolvaFindSet(x.pai)

FindSet(x)

1 enquantox.pai,xfaça 2 x←x.pai

3 devolvax

Union(x,y) xeyrepresentantes distintos

1 y.pai←x

(32)

Melhoria 1

Heurística das alturas

MakeSet(x)

1 x.pai←x 2 x.rank← 0

FindSet(x): o mesmo de antes

Union(x,y) xeyrepresentantes distintos

1 sex.rank≥y.rank 2 então y.pai←x

3 entãosex.rank=y.rank

4 entãoentãox.rank←x.rank+ 1 5 senãox.pai←y

Invariante:x.rank≥ altura da árvore pendurada emx. Melhorou:FindSetéÊ(lgn). Total:O(n+mlgn)

(33)

Melhoria 1

Heurística das alturas

MakeSet(x)

1 x.pai←x 2 x.rank← 0

FindSet(x): o mesmo de antes

Union(x,y) xeyrepresentantes distintos

1 sex.rank≥y.rank 2 então y.pai←x

3 entãosex.rank=y.rank

4 entãoentãox.rank←x.rank+ 1 5 senãox.pai←y

Invariante:x.rank≥ altura da árvore pendurada emx. Melhorou:FindSetéÊ(lgn). Total:O(n+mlgn)

(34)

Melhoria 1

Heurística das alturas

MakeSet(x)

1 x.pai←x 2 x.rank← 0

FindSet(x): o mesmo de antes

Union(x,y) xeyrepresentantes distintos

1 sex.rank≥y.rank 2 então y.pai←x

3 entãosex.rank=y.rank

4 entãoentãox.rank←x.rank+ 1 5 senãox.pai←y

Invariante:x.rank≥ altura da árvore pendurada emx. Melhorou:FindSetéÊ(lgn). Total:O(n+mlgn)

(35)

Melhoria 1

Heurística das alturas

MakeSet(x)

1 x.pai←x 2 x.rank← 0

FindSet(x): o mesmo de antes

Union(x,y) xeyrepresentantes distintos

1 sex.rank≥y.rank 2 então y.pai←x

3 entãosex.rank=y.rank

4 entãoentãox.rank←x.rank+ 1 5 senãox.pai←y

Invariante:x.rank≥ altura da árvore pendurada emx.

Melhorou:FindSetéÊ(lgn). Total:O(n+mlgn)

(36)

Melhoria 1

Heurística das alturas

MakeSet(x)

1 x.pai←x 2 x.rank← 0

FindSet(x): o mesmo de antes

Union(x,y) xeyrepresentantes distintos

1 sex.rank≥y.rank 2 então y.pai←x

3 entãosex.rank=y.rank

4 entãoentãox.rank←x.rank+ 1 5 senãox.pai←y

(37)

Melhoria 1

Heurística das alturas

MakeSet(x)

1 x.pai←x 2 x.rank← 0

FindSet(x): o mesmo de antes

Union(x,y) xeyrepresentantes distintos

1 sex.rank≥y.rank 2 então y.pai←x

3 entãosex.rank=y.rank

4 entãoentãox.rank←x.rank+ 1 5 senãox.pai←y

Invariante:x.rank≥ altura da árvore pendurada emx. Melhorou: éÊ(lgn). Total:O(n+mlgn)

(38)

Implementação 3

Heurística da compressão dos caminhos

FindSet(x)

1 ifx.pai,x

2 entãox.pai←FindSet(x.pai) 3 devolvax.pai

Consumo amortizado de tempo de cada operação: O(lg∗n),

onde lg∗n é o número de vezes que temos que aplicar o lg até atingir um número menor ou igual a 1.

Na verdade, é melhor do que isso.

(39)

Implementação 3

Heurística da compressão dos caminhos

FindSet(x)

1 ifx.pai,x

2 entãox.pai←FindSet(x.pai) 3 devolvax.pai

Consumo amortizado de tempo de cada operação: O(lg∗n),

onde lg∗n é o número de vezes que temos que aplicar o lg até atingir um número menor ou igual a 1.

Na verdade, é melhor do que isso.

(40)

Implementação 3

Heurística da compressão dos caminhos

FindSet(x)

1 ifx.pai,x

2 entãox.pai←FindSet(x.pai) 3 devolvax.pai

Consumo amortizado de tempo de cada operação: O(lg∗n),

(41)

O que isso significa

Duas maneiras de entender o lg∗:

lg(0)(n) =n lg(k)(n) = lg(lg(k −1)(n)), k > 0 lg∗(n) = min{k | lg(k)(n) ≤ 1} b0= 1 bk = 2bk −1, k> 0 lg∗(n) = min{k |n< bk}.

(42)

O que isso significa

Duas maneiras de entender o lg∗:

lg(0)(n) =n lg(k)(n) = lg(lg(k −1)(n)), k > 0 lg∗(n) = min{k | lg(k)(n) ≤ 1} b0= 1 bk = 2bk −1, k> 0

(43)

O que isso significa

bn = 222 ... 2 |{z} ntimes k bk 0 1 1 2 2 4 3 16 4 65536 5 > 1019000

No mundo real, lg

n

≤ 5

.

(44)

O que isso significa

bn = 222 ... 2 |{z} ntimes k bk 0 1 1 2 2 4 3 16 4 65536 5 > 1019000

No mundo real, lg

n

≤ 5

.

(45)

O que isso significa

bn = 222 ... 2 |{z} ntimes k bk 0 1 1 2 2 4 3 16 4 65536 5 > 1019000

No mundo real, lg

n

≤ 5

.

(46)

O que isso significa

bn = 222 ... 2 |{z} ntimes k bk 0 1 1 2 2 4 3 16 4 65536

Referências

Documentos relacionados

O material de estudo foi originado de folhas coletadas em estado intermediário de maturação, em 122 acessos procedentes de 10 municípios dos Es- tados de Goiás: Aporé-GO (09

Gestão de Capital é definida como: i) Monitoramento e controle do capital mantido pela instituição ii) Avaliação da necessidade de capital para fazer face aos riscos a que a

As diferentes elasticidades obtidas para países africanos mostram que o aumento do preço dos bilhetes devido à aplicação de uma taxa da União Africana praticamente

Usado com o Direct Phone Link 2, o Beltone Smart Remote permite que você use seu dispositivo móvel para obter facilmente uma visão geral e controlar remotamente seus

• Caso seja necessário unir todos os elementos e depois verificar cada um a que conjunto ele pertence, todos os elementos precisaria sofrem um Union e depois um Find. • O tempo de

Os resultados destas abordagens paralelas chamadas de Region Growth Parallel Version (RGX_PV) e Union Find Parallel Version (UFX_PV), foram comparados com os

Dentre os estágios identificados pelos autores, o primeiro passo já foi trabalhado pela seção 4.1, na qual foram apresentados os dados que compõem o corpus da pesquisa, juntamente

Considerando ainda as questões em cursos, novas e emergentes como sendo: (1) Estatísticas das receitas; (2) Roteiro para o Desenvolvimento de Sistemas de Informação do