<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Dichtestes_Punktpaar</id>
	<title>Dichtestes Punktpaar - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Dichtestes_Punktpaar"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Dichtestes_Punktpaar&amp;action=history"/>
	<updated>2026-06-07T19:10:17Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Dichtestes_Punktpaar&amp;diff=1251301&amp;oldid=prev</id>
		<title>imported&gt;Mathze: /* Literatur */ Form</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Dichtestes_Punktpaar&amp;diff=1251301&amp;oldid=prev"/>
		<updated>2026-01-24T13:20:51Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Literatur: &lt;/span&gt; Form&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Datei:Closest pair of points.svg|mini|Punktmenge mit dichtestes Punktepaar in rot]]&lt;br /&gt;
Das Problem des &amp;#039;&amp;#039;&amp;#039;dichtesten&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Punktpaares&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;englisch&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;closest pair of points problem&amp;#039;&amp;#039;&amp;#039;) ist die Suche nach den zwei am dichtesten beieinander liegenden [[Punkt (Geometrie)|Punkten]] in einer [[Ebene (Mathematik)|Ebene]]. Gegeben ist eine beliebige [[Menge (Mathematik)|Menge]] von Punkten in der Ebene und gesucht sind zwei dieser Punkte, sodass der [[Euklidischer Abstand|euklidische Abstand]] minimal ist. Ein ähnliches Problem ist die Suche nach den zwei am weitesten voneinander entfernten Punkten in der Ebene, also den zwei Punkten mit dem maximalen [[Euklidischer Abstand|euklidischen Abstand]].&lt;br /&gt;
&lt;br /&gt;
== Kleinster Abstand von Punkten in der Ebene ==&lt;br /&gt;
&lt;br /&gt;
=== Brute-force-Algorithmus ===&lt;br /&gt;
Der [[Brute Force|Brute-force]]-Algorithmus berechnet die [[Abstand|Abstände]] zwischen allen möglichen Punktpaaren und wählt das Punktpaar mit dem kleinsten Abstand aus. Wenn &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; die Anzahl der Punkte ist, gibt es &amp;lt;math&amp;gt;\tbinom{n}{2} = \tfrac{n \cdot (n - 1)}{2} = \tfrac{1}{2} \cdot (n^2 - n)&amp;lt;/math&amp;gt; mögliche Punktpaare, für die die [[Abstand|Abstände]] berechnet werden müssen. Die [[Laufzeit (Informatik)|Laufzeit]] des [[Algorithmus]] ist also quadratisch und liegt in  &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Divide-and-conquer-Algorithmus ===&lt;br /&gt;
{{Siehe auch|Teile und herrsche (Informatik)}}&lt;br /&gt;
Zunächst wird die gegebene [[Menge (Mathematik)|Menge]] der Punkte einmal nach x-[[Koordinatensystem|Koordinaten]] und einmal nach y-Koordinaten [[Sortierverfahren|sortiert]]. Man erhält zwei sortierte [[Liste (Datenstruktur)|Listen]] &amp;lt;math&amp;gt;L_x&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;L_y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der &amp;#039;&amp;#039;&amp;#039;Divide-Schritt&amp;#039;&amp;#039;&amp;#039; teilt die nach x-[[Koordinatensystem|Koordinaten]] sortierte [[Liste (Datenstruktur)|Liste]] &amp;lt;math&amp;gt;L_x&amp;lt;/math&amp;gt; in zwei Hälften &amp;lt;math&amp;gt;P_L&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;P_R&amp;lt;/math&amp;gt; links und rechts des [[Median]]s auf.&lt;br /&gt;
&lt;br /&gt;
Der &amp;#039;&amp;#039;&amp;#039;rekursive Aufruf&amp;#039;&amp;#039;&amp;#039; geschieht nun jeweils für die beiden Hälften. Man erhält das jeweils dichteste Punktpaar beider Hälften, ohne dass eventuelle Punktpaare zwischen beiden Hälften berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
Der &amp;#039;&amp;#039;&amp;#039;Conquer-Schritt&amp;#039;&amp;#039;&amp;#039; kombiniert nun diese beiden Hälften. Es wird das Punktpaar mit dem kleinsten gefundenen [[Abstand]] ausgewählt. Hierbei sind zwei Fälle zu beachten:&lt;br /&gt;
#Das Punktpaar liegt in der linken oder der rechten Hälfte. In diesem Fall gibt es keine weiteren Probleme.&lt;br /&gt;
#Es gibt zwei Punkte in unterschiedlichen Hälften, deren [[Abstand]] kleiner ist, als der bisher in den Hälften gefundene. Dieser Fall ist nun gesondert zu berücksichtigen.&amp;lt;br /&amp;gt; [[Datei:Punkteinfuegen d and c.jpg|mini|hochkant|Prüfung der Nachbarn von P]]&lt;br /&gt;
Es ist nicht nötig, alle solchen Punktpaare einzeln durchzuprüfen. Ist &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; der kleinste gefundene [[Abstand]] in einer der beiden Hälften, dann ist dies eine [[obere Grenze]] für den kleinsten Abstand. Daher müssen nur noch Punkte betrachtet werden, deren Abstand zum [[Median]] in x-Richtung höchstens &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; beträgt. Außerdem müssen für diese Punkte nur noch Partner betrachtet werden, deren Abstand in y-Richtung kleiner als &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; ist.&amp;lt;br /&amp;gt;Daraus ergibt sich für jeden dieser Punkte, dass lediglich der Abstand zu einer konstanten Anzahl von anderen Punkten zu prüfen ist: Denkt man sich ein [[Gitter (Geometrie)|Gitter]] der Weite &amp;lt;math&amp;gt;\tfrac{\delta}{2}&amp;lt;/math&amp;gt; in der Umgebung des Medians, dann kann in jeder Gitterzelle nur einer dieser Punkte liegen, weil sonst bereits ein Abstand kleiner als &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; gefunden worden wäre. Weil nur diejenigen Gitterzellen zu prüfen sind, die von P aus höchstens Abstand &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; haben, sind maximal 24 weitere Abstände für jeden Punkt zu berechnen, nämlich jeweils maximal 12 Abstände nach oben und nach unten, womit statt quadratischer Laufzeit nur noch lineare [[Laufzeit (Informatik)|Laufzeit]] notwendig ist. Insgesamt ergibt sich für die Anzahl der berechneten Abstände die [[Rekursionsgleichung]] &amp;lt;math&amp;gt; T(n) = 2 \cdot T(\tfrac{n}{2}) + 24 \cdot n &amp;lt;/math&amp;gt;, sodass die [[Laufzeit (Informatik)|Laufzeit]] in &amp;lt;math&amp;gt; O(n \cdot \log n) &amp;lt;/math&amp;gt; liegt.&lt;br /&gt;
&lt;br /&gt;
=== Randomisierter Algorithmus ===&lt;br /&gt;
==== Funktionsweise ====&lt;br /&gt;
Der randomisierte [[Algorithmus]] beruht darauf, dass die Punkte in zufälliger Reihenfolge in eine [[Hashtabelle]] eingefügt werden, wobei das Einfügen eines Punktes ebenso wie das Testen, ob er den vorher bekannten minimalen [[Abstand]] &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; unterbietet, konstante [[Laufzeit (Informatik)|Laufzeit]] hat. Die Hashtabelle bildet alle Gitterzellen der Größe &amp;lt;math&amp;gt;\left(\tfrac{\delta}{2}\right)^2&amp;lt;/math&amp;gt; auf den eventuell darin liegenden Punkt ab. Es muss zwar bei jeder solchen Aktualisierung von &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; die Hashtabelle neu aufgebaut werden, die Gesamtzahl der Einfügeoperationen in sämtliche dieser Hashtabellen liegt aber trotzdem in &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;Ohne Beachtung, wie die Hashtabelle konkret genutzt wird, ergibt sich folgender Algorithmus:&lt;br /&gt;
&lt;br /&gt;
 Bilde eine zufällige Reihenfolge der Punkte P&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, ..., P&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&lt;br /&gt;
 δ = Abstand zwischen P&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; und P&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
 Füge P&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; und P&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; in die Hashtabelle ein (Gittergröße δ/2)&lt;br /&gt;
 Für i = 3, ..., n&lt;br /&gt;
     Falls P&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; einen Abstand δ &amp;lt; δ&amp;#039; zu einem der Punkte P&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, ..., P&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt; hat:&lt;br /&gt;
         δ = δ&amp;#039;&lt;br /&gt;
         Baue die Hashtabelle neu auf (Gittergröße δ&amp;#039;/2)&lt;br /&gt;
     Füge P&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; in die Hashtabelle ein&lt;br /&gt;
&lt;br /&gt;
==== Gitterstruktur und Hashfunktion ====&lt;br /&gt;
Man kann vereinfachend annehmen, dass alle Punkte [[Koordinatensystem|Koordinaten]] zwischen (0,0) und (1,1) haben. Gegebenenfalls kann hierfür eine [[Koordinatentransformation]] vorgenommen werden. Die Ebene, in der die Punkte liegen, wird sodann durch ein [[Gitter (Geometrie)|Gitter]] der Weite &amp;lt;math&amp;gt;\tfrac{\delta}{2}&amp;lt;/math&amp;gt; überdeckt. Es wird nun eine [[universelle Hashfunktion]] benötigt; sie ermöglicht es einerseits, von einer gegebenen Gitterzelle in konstanter [[Laufzeit (Informatik)|Laufzeit]] festzustellen, ob sich in dieser Gitterzelle einer der Punkte befindet, und andererseits neue Punkte in konstanter [[Laufzeit (Informatik)|Laufzeit]] in die bestehende [[Hashtabelle]] einzufügen.&lt;br /&gt;
&lt;br /&gt;
==== Einfügen neuer Punkte ====&lt;br /&gt;
[[Datei:Engstes punktpaar  pkt einfuegen.jpg|mini|hochkant|Einfügen von P]]&lt;br /&gt;
Bei jedem Einfügen eines neuen Punktes P ist zu prüfen, ob dadurch der bereits bekannte minimale [[Abstand]] &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; unterschritten wird. Anhand der [[Koordinatensystem|Koordinaten]] von P lässt sich sofort bestimmen, in welcher der [[Gitter (Geometrie)|Gitterzellen]] der Punkt P liegt. Aufgrund der Aufteilung in Gitterzellen der Größe &amp;lt;math&amp;gt;\left(\tfrac{\delta}{2}\right)^2&amp;lt;/math&amp;gt; muss nur festgestellt werden, ob in einer der umliegenden Gitterzellen schon ein Punkt liegt. Umliegend sind dabei alle Gitterzellen, die einen solchen Abstand begründen könnten, also nur das umgebende 5x5-Rechteck. Alle Punkte, die außerhalb dieses Bereichs liegen, können keinen kleineren Abstand zu P haben, weil sie aufgrund der Gittergröße mindestens den Abstand &amp;lt;math&amp;gt;2 \cdot \tfrac{\delta}{2} = \delta&amp;lt;/math&amp;gt; haben. Weil in jeder Gitterzelle nur ein einziger Punkt liegen kann, denn sonst wäre vorher bereits ein kleinerer Abstand gefunden worden, müssen also auch nur höchstens 25 Punkte geprüft werden. Sofern in diesem Bereich keine Punkte liegen, kann P bedenkenlos in die bestehende [[Hashtabelle]] eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
Sind jedoch in diesem Bereich bereits weitere Punkte vorhanden, so wird der Abstand &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; auf den neu gefundenen minimalen Abstand gesetzt. Dies hat zur Folge, dass die bisherige [[Hashtabelle]] nutzlos geworden ist, weil ihre Gitterweite nicht mehr mit &amp;lt;math&amp;gt;\tfrac{\delta}{2}&amp;lt;/math&amp;gt; übereinstimmt. Wir benötigen also eine neue Hashtabelle mit korrektem &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;. Wir erstellen einfach eine solche Tabelle für alle Punkte bis zu P von Grund auf neu. Der Effizienz halber kann man sich beim Neuerstellen die Abstandsprüfung sparen, weil der minimale Abstand aller Punkte zu P bereits bekannt ist.&lt;br /&gt;
&lt;br /&gt;
Schließlich hat man nach dem Einfügen eines neuen Punktes immer eine korrekte [[Hashtabelle]] mit Gitterweite &amp;lt;math&amp;gt;\tfrac{\delta}{2}&amp;lt;/math&amp;gt; und in jedem Gitterquadrat liegt höchstens ein Punkt.&lt;br /&gt;
&lt;br /&gt;
==== Laufzeit ====&lt;br /&gt;
Relevant für die [[Laufzeit (Informatik)|Laufzeit]] ist lediglich die Anzahl der Einfüge-[[Operation (Informatik)|Operationen]] neuer Punkte. Trivialerweise muss jeder Punkt mindestens einmal eingefügt werden, also ist die Laufzeit mindestens linear.&lt;br /&gt;
&lt;br /&gt;
Fraglich ist jedoch, wie sich der gelegentlich vorkommende Neuaufbau der [[Hashtabelle]] auswirkt, weil hierfür alle bereits bekannten Punkte erneut eingefügt werden müssen. Hierfür ist es notwendig, die [[Wahrscheinlichkeit]] anzugeben, mit der beim Einfügen eines Punkts ein Neuaufbau erforderlich wird, und die dafür notwendigen Kosten einzuberechnen. Intuitiv sieht man, dass mit zunehmender Anzahl der Punkte der Aufwand für die Reorganisation immer größer wird, die Wahrscheinlichkeit dafür aber immer kleiner.&lt;br /&gt;
&lt;br /&gt;
Der [[Erwartungswert]] für die [[Laufzeit (Informatik)|Laufzeit]] kann wie folgt berechnet werden:&lt;br /&gt;
&lt;br /&gt;
Die [[Wahrscheinlichkeit]] dafür, dass der Punkt &amp;lt;math&amp;gt;P_i&amp;lt;/math&amp;gt; beim Einfügen einen kleineren [[Abstand]] erzeugt, ist gleich &amp;lt;math&amp;gt;\tfrac{2}{i}&amp;lt;/math&amp;gt;, denn dafür müsste &amp;lt;math&amp;gt;P_i&amp;lt;/math&amp;gt; einer der 2 Punkte sein, die diesen Abstand zueinander haben.&lt;br /&gt;
&lt;br /&gt;
Definieren wir nun die [[Zufallsvariable]] &amp;lt;math&amp;gt;X_i \longrightarrow \{0, 1\}&amp;lt;/math&amp;gt;. Sie sei 1, falls beim Einfügen des Punkts &amp;lt;math&amp;gt;P_i&amp;lt;/math&amp;gt; ein kleinerer Abstand entsteht, und sonst 0.&lt;br /&gt;
&lt;br /&gt;
Dann gilt: Die Gesamtanzahl der Einfügeoperationen ist &amp;lt;math&amp;gt;n + \sum^n_{i=2} i \cdot X_i&amp;lt;/math&amp;gt;, also die Anzahl &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; der eingefügten Punkte plus die Anzahl der Einfügeoperationen durch die Neuorganisationen der [[Hashtabelle]].&lt;br /&gt;
&lt;br /&gt;
Für den [[Erwartungswert]] gilt aufgrund dessen [[Erwartungswert#Linearität|Linearität]]: &amp;lt;math&amp;gt;E(X) = n + \sum^n_{i=2} i \cdot E(X_i) = n + \sum^n_{i=2} i \cdot \tfrac{2}{i} = n + 2 \cdot (n - 1) = 3 \cdot n - 2&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Gesamtanzahl der erwarteten Einfügeoperationen ist lediglich gleich &amp;lt;math&amp;gt;3 \cdot n - 2&amp;lt;/math&amp;gt;. Insgesamt ist die erwartete [[Laufzeit (Informatik)|Laufzeit]] somit linear, liegt also in &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Größter Abstand von Punkten in der Ebene ==&lt;br /&gt;
&lt;br /&gt;
=== Rotating calipers Algorithmus ===&lt;br /&gt;
Der Rotating calipers Algorithmus ist danach benannt, dass ein [[Messschieber]] um die Außenseite eines [[Konvexes Polygon|konvexen Polygons]] gedreht wird. Jedes Mal, wenn ein Messschenkel flach an einer Seite des [[Polygon]]s liegt, bildet es ein antipodales Punktpaar, wobei der Punkt oder die Seite den entgegengesetzte Messschenkel berührt. Die vollständige [[Drehung]] des Messschiebers um das Polygon erkennt alle antipodalen Punktpaare und bestimmt das Punktepaar mit dem größten [[Abstand]].&lt;br /&gt;
&lt;br /&gt;
Um den [[Algorithmus]] auf beliebige Punkte in der Ebene anwenden zu können, muss erst die [[konvexe Hülle]] der Punkte bestimmt werden. Dafür wird die [[Laufzeit (Informatik)|Laufzeit]] &amp;lt;math&amp;gt; O(n \cdot \log n) &amp;lt;/math&amp;gt; benötigt.&lt;br /&gt;
&lt;br /&gt;
Zwei Punkte mit maximalem [[Abstand]] müssen auf den Rand des [[Konvexes Polygon|konvexen Polygons]] liegen, das die [[konvexe Hülle]] bildet. Der [[Algorithmus]] beginnt mit den Punkten &amp;lt;math&amp;gt;P_n&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; und berechnet den [[Flächeninhalt]] der Dreiecke &amp;lt;math&amp;gt;P_nP_1P_k&amp;lt;/math&amp;gt;. Zunächst wird &amp;lt;math&amp;gt;k = 2&amp;lt;/math&amp;gt; gesetzt und so lange erhöht, wie der Flächeninhalt zunimmt. So wird der antipodalen Punkt für &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; bestimmt. Auf ähnliche Weise wird der antipodale Punkt für &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; bestimmt wird, indem der Flächeninhalt der Dreiecke &amp;lt;math&amp;gt;P_1P_2P_k&amp;lt;/math&amp;gt; berechnet wird und der Index &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; weiter erhöht wird, so lange der Flächeninhalt zunimmt. Diese Schritte werden mit den anderen Punkten &amp;lt;math&amp;gt;P_i&amp;lt;/math&amp;gt; wiederholt, bis der Index &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; erreicht ist, also &amp;lt;math&amp;gt;i = k&amp;lt;/math&amp;gt; ist. Die Abstände der antipodalen Punktpaare werden berechnet und mit dem größten bisher gefundenen Abstand verglichen. Die [[Laufzeit (Informatik)|Laufzeit]] für die Berechnung der Flächeninhalte und Abstände liegt in &amp;lt;math&amp;gt; O(n) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Insgesamt ergibt sich die [[Laufzeit (Informatik)|Laufzeit]] &amp;lt;math&amp;gt; O(n \cdot \log n) + O(n) = O(n \cdot \log n) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* Thomas H. Cormen, [[Charles E. Leiserson]], [[Ronald L. Rivest]] und Clifford Stein: &amp;#039;&amp;#039;Algorithmen – Eine Einführung&amp;#039;&amp;#039;. Oldenbourg-Verlag, 2004. ISBN 3-486-27515-1, Kapitel 33.4: Berechnung des dichtesten Punktepaares, S. 959–963.&lt;br /&gt;
* [[Jon Kleinberg]], [[Éva Tardos]]. &amp;#039;&amp;#039;Algorithm Design&amp;#039;&amp;#039;. Pearson International Edition, 2006. ISBN 0-321-37291-3. Seiten 225 ff (Divide &amp;amp; Conquer); S. 741 ff (Randomisierter Algorithmus).&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Suchalgorithmus]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Mathze</name></author>
	</entry>
</feed>