![]() |
AW: Wie kann man viele Punkte schnell vergleichen?
@Medium: Es gibt da neben ein paar Grenzfällen, in denen der Code einen ERangeError auslöst (z.B. erster Punkt liegt innerhalb des ersten Fensters, letzter Punkt liegt außerhalb des letzten Fensters), noch das Problem, daß er fehlerhafte Resultate liefert. Mit den gegebenen Werten ergänzt um ein paar weitere Fenster mit Spezialfällen (drittes Fenster umschließt erstes, kompletter Bereich, genau ein Punkt, nur ein Punkt im Bereich) bekomme ich folgende Ergebnisse:
Code:
Punkte: 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
erwartet: ------------------------------------------------------------- 0.7-1.8: 1.0, 1.5 1.4-3.7: 1.5, 2.0, 2.5, 3.0, 3.5 0.6-2.1: 1.0, 1.5, 2.0 0.0-5.0: 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0 2.0-2.0: 2.0 2.9-3.1: 3.0 erhalten: ------------------------------------------------------------- 0.7-1.8: 1.5 , 2.0 1.4-3.7: 0.6-2.1: 1.0 , 1.5 , 2.0 , 2.5 , 3.0 , 3.5 0.0-5.0: 2.0-2.0: 3.0 2.9-3.1: 4.5 |
AW: Wie kann man viele Punkte schnell vergleichen?
Hab jetzt nur mal auf die Schnelle das Find der TStringList versucht anzupassen und hoffe es stimmt soweit auch. :stupid:
Delphi-Quellcode:
Das Array muß natürlich nach X sortiert sein.
type TMyArray = array of record X, Y: Integer; end;
function FindLowerXIndex(const Arr: TMyArray; LowX: Integer): Integer; var L, H, I: Integer; begin L := 0; H := High(Arr); while L <= H do begin I := (L + H) shr 1; if Arr[I].X < LowX then L := I + 1 else H := I - 1; end; Result := L; end; |
AW: Wie kann man viele Punkte schnell vergleichen?
Zitat:
Zitat:
Schöne Grüße, Medium |
AW: Wie kann man viele Punkte schnell vergleichen?
Huch, schön, dass euch das Thema auch so interessiert. Erst einmal danke für die zahlreichen Beiträge.
Zitat:
1 Million Punkte zu prüfen hat heute ca. 2-3 Sekunden gedauert nach meinem bisherigen Vorgehen. Das ist natürlich langsam. Die binäre Suche und die anderen Algorithmen werden vermutlich nicht funktionieren, zumindest nicht wie gewünscht. Würde die Steigung der Kurve immer positiv sein, wäre denkbar, mit dieser Suche, die jeweils linken und rechten Kanten der Fenster zu bestimmen. Ist die Steigung innerhalb eines Fensters sehr groß und tritt die Kurve unten in das Fenster ein, komme ich mit den Algorithmen dennoch nur zur linken Kante. D.h. ich muss sämtliche Werte in den Fenstern weiterhin prüfen, da hier der Y-Wert ausschlaggebend ist. Eine weitere Schwierigkeit ist, dass die Kurve auch "zurück laufen" kann. Es handelt sich also nicht um eine mathematische Funktion. Ja, langsam wird's kompliziert. ;) Grüße, Matze |
AW: Wie kann man viele Punkte schnell vergleichen?
Zitat:
Wenn ja, wär es vielleicht sogar anzudenken, das ganze über die Grafikkarte und OpenGL zu machen und die Punkte als Vertices in die Grafikkarte zu jagen. Dann hättest du schlussendlich so ziemlich alle Möglichkeiten, die dir Occlusion Tests der Hardware so bieten. Aber ich denke, für dein Projekt ist das wohl etwas zuviel des Guten? |
AW: Wie kann man viele Punkte schnell vergleichen?
Zitat:
[edit] Das wäre jetzt der Punkt, wo ich anfangen würde, über manuelle Optimierungen und Multithreading das meiste aus der Implementierung herauszuholen, da ich bezweifle, dass es in diesem Fall eine schnellere Lösung gibt, als für jeden Punkt den Vergleich auszuführen, wenn die Daten in Echtzeit hereinkommen. Denn jede optimierte Suche setzt irgendeine Sortierung voraus, und die minimale Laufzeit für einen Sortieralgorithmus beträgt laut Wikipedia O(n*log(n)). Ein einfacher Durchlauf über alle Punkte hingegen hat eine lineare Laufzeit von O(n), und ist somit bei deinen Datenmengen wahrscheinlich schneller als die Sortierung allein. Disclaimer: Ich habe kein Informatik studiert (noch nicht ;)). [/edit] |
AW: Wie kann man viele Punkte schnell vergleichen?
Ähm jain. Sie kommen nicht direkt in Echtzeit rein, da das ganze voraussichtlich unter Windows laufen wird.
Die Daten werde ich jedoch puffern und anschließend, wenn sie alle da sind, auswerten. Parallel zum Einlesen die Auswertung vorzunehmen wäre auf der einen Seite nett, aber dann müsste ich ständig prüfen, ob die Werte überhaupt so weit eingetroffen sind, dass sie ein Fenster ausfüllen. Und das ist wohl nicht möglich. Wenn die Werte bsp. in ein Fenster reichen, aber noch nicht drüber raus, dann habe ich unnötig herum gerechnet. Über die Grafikkarte lasse ich das nicht laufen. Das soll auf CPU-Ebene ablaufen. |
AW: Wie kann man viele Punkte schnell vergleichen?
Ändern sich die Daten denn zwischen zwei Messungen komplett, oder kommen z.B. nur rechts neue Werte hinzu und die alten verschieben sich nach links o.ä.?
|
AW: Wie kann man viele Punkte schnell vergleichen?
Die Kurvenform wird in den meisten Fällen ähnlich sein.
Vor jeder Messung werden die Daten jedoch gelöscht. |
AW: Wie kann man viele Punkte schnell vergleichen?
Bei Punkt und Ebene fällt mir immer die
![]() vergiss die erste Idee... 2: Idee: Berechne die Abstände zum Mittelpunkt des Rechtecks. Ist die Differenz (Positiv und Negativ) zum Rand minimal dann sind das die gesuchten Punkte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz