Problema unei perechi de puncte cele mai apropiate

Cea mai apropiată problemă de pereche este o  problemă de geometrie computațională . Având în vedere n puncte într-un spațiu metric , trebuie să găsiți o pereche de puncte cu cea mai mică distanță între ele.

Problema punctului cel mai apropiat din planul euclidian [1] a fost una dintre primele probleme geometrice care a fost studiată sistematic în ceea ce privește complexitatea de calcul a algoritmilor geometrici .

Un algoritm naiv pentru găsirea distanțelor dintre toate perechile dintr-un spațiu de dimensiunea d și alegerea celei mai mici dintre ele necesită timp O ( n 2 ) . Rezultă că problema poate fi rezolvată în timp în spațiu euclidian sau L p spațiu de dimensiune fixă ​​d [2] . În modelul de calcul algebric al arborelui de decizie , algoritmul cu timpul O( n log n ) este optim atunci când este redus din problema unicității elementului . Într-un model de calcul care presupune că funcția floor este calculată în timp constant, problema poate fi rezolvată în timp [3] . Dacă permitem aplicarea aleatoriei împreună cu funcția de etaj , problema poate fi rezolvată în timp O( n ) [4] [5] .

Algoritm de forță brută

Perechea de puncte cele mai apropiate poate fi calculată în timp O ( n2 ) prin efectuarea unei enumerari complete . Pentru a face acest lucru, puteți calcula distanța dintre toate n ( n − 1) / 2 perechi de puncte, apoi alegeți perechea cu distanța cea mai mică, așa cum se arată mai jos.

minDist = infinit pentru i = 1 la lungime ( P ) - 1 pentru j = i + 1 la lungime ( P ) fie p = P [ i ], q = P [ j ] dacă dist ( p , q ) < minDist : minDist = dist ( p , q ) closestPair = ( p , q ) return closestPair

Caz planar

Problema poate fi rezolvată în timp folosind o abordare recursivă împărțire și cuceri , ca aceasta [1] :

  1. Sortați punctele în funcție de coordonatele lor x;
  2. Împărțim mulțimea de puncte în două submulțimi de dimensiuni egale ale dreptei verticale ;
  3. Rezolvăm problema recursiv pe partea stângă și dreapta. Aceasta are ca rezultat o distanță minimă la stânga și, respectiv, o distanță minimă la dreapta ;
  4. Găsim distanța minimă între perechi de puncte, dintre care un punct se află la stânga dreptei verticale, iar celălalt punct se află la dreapta dreptei;
  5. Răspunsul final va fi valoarea minimă dintre , și .

Se pare că pasul 4 poate fi finalizat în timp liniar. Din nou, abordarea naivă ar necesita calcularea distanțelor pentru toate perechile stânga/dreapta, adică timp pătratic. Observația cheie se bazează pe următoarea proprietate de sparsitate a mulțimii de puncte. Știm deja că cea mai apropiată pereche de puncte nu sunt mai îndepărtate decât . Prin urmare, pentru fiecare punct p din stânga dreptei de despărțire, trebuie să comparăm distanțele față de punctele care se află într-un dreptunghi cu dimensiuni (dist, 2 ⋅ dist) așa cum se arată în figură. Și acest dreptunghi nu poate conține mai mult de șase puncte, distanța pe perechi dintre care nu este mai mică de . Astfel, este suficient să calculăm 6 n distanțe la pasul 4 [6] . Relația de recurență pentru numărul de pași poate fi scrisă ca , care poate fi rezolvată folosind teorema fundamentală pentru împărțirea și cucerirea recurenței , care dă .

Deoarece o pereche de puncte cele mai apropiate definește o muchie într-o triangulație Delaunay și corespund la două celule adiacente într- o diagramă Voronoi , o pereche de puncte cele mai apropiate poate fi determinată în timp liniar dacă este dată una dintre cele două structuri. Calcularea unei triangulații Delaunay sau a unei diagrame Voronoi necesită timp . Aceste abordări nu sunt eficiente pentru dimensiunile d >2 , în timp ce algoritmul de împărțire și cucerire poate fi generalizat la timpul de execuție pentru orice valoare constantă a dimensiunii d .

Problemă dinamică cea mai apropiată pereche

Versiunea dinamică pentru problema unei perechi de puncte cele mai apropiate este stabilită după cum urmează:

Dacă caseta de delimitare pentru toate punctele este cunoscută dinainte și este disponibilă o funcție de etaj cu timp de rulare constant, atunci a fost propusă o structură de date cu o memorie așteptată de O( n ) care acceptă un timp așteptat (timp mediu) de inserare și ștergere. de O(log n ) și un timp constant de interogare. Dacă problema este modificată pentru un model de arbore de decizie algebric, inserările și ștergerile vor necesita un timp mediu [7] . Trebuie remarcat faptul că complexitatea problemei dinamice de mai sus a unei perechi de puncte cele mai apropiate depinde exponențial de dimensiunea d , astfel încât algoritmul devine mai puțin potrivit pentru problemele de dimensiuni mari.

Un algoritm pentru problema dinamică a unei perechi de puncte cele mai apropiate dintr-un spațiu de dimensiunea d a fost dezvoltat de Sergey Bespamyatnykh în 1998 [8] . Punctele pot fi inserate și îndepărtate în O(log n ) timp per punct (cel mai rău caz).

Vezi și

Note

  1. 1 2 Shamos, Hoey, 1975 , p. 151-162.
  2. Clarkson, 1983 .
  3. Fortune, Hopcroft, 1979 , p. 20-23.
  4. Khuller și Matias 1995 , p. 34-37.
  5. Richard Lipton. Rabin aruncă o monedă (24 septembrie 2011). Consultat la 19 februarie 2019. Arhivat din original pe 16 februarie 2019.
  6. Cormen, Leiserson, Rivest, Stein, 2001 , p. 957-961 33.4: Găsirea celei mai apropiate perechi de puncte..
  7. Golin, Raman, Schwarz, Smid, 1998 .
  8. Bespamyatnikh, 1998 , p. 175-195.

Literatură