Moin
Definier mal eine Abstandsfunktion.
abstand =Länge des Vektores zwischen den Punkt X und Punkt Y
-> wurzel(delta(x)^2+delta(y)^2+delta(z)^2)
Iiiggt… die ist übel. Das kompliziert die Sache ein bisschen.
Wie sollte eine Vorselektion aussehen?
Alles was ich habe ist :
- bool raum[256][256][256] mit unbekannter Verteilung der
Wahrheitswerte
Naja, du wirst ja hoffentlich mehr als eine Suche durchführen, es lohnt sich also evtl ein bisschen „Vorarbeit“ zu leisten. Die muss ja nur 1x erbracht werden, alle weiteren Suchen können darauf aufbauen.
So eine spontan-Idee für eine Vorselektion:
bool raum2[256/Faktor][256/Faktor][256/Faktor]
(Faktor so um 4, evtl auch mehrere raum2-Felder mit unterschiedlichen Faktoren)
Jeder Punkt (X,Y,Z) in raum2 entspricht einem Raumbereich (Würfel) der Grösse Faktor x Faktor x Faktor um den Punkt (X x Faktor,Y x Faktor,Z x Faktor). Wenn in diesem Würfel ein true-Punkt vorkommt ist raum2 auch true, sonst false.
Wenn du auf Koordinaten etwas mit raum2 = false triffst kann du dir den Würfel in raum schonmal schenken.
Ausserdem kannst du das ganze ein bisschen anders speichern. Kodier die bool-Werte in int’s oder long’s rein. Du könntest dann (bei long) z.B. 64 bool-werte in einem Befehl testen (wert == 0 => alle false). Testen eines einzelnen bool-werte dauert auch nicht so viel länger (1x AND-verknüpfen und mit 0 vergleichen). (Ob long oder int schneller wären hängt von der CPU ab. Ich schätz mal beim P4 ist int schneller, beim Athlon64 long)
Das würde ziemlich sicher was bringen, da es den RAM erheblich entlastet. (Von ±67MB runter auf ±2MB) Damit wird dann die Cache-hit-rate höher, was bei Athlon und P4 unheimlich hilft.
Bei der Suche selbst würde ich vom dem gegebenen Punkt ausgehen und Würfel um den Punkt herrum „abgrasen“. Wenn man den ersten findet => erste Distanz berrechen. Danach darf man aber nicht sofort aufhören, da es (bei der Distanz-funktion) immernoch Punkte geben kann die noch näher dran sind. Man müsste dann solange weitermachen bis alle Punkte, die näher als der erste gefunde liegen, mit durchsucht wurden. Dabei durchsucht man allerdings auch „unnütze“ Punkte, muss also nachher genauer sortieren.
Bei der Suche kann man mit raum2 und long-koodierung bestimmt ordentliche Zeiten rausschlagen. Die 2 Vorarbeiten lohnen sich aber nur wenn mehrere Suchen durchgeführt werden sollen.
cu