Il seguente esercizio è stato distribuito agli studenti che supervisiono:
Dati punti nel piano, escogitare un algoritmo che trova una coppia di punti la cui distanza è minima tra tutte le coppie di punti. L'algoritmo dovrebbe essere eseguito nel tempo .
Esiste un algoritmo di divisione e conquista (relativamente) semplice che risolve il compito nel tempo .
Domanda 1 : esiste un algoritmo che risolve esattamente il problema nel momento peggiore ?
Ciò che mi ha fatto sospettare che ciò potesse essere possibile è un risultato che ricordo di aver visto in alcuni discorsi (riferimento apprezzato). Diceva qualcosa lungo le linee di quel non più di un numero costante di punti possono essere disposti nel piano attorno ad un punto all'interno di un cerchio di raggio , con la distanza minima tra due dei punti coinvolti . Penso che , i punti che formano un esagono equilatero con al centro (nel caso estremo).
In tal caso, il seguente algoritmo dovrebbe risolverli in passaggi.
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
Si noti che questo è (dichiarato di essere) in tempo lineare perché solo un numero costante di punti in non r
può essere più lontano di m
da p
(assumendo la frase sopra); solo questi punti devono essere studiati per trovare un nuovo minimo. C'è un problema, ovviamente; come si implementa nextNeighbour
(magari con preelaborazione in tempo lineare)?
Domanda 2 : Lasciare un insieme di punti ed un punto p ∉ R . Lascia che m ∈ R con
e
.
Supponiamo che sia finito. È possibile trovare con una distanza minima da in tempo (ammortizzato) ? (Puoi presumere che sia costruito aggiungendo i punti investigati uno per uno.) p ′ ∈ R p , m p O ( 1 ) R p