26 de fevereiro (Aula 1):
- Introdução
- Questionário
- Problema de conexidade.
Considere uma seqüência de pares de inteiros onde cada
inteiro representa um objeto e um par p-q indica que "p
está ligado a q". Assuma que a relação "estar ligado a" é
transitiva, ou seja, se p está ligado a q e q está ligado
a r, então p está ligado a r.
Objetivo: escrever um programa que leia pares de
inteiros e imprima um par apenas se este já não for
conseqüência dos anteriores, ou seja, um par p-q é
impresso apenas se os pares anteriores não implicarem que
p está ligado a q. Se p está ligado a q, então o par p-q
não é impresso e passa-se ao próximo par.
- Operações find e union
- Primeira implementação do union-find: a chamada
quick-find. Usa-se um vetor id onde id[i] = id[j] se e
somente se i e j estão conectados.
[impl 1]
- Segunda implementação do union-find: a chamada
quick-union. [impl 2]
- Terceira implementação do union-find: quick-union com
heurística dos tamanhos. [impl 3]
Leitura recomendada: Seções 1.2 e 1.3 do
Sedgewick.
Além das implementações, pegue algumas entradas para você testar
com os programas acima e sentir a diferença no tempo consumido
pelas diferentes implementações de union-find. Sinta a diferença
que pode fazer a escolha de uma boa estrutura de dados.
[entrada0]
[entrada1]
[entrada2]
Em qual dessas entradas você sentiu mais a diferença de tempo
entre as implementações? Qual implementação parece mais rápida?
Quão mais rápida?