Sortierte Liste unter Berücksichtigung von Reichweiten

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Sortierte Liste unter Berücksichtigung von Reichweiten

Beitrag von Dirty Oerti » Mo Apr 12, 2010 7:30 pm

Tag zusammen :)

Der Titel mag anfangs etwas komisch klingen, beschreibt aber vom Prinzip her ziemlich genau das, was ich suche. Bzw versuche zu finden ;)
Ich versuche mir ein Konzept zu überlegen, mit dessen Hilfe ich mehrere (viele) Objekte speichern kann und sie effizient ansprechen (und suchen) kann.

Dabei soll folgendes gelten:

Ein Element hat immer zwei "Grundeigenschaften":
Das ist zum einen der "Startwert" und zum anderen die "Reichweite"
Beide Werte sind natürlich voneinander unabhängig.

Nun möchte ich diese "Liste" (ich nenne es mal so) durchsuchen, und zwar hab ich einen Startwert und eine Reichweite gegeben.
Finden möchte ich dadurch alle Elemente, die, ausgehend von ihrem Startwert unter Berücksichtigung ihrer eigenen Reichweite im Bereich liegen, den ich als "Suchfeld" angegeben habe.
Das ganze mal etwas grafisch dargestellt:

Die Elemente:
..|............|...................................................... Element 1
...........|...................................................|...... Element 2
.|.................................................................|.. Element 3
...................................|..|............................... Element 4


Die Suchparameter:
....................................|..............|.................. Suche 1
..........|...........|............................................... Suche 2
....................................................................|| Suche 3

Suche 1 müsste in diesem Beispiel dann die Elemente 2,3 und 4 zurückgeben.
Suche 2 würde 1,2 und 3 als Rückgabe haben.
Suche 3 würde kein Element zurückgeben.

Eine einfache (direkte) Implementierung von so einem Konzept ist ja kein Problem. Ich überprüfe einfach alle Elemente der Reihe nach, ob sie irgendwie in den Suchbereich fallen.
Das ist aber blöd, wenn ich dann z.B. 200.000 Elemente habe und einen sehr kleinen Suchbereich (in den vllcht 20 Elemente fallen), dann dauert meine Suche ganz schön lange.
Klar, man könnte das Verfahren von oben optimieren und nur die Elemente überprüfen, deren Startwert kleiner ist als Startwert + Reichweite des Suchfeldes.
Das würde im Mittel wohl eine Halbierung der zu überprüfenden Elemente nach sich ziehen.
Das reicht aber nicht (100.000 sind immer noch sehr viele)

Deshalb versuche ich nun, die Elemente in einer Datenstruktur möglichst so anzuordnen, dass eine Suche in möglichst schneller Zeit durchgeführt werden kann.
Dabei spielen der Aufwand für das Einfügen und das Entfernen von Elementen sowie der Speicherplatzverbrauch erstmal keine Rolle.
Nur die Laufzeit ist interessant.

Ideen dazu habe ich natürlich schon. Eine "Standardisierung" der Startwerte in Verbindung mit den Reichweiten (die beide Werte sozusagen zu einem zusammenfasst) wäre wohl gut.
Dann könnte man das über eine "normale" Suche lösen.
Ich dachte auch schon an den Einsatz eines Min-Max-Octtrees, weiß aber nicht, ob mir das weiterhelfen könnte.

Habt ihr dazu irgendwelche Ideen?
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Sortierte Liste unter Berücksichtigung von Reichweiten

Beitrag von Kerli » Mo Apr 12, 2010 8:58 pm

Also wenn ich das richtig verstanden habe hast du eine Liste mit Intervallen, und möchtest bei einer Suche alle, mit dem zu suchenden Intervall überlappenden Intervalle finden.

Bei einer kurzen Suche bin ich auf ein Paper gestoßen in dem ein Algorithmus beschrieben der anhand eines balanzierten Baumes feststellt ob ein Punkt in einem Intervall liegt. Das könnte man eventuell als Ansatz hernehmen. Was bei dir jedoch etwas schwieriger ist, ist dass du nicht nur nach einem Punkt sondern einem Intervall suchst, weshalb du erstens überprüfen musst ob Start- oder Endpunkt des zu suchenden Intervalls in den gespeicherten Intervallen liegen und zusätzlich das gleiche auch noch umgekehrt für die einzelnen Intervalle im zu suchenden Intervall.

