Per trovare un punto più vicino a M, è necessario eliminare i punti binari in base ai tagli planari. È necessario un po 'di pre-elaborazione dei punti di input, dopo di che possiamo trovare un punto più vicino a un dato punto M in O (lgn).
- Calcolare (se non indicato) rappresentazione polare dei punti in formato (r, θ), dove r è la distanza dal centro e θ è l'angolo di asse x nell'intervallo (-180.180].
- in ordine tutti N punti in ordine crescente di loro angolo di asse x.
noti che semplice motore di ricerca binaria di un punto più vicino a M non funzionerà qui, ad esempio,
- se i punti dati sono ordinato in modo tale che θ = (-130, -100 , -90, -23, -15,0,2,14,170), quindi per un punto M con θ = -170, la ricerca binaria darà -130 (40 gradi di distanza) come il punto più vicino mentre 170 (20 gradi di distanza) è il punto più vicino a M.
- se ignoriamo il segno mentre ordiniamo (pensando che produrrà output corretto), il nostro nuovo array ordinato sarà simile a θ = (0,2,14,15,23,90,100,130,170), la ricerca binaria per un punto M con θ = -6 produrrà il risultato dovrebbe essere 2 o 14 mentre 0 è il punto più vicino a M in questo caso.
Per eseguire l'operazione di ricerca con tagli planari,
- Find linea planare di taglio passante per il centro del cerchio e perpendicolare alla linea che collega il centro del cerchio con punto M.
- Eliminare metà del piano circolare [90 + θ, -90 + θ) o [-90 + θ, 90 + θ) a seconda di in quale metà del piano M si trova.
- Effettuare tagli planari paralleli al primo taglio e passare attraverso il punto al centro del piano precedente ed eliminare tutti i punti nella metà del piano più lontano da M finché non ci sono più punti nella metà più vicina dell'aereo, in tal caso eliminare la metà più vicina dell'aereo.
- Continuate a tagliare gli aerei finché non restiamo con un punto. Quel punto è il punto più vicino a M. L'operazione totale richiede passi O (lgn).
In caso il dato è inclinata e non uniformemente distribuita nel cerchio, possiamo ottimizzare i tagli planari tale che ogni taglio passa attraverso la mediana (in base all'angolo) di quei punti che vengono lasciati nell'operazione di ricerca.
Questa domanda sembra essere leggermente aperta. Probabilmente il candidato dovrebbe fare una domanda o due. Allora, a cosa hai pensato? – Beta
Poiché è richiesto il registro (N), sento che in qualche modo dovrei riuscire a eliminare almeno la metà dei punti in un confronto. Altrimenti, non sono affatto vicino alla soluzione del problema. – yuvi
Un suggerimento: considera N punti su una linea e un punto M, anche sulla linea. Esiste una soluzione di log (N)? – Beta