![]() |
Suche nach nächstem gleich-großen oder größeren Wert
Hallo zusammen,
ich benötige eine Datenstruktur, die es mir erlaubt möglichst performant nach numerischen Werten zu suchen. Hierbei suche ich allerdings nicht nur exakte Werte, sondern möchte als Fallback (bei nicht-Fund) den nächst-größeren Wert ermitteln. Eine weitere Anforderung ist, dass ich ebenfalls möglichst performant Werte einfügen und löschen kann. Ich denke mal, dass ich um balancierte Bäume wohl nicht herumkommen werde. Habt ihr irgendwelche speziellen Vorschläge? Viele Grüße Zacherl |
AW: Suche nach nächstem gleich-großen oder größeren Wert
Balancierte Bäume wären mein Tipp gewesen erstmal so. Hab da schon lang nichts mehr gemacht.
Heute würde ich sagen, kommt auf den konkreten Anwendungsfall an. Denn wenn ich z.B. weiß, ich krieg immer sortierte Werte rein, weiß ich, ich muss immer umbauen, schlecht. Der Aufbau Algorithmus im Baum, kann auch (genauso gut?) bei der Suche in einer sortierten Liste angewendet werden. Also lebt das Ding wie wild, ist es statisch, wie groß wird es, gibt's "downtime" für Reorganisation? Fragen über Fragen... |
AW: Suche nach nächstem gleich-großen oder größeren Wert
Moin...8-)
Ich würde ein TDictionary um deine "dann der nächste" erweitern. Durch die binäre Suche ist TDictionary sehr schnell. :hi: |
AW: Suche nach nächstem gleich-großen oder größeren Wert
Einen sortierte TList oder TObjectList sollte für Normalfälle schon reichen.
Man sollte halt nicht alle Elemente prüfen, sondern zuerst das mittlere Element. Abhängig vom Ergebnis halbiert sich die Menge der relevanten Elemente. Von dieser Hälfte wieder das mittlere Element usw. Das Insert in eine sortierte Liste funktioniert nach dem selben Prinzip. So findet man das Ergebnis aus 100000 Elementen z.B. mit 17 Vergleichen. |
AW: Suche nach nächstem gleich-großen oder größeren Wert
Ich würde ein TArray<T> empfehlen und darauf das TArray.BinarySearch<T> loslassen. Die Doku sagt dazu:
Zitat:
Bei XE7 würde man zum Einfügen einfach das
Delphi-Quellcode:
nehmen, aber das geht bei XE3 wohl noch nicht.
Insert
|
AW: Suche nach nächstem gleich-großen oder größeren Wert
Balancierte Bäume sind was du suchst. Bei B+-Bäumen geht das Finden der nächsten Elemente sogar in O(1).
|
AW: Suche nach nächstem gleich-großen oder größeren Wert
naja, das ist jetzt in einer sortierten Liste auch nicht so schwer oder?
|
AW: Suche nach nächstem gleich-großen oder größeren Wert
Zitat:
Es ist schon so, daß das TDictionary bei geeigneter Hash-Funktion sehr schnell bei der Suche nach einem Key ist, aber für die Suche nach dem nächst-größeren Key ist es denkbar ungeeignet. |
AW: Suche nach nächstem gleich-großen oder größeren Wert
Zitat:
Man braucht also eine inhaltlich sotierte Liste. Wenn man Keine hat, dann bringt es nicht viel nur für eine Suche soeine Liste aufzubauen, bzw. wenn immer vor dem Suchen neu sortiert werden muß ... dann dann sollte alles durchlaufen und das suchen, das größer-gleich dem Suchwert ist und kleiner als alles Andere. |
AW: Suche nach nächstem gleich-großen oder größeren Wert
Ich habe eine binäre Suche für eine Objektliste genutzt.
Beim Einfügen wird geprüft, ob der Wert (das Objekt) schon existiert. Sonst wird der Index des nächsten Wertes zurückgegeben. An die Stelle wird dann der neue Wert eingefügt. Die Suche ist auch sehr schnell. Das lässt sich sicher noch etwas anpassen. ![]() Gibt es dafür noch bessere Lösungen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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