Risposta aggiornata e riscritta da zero.
Si sono dati un politopo . Eseguire la gerarchia Dobkin-Kirkpatric su P. Questo vi dà una sequenza di polytops P 1 ⊆ P 2 ⊆ ... ⊆ P k = P . Supponiamo che desideri trovare il punto più vicino su P a un punto di query q . L'algoritmo di base inizia calcolando il punto più vicino c 1 a q su P 1 , quindi considera tutte le nuove regioni (tende) adiacenti a c 1 , trova il punto più vicino c 2 a qPP1⊆P2⊆…⊆Pk=PPqc1qP1c1c2qin queste nuove regioni, e continuiamo in questo modo fino a raggiungere .Pk
Ora, se è su un bordo, allora non ci sono problemi: solo due tende potrebbero toccare questo bordo o solo una di esse potrebbe coprire il bordo. Pertanto, l'aggiornamento di c i + 1 da C i in questo caso richiede tempo costante.cici+1Ci
Quindi il problema è quando trova su un vertice di alto grado, perché quindi il numero di nuove tende adiacenti ad esso quando ci si sposta su P i + 1 potrebbe essere grande. Per ovviare a questo, simuleremo un vertice di grande grado come una raccolta di vertici di basso grado. In particolare, in ogni fase, se c i si trova su un vertice v , ricorderemo due bordi consecutivi e i , e ′ i adiacenti a v , in modo tale che il punto più vicino a q in P i + 1ciPi+1civei,e′ivqPi+1giace su una tenda che è adiacente o copre uno di questi due bordi. Come tale, possiamo fare il calcolo richiesto in tempo costante.
Quindi rimaniamo con il problema di come tenere traccia di questi due bordi mentre saliamo.
Per fare ciò, pre-calcolare per ogni vertice di P una direzione tangente t v . Sia Q i ( v ) il poligono convesso che è la figura del vertice di v per il poligono P i (con il piano che definisce la figura del vertice ha normale nella direzione di t v ). Concettualmente, Q 1 ( v ) , Q 2 ( v ) , . . . , Q k ( v )vPtvQi(v)vPitvQ1(v),Q2(v),...,Qk(v)si comporta come una gerarchia DK 2d. Se il punto più vicino su a q si trova su un vertice w, allora questo corrisponde a v e un bordo adiacente e in P i , dove il bordo e interseca il piano della figura del vertice in w . Se il punto più vicino su Q i ( v ) a q si trova su un bordo e ′ , allora si ricordano i due bordi adiacenti di P i che definiscono i due vertici di e ′ (quiQi(v)qwvePiewQi(v)qe′Pie′ appartiene a Q i ( v ) ).e′Qi(v)
E ora abbiamo finito ... In effetti, se è anche su Q i + 1 ( v ), allora possiamo aggiornarlo in tempo costante (poiché questa è solo una gerarchia DK 2d). Se d'altra parte c i + 1 non è più su Q i + 1 ( v ), allora deve appartenere a una nuova tenda adiacente o che copre il precedente punto c i . In entrambi i casi, possiamo aggiornarlo a tempo costante.ci+1Qi+1(v)ci+1Qi+1(v)ci