AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Ich habe eine Liste, und die soll bitte immer sortiert sein
Thema durchsuchen
Ansicht
Themen-Optionen

Ich habe eine Liste, und die soll bitte immer sortiert sein

Ein Thema von Der schöne Günther · begonnen am 14. Jan 2014 · letzter Beitrag vom 11. Dez 2015
 
Namenloser

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

AW: Ich habe eine Liste, und die soll bitte immer sortiert sein

  Alt 11. Dez 2015, 07:08
Würde sich ein binärer Suchbaum anbieten? Gibt es nutzbare Implementierungen (@Namenloser, Deine inzwischen?)?
Ich habe das Projekt, wofür ich es brauchte, mehr oder weniger abgebrochen, und seitdem meine Implementierung nicht weiterverfolgt. Prinzipiell funktioniert sie, wirkt aber noch etwas unfertig. Ich wollte den Code eigentlich noch auf Generics umschreiben, wollte aber auch die Unterstützung für ältere Compiler ohne Generics nicht verlieren. Es stellte sich dann aber leider heraus, dass es selbst mit den cleversten Include-Hacks, die mir einfallen, wohl unmöglich ist, beides gleichzeitig zu supporten, ohne den Code zu duplizieren. Ungefähr da habe ich dann die Lust verloren

Aber wie dem auch sei, ich schmeiße es jetzt einfach mal so wie es ist auf Github: https://github.com/Isopod/ABTrees. Wie gesagt, ich sehe es nicht als fertig an und übernehme keine Gewährleistung, aber vielleicht kann ja jemand was damit anfangen.

In src/abtrees kann man sehen, wie man sich einen eigenen Baum definiert. Wenn du Strings als Keys verwenden willst, müsstest du dann aber wohl TABKey als record definieren und den Vergleichsoperator überladen. Man kann natürlich mehrere Arten von Bäumen in einem Projekt haben, also z.B. einen, der Integers als Keys verwendet, einen, der Strings als Keys verwendet etc., man muss dann nur für jeden eine neue Unit anlegen.

Wichtig zu beachten:
- Ein Key muss eindeutig sein, er darf nicht mehrfach im Baum vorkommen. Das heißt natürlich nicht, dass nicht mehrere Leute „Hans“ mit Vornamen heißen dürfen, man muss sich nur überlegen, wie man den Key definiert. Man könnte z.B. zu dem Record noch eine eindeutige ID hinzufügen, die man vergleicht, wenn die Vornamen gleich sind.
- Seek gibt immer den Eintrag zurück, der am nächsten am gesuchten Key liegt und dessen Key kleiner oder gleich dem gesuchten Key ist. Es ist also kein "Find". Wenn die Einträge im Baum 1, 2, 3, 5, 6 lauten, dann gibt Seek(4) den Eintrag 3 zurück. Wenn man einen ganz bestimmten Eintrag sucht, muss man daher hinterher noch prüfen, ob der Key wirklich gleich ist.

Oder ist eine binäre Suche in einer Liste ohnehin fast gleich schnell?
Die Suche an sich ist schnell, aber wenn du viele Einträge löscht oder hinzufügst, könnte es langsam werden, da ja im Schnitt jedes mal die halbe Liste umkopiert wird.

Geändert von Namenloser (11. Dez 2015 um 07:20 Uhr)
  Mit Zitat antworten Zitat
 

 

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 06:06 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