• Nenhum resultado encontrado

do union-find

No documento Análise do Union-Find (páginas 21-41)

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 podem gastarÒ(n2)mudanças denome.

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)

.

Tempo total:O(m+nlgn)

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)

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)

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)

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)

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) Bxey representantes distintos 1 y.pai←x

Consumo de tempo:doFindSetpode ser muito ruim...Ê(n). Temos que fazer melhor...

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) Bxey representantes distintos 1 y.pai←x

Consumo de tempo:doFindSetpode ser muito ruim...Ê(n). Temos que fazer melhor...

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) Bxey representantes distintos 1 y.pai←x

Consumo de tempo:doFindSetpode ser muito ruim...Ê(n). Temos que fazer melhor...

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) Bxey representantes distintos 1 y.pai←x

Temos que fazer melhor...

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) Bxey representantes distintos 1 y.pai←x

Ê(n).

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) Bxey representantes 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)

Um pouco pior que antes, masdá para fazer melhor ainda!

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) Bxey representantes 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)

Um pouco pior que antes, masdá para fazer melhor ainda!

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) Bxey representantes 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)

Um pouco pior que antes, masdá para fazer melhor ainda!

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) Bxey representantes 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)

Um pouco pior que antes, masdá para fazer melhor ainda!

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) Bxey representantes 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

Um pouco pior que antes, masdá para fazer melhor ainda!

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) Bxey representantes 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)

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

Consumoamortizadode tempo de cada operação: O(lgn),

onde lgné 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.

A análise desta ED é vista na disciplina MAC6711.

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

Consumoamortizadode tempo de cada operação:

O(lgn),

onde lgné 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.

A análise desta ED é vista na disciplina MAC6711.

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

Consumoamortizadode tempo de cada operação:

O(lgn),

onde lgné o número de vezes que temos que aplicar o lg até

No documento Análise do Union-Find (páginas 21-41)

Documentos relacionados