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 2  1 2      
Benutzerbild von Uwe Raabe
Uwe Raabe

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

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

  Alt 24. Okt 2014, 10: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
43.195 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 24. Okt 2014, 11: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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

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

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

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

  Alt 24. Okt 2014, 12: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
Benutzerbild von haentschman
haentschman

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

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

  Alt 24. Okt 2014, 14:56
Zitat:
Es ist schon so, daß das TDictionary bei geeigneter Hash-Funktion sehr schnell bei der Suche nach einem Key ist
...das meinte ich so. Binär war der Verschreiber...
Zitat:
aber für die Suche nach dem nächst-größeren Key ist es denkbar ungeeignet.
...richtig, aber möglich.
Zitat:
Ich würde ein TArray<T> empfehlen und darauf das TArray.BinarySearch<T> loslassen.
...ist natürlich besser. Wie soll man das finden wenn man nicht weis das es sowas gibt.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

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

  Alt 24. Okt 2014, 15:21
Zitat:
Ich würde ein TArray<T> empfehlen und darauf das TArray.BinarySearch<T> loslassen.
...ist natürlich besser. Wie soll man das finden wenn man nicht weis das es sowas gibt.
Liest du denn nicht bei jedem neuen Delphi die mitgelieferten Sourcen?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 24. Okt 2014, 17:10
Zitat:
Zitat:
aber für die Suche nach dem nächst-größeren Key ist es denkbar ungeeignet.
...richtig, aber möglich.
Das käme dann aber eine Suche in einer/einem nicht sortierter/m Liste/Array gleich, dann würde ich gleich eine/einen solche/n nehmen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

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

  Alt 24. Okt 2014, 17:37
Vielen Dank schonmal für eure zahlreichen Antworten. Ich konkretisiere mal ein wenig:

Ich benötige diese spezielle Art der Suche für einen Symbol Resolver (das Ding, was in einem Disassembler numerische Adressen in SymbolName + Offset umwandelt). Hat man beispielsweise ein bekanntes Symbol an Adresse 0x1000 und der Resolver bekommt jetzt Adresse 0x1010 übergeben, dann wäre die Ausgabe SymbolName+0x10. Üblicherweise wird man wohl versuchen die meisten Symbole schon vor dem ersten Resolvevorgang "einzutragen", aber es kann durchaus passieren, dass nachträglich noch eine ganze Reihe von Adressen hinzugefügt werden muss.

Ich werde dann mal wohl mal ein wenig mit binärer Suche und B+ Bäumen rumspielen

Viele Grüße
Zacherl
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

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

  Alt 25. Okt 2014, 08:17
Dummerweise liegen die Daten im Array nicht sortiert vor
Doch, aber halt nach den Hashs und nicht dem Inhalt sortiert.
Nein. Hash modulo Listengröße = Index. Gleicher Index => Kollision => Verschiedene Strategien.

B+ Bäume sind hierfür imho falsch, denn sie basieren auf festen Speicherblöcken (z.B. Dateiblöcken) und sind nichts anderes als binäre Arrays, die als N-ärer Baum untereinander hängen. Für die In-Memory Suche ist das imho overkill.

Binäre Listen sind knackig und kurz in der Implementierung, dafür O(n) beim Einfügen (Listeninhalt muss verschoben werden). Das geht aber sehr schnell.

Binäre Bäume (RB oder AVL) komplexer in der Umsetzung, aber dafür für diesen Fall optimal.

Eine SkipList wäre noch eine Alternative.

Es gibt fertige Lösungen, auch hier im Forum, z.B. hier :
http://www.delphipraxis.net/55493-ve...eispielen.html
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#9

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

  Alt 25. Okt 2014, 09:16
Die eigentliche Frage lautet wie viel zeit hast Du fürs Sortieren übrig..

Kommen die Werte einzeln rein...
- Mit Intervall-Schachtelung die Position suchen
- Mit einem Move Platz machen und einfügen

Kommen viele Werte auf einmal rein
- QSort drüber fertig
- Suchen wieder mit Intervall-Schachtelung...

Wahrscheinlich kann man in einer eigenen Implementierung einige Taktzyklen sparen, aber i.d.R. "reichen"
auch die Bordmittel.

Mavarik
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

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

  Alt 25. Okt 2014, 09:42
Wahrscheinlich kann man in einer eigenen Implementierung einige Taktzyklen sparen, aber i.d.R. "reichen" auch die Bordmittel.
Das stimmt. Ich vertrete die Ansicht, das für die Lösung eines Problems immer die beste Möglichkeit gewählt werden soll. Was das 'beste' ist, muss man dann abwägen. Teil der Abwägung ist natürlich 'Kosten/Nutzen', da hast Du vollkommen recht. Allerdings: Einen RB-Baum in seinem Portfolio zu haben, schadet nichts. Dann hat man immer etwas Sauschnelles zur Hand, wenn man vor einem ähnlichen Problem steht (Daten müssen sortiert vorliegen, nächstgrößeren Wert ermitteln o.ä.).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:11 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