Nur so aus Interesse, für was brauchst du das? :P
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Sortierte Liste unter Berücksichtigung von Reichweiten

Beitrag von Dirty Oerti » Mo Apr 12, 2010 9:50 pm

Danke erstmal für deine Antwort :)
Das bringt mich schonmal ein Stück weiter.

Was aber das Hauptproblem ist:
Ich habe ja SEHR viele Intervalle, wenn ich nun jedes überprüfen muss, dann komme ich auch nicht wirklich schneller ans Ziel, oder?

Wofür ich das brauche? :)
Nunja, wenn man das (sehr) schnell hinbekommt, dann hat man Culling in einer Dimension.
Das ganze dann auf 2 oder 3 Dimensionen aufzustocken ist dann kein Problem mehr, da unabhängig von der jetzigen Problemstellung.
Hauptsächlich aber aus Interesse :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Sortierte Liste unter Berücksichtigung von Reichweiten

Beitrag von Xin » Mo Apr 12, 2010 9:56 pm

Ohne jetzt eine fertige Lösung zu haben, poste ich Dir meinen ersten Gedanken auf dem Weg zu einer Lösung.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

AnGaiNoR
Beiträge: 212
Registriert: Sa Jul 19, 2008 7:07 pm
Wohnort: Dresden

Re: Sortierte Liste unter Berücksichtigung von Reichweiten

Beitrag von AnGaiNoR » Mi Apr 14, 2010 5:15 pm

Mein erster Gedanke ging dahin, dass man einmal nach Startwert und einmal nach Endwert sortieren könnte. Auf diesem Weg sollte man sehr schnell suchen können, allerdings benötigt man sehr viel mehr Speicher.
Physics is like sex: sure, it may give some practical result, but that's not why we do it.
(Richard P. Feynman)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Sortierte Liste unter Berücksichtigung von Reichweiten

Beitrag von Xin » Mi Apr 14, 2010 5:22 pm

AnGaiNoR hat geschrieben:Mein erster Gedanke ging dahin, dass man einmal nach Startwert und einmal nach Endwert sortieren könnte. Auf diesem Weg sollte man sehr schnell suchen können, allerdings benötigt man sehr viel mehr Speicher.
Das wären zwei Indizes, um den Zugriff zu beschleunigen.
Vergleichbares macht der kd-Baum ja auch.

Wie ist denn die Lage der Nation?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Sortierte Liste unter Berücksichtigung von Reichweiten

Beitrag von Dirty Oerti » Fr Apr 16, 2010 7:49 pm

AnGaiNoR hat geschrieben:Mein erster Gedanke ging dahin, dass man einmal nach Startwert und einmal nach Endwert sortieren könnte. Auf diesem Weg sollte man sehr schnell suchen können, allerdings benötigt man sehr viel mehr Speicher.
Hm, so einfach ist das nicht.
Du musst die beiden Werte auch kombinieren, da sie ja von einander abhängig sind, mal auf die Suche und deren Ergebnis bezogen.

Was aber geht ist natürlich, dass man dadurch die Wahrscheinlichkeit für Treffer in den ersten Plätzen der Liste(n) erhöht und somit statistisch eine schnellere Suchzeit hat.

Xin hat geschrieben:Wie ist denn die Lage der Nation?
Die Nation bereitet sich im Moment zumindest moralisch schon mal auf das Abitur vor, dass in 2 Wochen und 5 Tagen beginnt ;)
Es bleibt also im Moment nicht viel an Ressourcen (mentaler Natur) dafür.

Die ganzen unterschiedlichen Bäume hab ich mir aber mal angeguckt.
Was auch interessant aussieht ist dieser "Bereichsbaum", der R-Baum und dessen Abwandlungen und das "Grid File"
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten