AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Doppelt verkettete Liste sortieren

Ein Thema von Mr.P-Funk · begonnen am 21. Feb 2005 · letzter Beitrag vom 14. Sep 2010
Antwort Antwort
Seite 2 von 3     12 3      
Mr.P-Funk

Registriert seit: 9. Dez 2003
11 Beiträge
 
Delphi 5 Standard
 
#1

Re: Doppelt verkettete Liste sortieren

  Alt 22. Feb 2005, 16:45
@ DelphiDeveloper
Der Vorschlag mit TList zu arbeiten, erspart sicher viel Zeit, ist aber nicht ganz das was ich wollte.
Trotzdem THX für die Idee.

@ Niko
MergeSort kenne ich noch nicht... leider :(
Werde mir das aber mal ansehen.

@ Shima
Ungefähr so hatte ich mir das in meine 2 Variante auch vorgestellt.
Aber warum brauchst du so viele Informationen in dem Array (SortArray : array of TSortItem) ?
Ich glaube es reicht ein Array mit einem untypisiertem Pointer, in dem die Adresse des Elementes steht, und ein Feld wo der Wert drinn steht nachdem sortiert werden soll.
Das Array lässt man dann sortieren und "verbiegt" seine Liste neu (Die Daten davon liegen ja noch im Speicher).

Wenn ich das richtig verstanden habe, würdest du alle Infos die in der Kette stehen auch in das DynArray schreiben. Aber dann würde ein Dreickstausch doch sehr lange dauern, wenn das record aus mehr Feldern bestehen würde...
Oder habe ich das jetzt falsch verstanden? :gruebel:


Ich habe mal ein kleines Beispielprogramm erstellt.
Allerdings raten mir viele Leute davon ab, das so zu machen. Es wäre zu unsicher...
Könnt ja mal reinschauen.

Großes THX an alle! :hello:

cya
MR.P-Funk
Angehängte Dateien
Dateityp: zip dopppeltverkettet_liste_sortieren_952.zip (7,2 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#2

Re: Doppelt verkettete Liste sortieren

  Alt 22. Feb 2005, 17:36
Der schnellste und effizientes Weg ist die unsortierten Einträge der Liste A in eine neue Liste B sortiert einzufügen. Man kann dies noch beschleunigen indem man zur ListB ein Array mit Ln2(ListA.Count) Pointern benutzt. In diesem Array wird ein Zeiger auf das jeweils ListB.Count/Ln2(ListA.Count) Element/Node gespeichert. Beim Enfügen einer Neuen Node wird nun dieses Array per QuickFind durchsucht um die Anfangsnode ab der die Liste itertiert werden muß zu finden. Dies beschleunigt ungemein das sortierte Einfügen in deine ListeB.
Das Zusatzarray wird von Anfang an auf ListA.Count Elemente initialisiert und dann deren enthaltene Pointer nur succesive nach dem Einfügen/Umkopieren der Node geupdatet. Bei diesem Update kann man sich weiter beschränken indem man nur die beiden "Rand" Nodes in diesem Array korregiert.

Hm, ich glaube nicht das ich das verständlich rübergebracht habe

Gruß Hagen
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Doppelt verkettete Liste sortieren

  Alt 22. Feb 2005, 18:34
Zitat von Mr.P-Funk:
@ Shima
Ungefähr so hatte ich mir das in meine 2 Variante auch vorgestellt.
Aber warum brauchst du so viele Informationen in dem Array (SortArray : array of TSortItem) ?
Ich glaube es reicht ein Array mit einem untypisiertem Pointer, in dem die Adresse des Elementes steht, und ein Feld wo der Wert drinn steht nachdem sortiert werden soll.
Da hast du nicht genau hingeschaut.
Das Array aus meinem Vorschlag enthält nur Zeiger (Datentyp PSortItem)
Der typisierte Pointer vereinfacht das Programmieren...
Andreas
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Doppelt verkettete Liste sortieren

  Alt 22. Feb 2005, 19:59
Zitat von negaH:
Der schnellste und effizientes Weg ist die unsortierten Einträge der Liste A in eine neue Liste B sortiert einzufügen....Hm, ich glaube nicht das ich das verständlich rübergebracht habe Gruß Hagen
Hehe, ich verstehe das auch nicht. 8) Ich vermute mal, er will das sagen, was man machen sollte : die Liste direkt sortiert aufzubauen und basta. Dann entfällt der Rest sowieso. Muß die Liste unbedingt komplett anders umsortiert werden, tja dann eben wirklich unter dem neuen Sortierkriterium neu aufbauen.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#5

Re: Doppelt verkettete Liste sortieren

  Alt 23. Feb 2005, 01:50
@Hansa, stop mal, will er die Liste umsortieren oder will er einen sortierten Index für die Liste aufbauen ohne die Liste physikalsich umzusortieren ?

Ich war der Meinung das er die Liste umsortieren will. Da er eh schon mit Verketteten Nodes/Elementen arbeitet ist es auch kein Problem sehr schnelle Nodes aus einer Liste zu erntfernen und in eine andere Liste sortiert einzufügen. Dies kostest erstmal keinen zusätzlichen Speicher. Allerdings muß er beim Einfügen einer Node in die neue und sortierte Liste im ungünstigen Falle immer diese Node mit allen Nodes in der Zielliste vergleichen. Dies ist sehr ineffizient. Man könnte nun ein komplettes Array[] of PNode aufbauen das so viele Zeiger wie Nodes in der Liste enthält. Dies kostet Speicher, lässt sich aber per QuickSort einfach und schnell sortieren, wäre vergleichbar mit einem externen Index und kostet im Grunde sehr viele Speicherkopieroperation während der Sortierei.

Ein Kompromiss ist nun eine Lösung die beide primären Varianten vereint, sprich Umsortieren in neue List und dabei ein sehr kurzes Indexarray für die Suche der Einsortierposition der Node.

Speicherbedarf: Ln2(List.Count) statt (List.Count * SizeOf(Pointer)) bei der arary[] Methode
Suchkomplexität: Ln2(List.Count) + List.Count / Ln2(List.Count) statt Ln2(List.Count) bei Quicksort
Kopieroperation: (List.Count) Zeiger verbiegen == linear

Somit wäre mein Vorschlag leicht langsammer beim Suchen der richtigen Einfügeposition, allerdings wird dies durch die wesentlich erhöhten Speicheroperationen bei den anderen Methoden weitestgehend kompensiert. Denn Speicherkopierungen sind wesentlich langsammer auf modernen CPU's also nur readonly durch eine verkettete Liste durchzuiterieren.

Falls das Sortieren der Liste wirklich enorm schnell gehen muß dann kann man das durch eine Erweiterung der Nodes erreichen. Die Nodes selber sind als verkettete Liste linear untereinander verknüpft. Aber gleichzeitig sind sie auch als Binärer Baum, zb. ein AVL oder Red Black Tree aufgebaut. Die Nodes müssten dann nicht mehr doppelverlinkt werden, aber zusätlich benötigen sie mindesten zwei weitere Zeiger -> Left,Right.
Beschränkt sich das Sortieren aber nur auf das Einfügen in einen solchen Tree dann kann man die Left,Right Zeiger später als Prev,Next Pointer für die verlinkte Liste benutzen. Während des Aufbauens des Baumes entsteht also ein ausbalancierter binärer Baum (RB, AVL). Nachdem man alle Nodes so eingefügt hat, kann man mit einer Rekursiven Funktion die den Baum sequetiell alphabethisch abarbeitet, neu zu einer normalen doppeltverlinkten Liste ummodscheln Klar, einmal in eine Liste umgemodschelt kann man keine neuen Nodes mehr sortiert als Baum einfügen.
D.h. temporär beim Umsortieren werden die Nodes statt in einer linearen Liste in einen binären Baum eingearbeitet, aus den Prev,Next Zeigern werden die Left,Right Zeiger für den AVL/RB Tree. Nachdem man alle Nodes so binär umkopiert hat wird der Baum neu verlinkt so das eine Liste entsteht.

Dieses Verfahren ist Ln2(List.Count) schnell, asymptotisch schneller als QuickSort !! benötigt keinen zusätzlichen Speicher und keine Kopieroperationen ausser dem Umbiegen der Zeiger. Allerdings ist es komplex und nicht einfach zu coden.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Re: Doppelt verkettete Liste sortieren

  Alt 14. Sep 2010, 08:23
Speicherbedarf: Ln2(List.Count) statt (List.Count * SizeOf(Pointer)) bei der arary[] Methode
Suchkomplexität: Ln2(List.Count) + List.Count / Ln2(List.Count) statt Ln2(List.Count) bei Quicksort
Kopieroperation: (List.Count) Zeiger verbiegen == linear
Ich weiß der Thread ist schon uralt, aber für mich gerade aktuell da ich auch eine eigene spezielle Liste bastle.
Ziemlich interessant wie du den Ramverbrauch der CPUlast gegenüberstellst. (Ich war immer der Meinung, dass das bei Such/Sortierverfahren, aufgrund des dynamischen Inhalts, nahezu nicht geht)
Aber was tut bitte "Ln2()"?

Geändert von mleyen (14. Sep 2010 um 08:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.820 Beiträge
 
Delphi 12 Athens
 
#7

AW: Doppelt verkettete Liste sortieren

  Alt 14. Sep 2010, 09:05
Ins blaue geraten ist das der Logarithmus mit Basis 2.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Gollum
Gollum

Registriert seit: 14. Jan 2003
Ort: Boxberg
456 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: Doppelt verkettete Liste sortieren

  Alt 14. Sep 2010, 09:49
Hallo,

wenn ich den Link aus dem Thread von Hansa anklicke komme ich auf eine Seite, die vBulletin-Systemmitteilung heißt und mir etwas von mangelden Rechten erzählt.
Ist dieser Link so geheim, dass ich ihn nicht anklicken darf oder ist dies ein Bug?
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Doppelt verkettete Liste sortieren

  Alt 14. Sep 2010, 09:56
Moin,
wobei Ln2() auch irgendein anderer Logarithmus sein kann. O(LnX()) = O(LnY())

Und wegen Hansas Post: Entweder er liegt irgendwo, wo der Otto Normal Benutzer nicht hin darf, oder bei der Umstellung auf die DP20XX ist was schief gelaufen.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Mr.P-Funk

Registriert seit: 9. Dez 2003
11 Beiträge
 
Delphi 5 Standard
 
#10

Re: Doppelt verkettete Liste sortieren

  Alt 23. Feb 2005, 15:02
@ Shima
Upps zu schnell gelesen...
Aber die einen typisierten Zeiger zu nehmen ist gut, warum bin ich da nicht selber drauf gekommen ...
Damit ist der Aufwand wohl echt geringer.

@ negaH
Das hört sich ja interessant an, aber ich hatte schon Probs das überhaupt zu verstehen, nen Code kann ich mir nur schwer vorstellen...
Hast du sowas mal geschrieben? Wenn ja kannst du es mal posten oder direkt Email??

Ich erkläre den Thread als geschlossen; meine Fragen wurden beantwortet
THX @ all
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 14:24 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