Gebruiker:Niknetniko/Kladblok/Dichtste puntenpaar

Uit Wikipedia, de vrije encyclopedie
Vlak met punten, waarvan de twee die het dichtst bij elkaar liggen rood zijn.
Het dichtste puntenpaar is in het rood aangeduid.


Het vinden van het dichtste puntenpaar is een probleem uit de computationele meetkunde, waarbij men, gegeven punten in een metrische ruimte, de twee punten wenst te vinden die het dichtst bij elkaar liggen. Gesteld in de Euclidische ruimte was dit probleem een van de eerste problemen die bestudeerd is in de computationele complexiteitstheorie. Een naïeve oplossing voor dit probleem heeft een computationele complexiteit van . In de Euclidische ruimte of in een -ruimte met vaste dimensie kan het opgelost worden in .[1]

Dit probleem mag niet verward worden met het verwante probleem van het vinden van het dichtste punt voor een gegeven ander punt (nearest neighbour search).

Probleemstelling[bewerken | brontekst bewerken]

Gegeven een verzameling met punten uit een -dimensionale metrische ruimte met afstandsfunctie . Zoek het kortste puntenpaar van , met andere woorden twee punten en , zodat:

Geschiedenis[bewerken | brontekst bewerken]

Lange tijd dachten onderzoekers dat de computationele ondergrens voor het probleem kwadratisch was. Omdat dit probleem deel uitmaakt van een heleboel andere problemen, impliceerde dit dat de ondergrens voor die problemen ook kwadratisch was. Een eerste oplossing in O(n log n) verscheen in 1974, door Michael Shamos.[2] Hij gebruikte Voronoi-diagrammen om het probleem op te lossen.[3][4] Een eerste algoritme dat gebruik maakt de verdeel-en-heerstechniek verscheen in 1976.[5] Sindsdien zijn verschillende snellere algoritmen gepubliceerd.[2]

Oplossingen[bewerken | brontekst bewerken]

Brute force[bewerken | brontekst bewerken]

Het dichtste puntenpaar kan gevonden worden door brute force zoeken, wat een complexiteit geeft van , met het aantal punten. Dit algoritme werkt eenvoudig: overloop alle puntenparen, en kies uiteindelijk het paar met de kleinste onderlinge afstand. Hieronder wordt dit algoritme gegeven in pseudocode.

afstand = 
# Overloop alle punten van [1, |S|[
for i in range(1, len(S)):
  # Overloop alle punten van [i, |S|]    
  for j in range(i + 1, len(S) + 1):
    p, q = S[i], S[j]
    if d(p, q) < afstand:
      afstand = d(p, q)
      dichtstePaar = (p, q)
return dichtstePaar

Een dimensie[bewerken | brontekst bewerken]

In één dimensie komt het probleem neer op het vinden van het dichtste puntenpaar op een lijn. In dat geval zullen de punten van het dichtste puntenpaar altijd naast elkaar liggen. Het volstaat om:

  1. Sorteer de punten op de lijn.
  2. Vergelijk voor elk punt de afstand met het volgende punt.

Sorteren kan met een complexiteit van . Het vergelijken van de punten heeft een complexiteit van , waarvoor de totale complexiteit wordt.

Twee dimensies[bewerken | brontekst bewerken]

Met de verdeel-en-heerstechniek kan het probleem opgelost worden in .[6] We veronderstellen dat de punten gesorteerd zijn volgens hun x-coördinaat.

Aangezien de punten gesorteerd zijn, kan men een imaginaire lijn trekken die de punten in twee ongeveer even grote helften verdeeld: en . Dit is de snijlijn. Het puntenpaar met de kleinste afstand ligt nu ofwel volledig in de linkerhelft, ofwel volledig in de rechterhelft, ofwel ligt één punt in de linkerhelft en één punt in de rechterhelft.

Noem de afstand van het dichtste puntenpaar in , de afstand van het dichtste puntenpaar in en de afstand van het dichtste puntenpaar waarbij elk punt in een andere helft ligt. De afstanden en kunnen recursief berekend worden.

Er rest nog het berekenen van . Op het eerste zicht lijkt het dat hier opnieuw een vergelijking van met alle punten nodig is, waardoor de complexiteit wordt. Een eerste observatie is dat enkel de punten die op een afstand van de snijlijn liggen relevant zijn. De punten die verder van de snijlijn liggen kunnen nooit leiden tot een dichtste puntenpaar met een afstand die kleiner is dan de puntenparen die reeds recursief bepaald zijn. Noem de zone aan weerszijde van de snijlijn binnen een afstand de zoekstrook.

Sorteer nu alle punten in de zoekstrook volgens hun y-coördinaat, waarna de zoekstrook verdeeld wordt in vierkant met zijde . In elk vierkant zit hoogstens één punt: indien er meerdere punten in een vierkant zouden zitten, dan zou de afstand tussen deze twee punten kleiner zijn dan , want onmogelijk is (want dan zou dit puntenpaar gevonden zijn als dichtste puntenpaar van de respectievelijke helft).

Voor elk punt in de zoekstrook wordt nu vergeleken met de 8 volgende punten, gesorteerd volgens y-coördinaat. Immers, elk punt ligt in een eigen vierkant, en punten die meer dan 2 vierkanten verder zijn, liggen sowieso op een afstand van het originele punt.

Het resultaat is .

De recurrente betrekking voor dit algoritme is : het aantal punten wordt verdeeld in twee, en de complexiteit van het vergelijken in de zoekstrook is lineair: er zijn hoogstens punten in de zoekstrook, en voor elk punt wordt vergeleken met een constant aantal andere punten. Uit het master-theorem volgt de complexiteit van het algoritme: .

Hogere dimensies[bewerken | brontekst bewerken]

Het verdeel-en-heersalgoritme voor twee dimensies kan veralgemeend worden tot dimensies. Een inzicht hierbij is dat het zoeken in de zoekstrook neerkomt op het oplossen van het probleem in een lagere dimensie.

  1. (en) J.-R. Sack, J. Urrutia (2000), Handbook of Computational Geometry, 1. Elsevier. DOI:10.1016/B978-0-444-82537-7.X5000-1, "Closest-Point Problems in Computational Geometry", pp. 877-935. ISBN 9780444825377.
  2. a b (en) José C. Pereira, Fernando G. Lobo (12 juli 2012). An Optimized Divide-and-Conquer Algorithm for the Closest-Pair Problem in the Planar Case. Journal of Computer Science and Technology (Springer US). ISSN: 18604749. DOI: 10.1007/s11390-012-1272-6.
  3. (en) Michael I. Shamos (mei 1975). Geometric Complexity. Proceedings of the Seventh Annual ACM Symposium on Automata and Theory of Computation: 224-233 (ACM).
  4. (en) Michael I. Shamos, Dan J. Hoey (oktober 1975). Closest-point Problems. Proceedings of the Sixteenth IEEE Symposium on Foundations of Computer Science: 151-162. DOI: 10.1109/SFCS.1975.8.
  5. (en) Jon L. Bentley, Michael I. Shamos (mei 1976). Divide-and-conquer in multidimensional space. Proceedings of the eighth annual ACM symposium on Theory of computing. DOI: 10.1145/800113.803652.
  6. Veerle Fack (1 september 2014), Algoritme en datastructuren. Acco, "Verdeel-en-heers-algoritmen", pp. 119 - 120. ISBN 9789033498244.