kuddlmuddl
Commander
- Registriert
- Mai 2010
- Beiträge
- 2.715
Hi,
ich benötige eine passendere (vermutlich sortierte) Datenstruktur als map.
Folgendes Szenario:
In einer 2D-Ebene existieren bis zu 10.000 Punkte, die natürlich aus x und y Koordinate bestehen - jeweils ein double.
Es soll nun möglich sein durch eine "unscharfe" Anfrage eine Teilmenge der Punkte zu erhalten.
Sind die Koordinaten zB aus einem Bereich [0, 100]*[0, 100] lautet eine Anfrage:
"Gib mir alle Punkte, die euklidisch dichter als 30 an den Koordinaten 23/56 dran sind)!". Unscharf daher, da es keinen einzigen Punkt an genau dieser Stelle geben muss.
Bisher haben all meine Punkte einfach eine ID und ich gehe die map linear durch und entscheide für jeden Punkt, ob er dicht genug ist - dies dauert allerdings viel zu lange da es sich um eine echtzeitkritische Anwendung handelt.
Gibts da eine bessere Möglichkeit?
Im 1D-Fall (Punkte haben nur x-Koordinate) ist es natürlich leicht - ich nehme eine priorityQueue mit x als key und gehe vom dichtesten ausgehend nach links und rechts und sammel alle ein. Notfalls durch einen selbstgebauten balancierten Suchbaum. Ich könnte auch die beiden Intervallgrenzen in log(N) Zeit suchen und alles dazwischen ausgeben - Aber im 2D?
Worüber ich natürlich schon nachdenke sind "submaps" bzw. "Planquadrate" oder "Quadranten". Dh ich durchsuche weiterhin linear Datenstrukturen - aber eben nur diejenigen, die mögliche Kandidaten enthalten.
Hierbei ist aber das Problem, dass die Punkte regelmäßig leicht verschoben werden und somit auch von Quadrant zu Quadrant wechseln - dh ich müsste jeweils aus einem Quadranten entfernen und in einem anderen einfügen. Außerdem hatte ich gehofft es gibt evtl. jemanden der eine schnellere Lösung kennt.
Noch einige Infos:
Es passiert nur zu 0,01%, dass ein neuer Punkt dem Feld hinzugefügt wird - hier darf also auch gerne Laufzeit nötig sein, um eine sortierte Datenstruktur zu erhalten. (Das Programm initialisiert mit einem leeren Feld). Die restlichen 99,9% entfallen auf "Auswahl des geeignetsten Punktes aus der vorher ausgewählten Teilmenge". Anschließend wird der ausgewählte Punkt noch verschoben.
ich benötige eine passendere (vermutlich sortierte) Datenstruktur als map.
Folgendes Szenario:
In einer 2D-Ebene existieren bis zu 10.000 Punkte, die natürlich aus x und y Koordinate bestehen - jeweils ein double.
Es soll nun möglich sein durch eine "unscharfe" Anfrage eine Teilmenge der Punkte zu erhalten.
Sind die Koordinaten zB aus einem Bereich [0, 100]*[0, 100] lautet eine Anfrage:
"Gib mir alle Punkte, die euklidisch dichter als 30 an den Koordinaten 23/56 dran sind)!". Unscharf daher, da es keinen einzigen Punkt an genau dieser Stelle geben muss.
Bisher haben all meine Punkte einfach eine ID und ich gehe die map linear durch und entscheide für jeden Punkt, ob er dicht genug ist - dies dauert allerdings viel zu lange da es sich um eine echtzeitkritische Anwendung handelt.
Gibts da eine bessere Möglichkeit?
Im 1D-Fall (Punkte haben nur x-Koordinate) ist es natürlich leicht - ich nehme eine priorityQueue mit x als key und gehe vom dichtesten ausgehend nach links und rechts und sammel alle ein. Notfalls durch einen selbstgebauten balancierten Suchbaum. Ich könnte auch die beiden Intervallgrenzen in log(N) Zeit suchen und alles dazwischen ausgeben - Aber im 2D?
Worüber ich natürlich schon nachdenke sind "submaps" bzw. "Planquadrate" oder "Quadranten". Dh ich durchsuche weiterhin linear Datenstrukturen - aber eben nur diejenigen, die mögliche Kandidaten enthalten.
Hierbei ist aber das Problem, dass die Punkte regelmäßig leicht verschoben werden und somit auch von Quadrant zu Quadrant wechseln - dh ich müsste jeweils aus einem Quadranten entfernen und in einem anderen einfügen. Außerdem hatte ich gehofft es gibt evtl. jemanden der eine schnellere Lösung kennt.
Noch einige Infos:
Es passiert nur zu 0,01%, dass ein neuer Punkt dem Feld hinzugefügt wird - hier darf also auch gerne Laufzeit nötig sein, um eine sortierte Datenstruktur zu erhalten. (Das Programm initialisiert mit einem leeren Feld). Die restlichen 99,9% entfallen auf "Auswahl des geeignetsten Punktes aus der vorher ausgewählten Teilmenge". Anschließend wird der ausgewählte Punkt noch verschoben.
Zuletzt bearbeitet:
