AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Suche nach nächstem gleich-großen oder größeren Wert
Thema durchsuchen
Ansicht
Themen-Optionen

Suche nach nächstem gleich-großen oder größeren Wert

Ein Thema von Zacherl · begonnen am 24. Okt 2014 · letzter Beitrag vom 27. Okt 2014
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Suche nach nächstem gleich-großen oder größeren Wert

  Alt 24. Okt 2014, 02:56
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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Suche nach nächstem gleich-großen oder größeren Wert

  Alt 24. Okt 2014, 08:18
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...
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: Suche nach nächstem gleich-großen oder größeren Wert

  Alt 24. Okt 2014, 08:34
Moin...

Ich würde ein TDictionary um deine "dann der nächste" erweitern. Durch die binäre Suche ist TDictionary sehr schnell.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#4

AW: Suche nach nächstem gleich-großen oder größeren Wert

  Alt 24. Okt 2014, 09:21
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: Suche nach nächstem gleich-großen oder größeren Wert

  Alt 24. Okt 2014, 09:33
Ich würde ein TArray<T> empfehlen und darauf das TArray.BinarySearch<T> loslassen. Die Doku sagt dazu:

Zitat:
Bei gefundenem Element enthält FoundIndex den nullbasierten Index von Item. Bei nicht gefundenem Element enthält FoundIndex den Index des ersten Eintrags, der größer als Item ist.

Bei XE7 würde man zum Einfügen einfach das Insert nehmen, aber das geht bei XE3 wohl noch nicht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Suche nach nächstem gleich-großen oder größeren Wert

  Alt 24. Okt 2014, 10:15
Balancierte Bäume sind was du suchst. Bei B+-Bäumen geht das Finden der nächsten Elemente sogar in O(1).
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: Suche nach nächstem gleich-großen oder größeren Wert

  Alt 24. Okt 2014, 10:35
naja, das ist jetzt in einer sortierten Liste auch nicht so schwer oder?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#8

AW: Suche nach nächstem gleich-großen oder größeren Wert

  Alt 24. Okt 2014, 11:35
Ich würde ein TDictionary um deine "dann der nächste" erweitern. Durch die binäre Suche ist TDictionary sehr schnell.
Ich weiß jetzt nicht, welche TDictionary-Implementation du da gerade vorliegen hast, aber die aus System.Generics.Collection verwendet keine binäre Suche sondern einen Hash-Algorithmus. Dabei wird aus dem Key ein Hash-Wert und aus diesem ein Index in das interne Array gebildet. Dann wird geprüft, ob der Hashwert an dem Index vorhanden ist und ob der Key wirklich passt. Dummerweise liegen die Daten im Array nicht sortiert vor, was eine Suche nach dem nächsthöheren Eintrag höchst ineffizient werden lässt. Man muss dazu nämlich das ganze Dictionary durchsuchen, wenn der Wert nicht vorhanden ist.

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#9

AW: Suche nach nächstem gleich-großen oder größeren Wert

  Alt 24. Okt 2014, 12:03
Dummerweise liegen die Daten im Array nicht sortiert vor
Doch, aber halt nach den Hashs und nicht dem Inhalt sortiert.

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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (24. Okt 2014 um 12:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Suche nach nächstem gleich-großen oder größeren Wert

  Alt 24. Okt 2014, 13:22
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.

http://www.delphipraxis.net/1244470-post11.html

Gibt es dafür noch bessere Lösungen?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz