O exercício a seguir foi entregue aos alunos que eu supervisiono:
Dados pontos no plano, crie um algoritmo que encontre um par de pontos cuja distância seja mínima entre todos os pares de pontos. O algoritmo deve ser executado no tempo .
Existe um algoritmo de divisão e conquista (relativamente) simples que resolve a tarefa no tempo .
Pergunta 1 : Existe um algoritmo que resolve o problema em questão exatamente na pior das hipóteses, ?
O que me fez suspeitar que isso seja possível é um resultado que lembro de ter visto em alguma conversa (referência apreciada). Ele afirmou algo ao longo das linhas que não mais do que um número constante de pontos pode ser arranjado no plano em torno de algum ponto dentro de um círculo de raio , com a distância mínima entre dois dos pontos envolvidos . Eu acho que , os pontos formando um hexágono equilateral com no centro (no caso extremo).
Nesse caso, o algoritmo a seguir deve resolvê-los em etapas.
fun mindist [] | p::[] = INFINITY
| mindist p1::p1::[] = dist(P[0], P[1])
| mindist p::r = let m = mindist(r) in
min(m, nextNeighbour(p, r, m))
end
Note que este é (alegou ser) em tempo linear, pois apenas um número constante de pontos r
pode haver farer longe do que m
a partir de p
(assumindo acima declaração); somente esses pontos precisam ser investigados para encontrar um novo mínimo. Há uma pegadinha, é claro; como você implementa nextNeighbour
(talvez com pré-processamento em tempo linear)?
Pergunta 2 : Deixe um conjunto de pontos e um ponto p ∉ R . Seja m ∈ R com
e
.
Suponha que seja finito. É possível encontrar com distância mínima de em tempo (amortizado) ? (Você pode supor que seja construído adicionando pontos investigados um por um.) p ' ∈ R p , m p ó ( 1 ) R p