AGB  ·  Datenschutz  ·  Impressum  







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

in sortierte liste sortiert einfügen

Ein Thema von vsilverlord · begonnen am 8. Sep 2009 · letzter Beitrag vom 11. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von vsilverlord
vsilverlord

Registriert seit: 7. Jan 2008
Ort: Baden Württemberg- Hohenlohekreis
174 Beiträge
 
RAD-Studio 2009 Arc
 
#1

in sortierte liste sortiert einfügen

  Alt 8. Sep 2009, 13:03
Hallo, ich habe eine sortierte liste ( tsortierteliste), diese hat viele zahlenwerte gespeichert, die alle sortiert sind.
Nun möchte ich eine neue Zahl einfügen, diese soll allerdings richtig einsortiert werden.
Welcher Algorithmus ist dafür wohl am besten geeignet? Heapsort usw. eigenet sich ja eigentlich nur dafür, ganze listen zu sortieren, oder? Welcher algorithmus ist dabei am schnellsten?
gruß
Volker
~beware
Wizards First Rule:
People are stupid; given proper motivation, almost anyone will believe almost anything. Because people are stupid, they will believe a lie because they want to believe it’s true, or because they are afraid it might be true
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: in sortierte liste sortiert einfügen

  Alt 8. Sep 2009, 13:05
Schau die mal TList.Sort() an
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: in sortierte liste sortiert einfügen

  Alt 8. Sep 2009, 13:07
Ich denke, mit einer binären Suche bekommst Du den Einfüge-Index auch ganz gut.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von vsilverlord
vsilverlord

Registriert seit: 7. Jan 2008
Ort: Baden Württemberg- Hohenlohekreis
174 Beiträge
 
RAD-Studio 2009 Arc
 
#4

Re: in sortierte liste sortiert einfügen

  Alt 8. Sep 2009, 13:12
ok, das problem ist, dass ich nicht nur zahlenwerte einfüge, sondern ganze objekte. Ein attribut dieser Objekte ist dann der zahlenwert, mit dem ich die objekte sortiere, deswegen kann ich tlist.sort() nicht benutzen!
gibts da einen standart algorithmus für binäre suche oder muss ich den neu schreiben? ist das auch für ca. 100000 objekte sinnvoll?
gruß
Volker
~beware
Wizards First Rule:
People are stupid; given proper motivation, almost anyone will believe almost anything. Because people are stupid, they will believe a lie because they want to believe it’s true, or because they are afraid it might be true
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: in sortierte liste sortiert einfügen

  Alt 8. Sep 2009, 13:14
Es gibt ja auch noch TList.CustomSort, da kannst Du selbst bestimmen, nach welchen Kriterien sortiert wird. Und zur binären Suche gibt es IIRC in der DP einige Beispielcodes (u.a. von Luckie).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

Re: in sortierte liste sortiert einfügen

  Alt 8. Sep 2009, 13:27
Hallo,

für Dein Problem dürfte die binäre Suche die beste Möglichkeit sein, bei 100000 Objekten kommst Du mit ca. 16 oder 17 Vergleichen aus. Weniger geht nicht. (2 hoch 17 = 131072, d. h. bei 131072 Objekten benötigst Du 17 Vergleiche.)

Schau mal bitte unter http://de.wikipedia.org/wiki/Bin%C3%A4re_Suche, dort findest Du auch Beispiele, allerdings nicht für Delphi/Pascal. Sie sollten aber für den Nachbau in Delphi geeignet sein.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: in sortierte liste sortiert einfügen

  Alt 8. Sep 2009, 13:36
Binäre Suche ist sicherlich das schnellste für beliebige Daten deren Verteilung man überhaupt nicht einschätzen kann. Je gleichmäßiger die Einträge verteilt sind, desto effektiver wird die darauf basierende Interpolationssuche, die aber bei unerwartet schlecht verteilten Einträgen wiederum zur Laufzeit der linearen Suche (O(n)) verkümmert. Diesem potentiellen Nachteil wird versucht mit der quadratischen Binärsuche zu begegnen, die wiederum eine Weiterentwicklung der Interpolationssuche ist. Und eben letztere würde ich auch versuchen wenn es um ziemlich viele Einträge geht. Bei nur ein paar hundert bis taused ist der Gewinn gegenüber der einfachen binären Suche vermutlich nicht mehr SO ausschlaggebend - je nach Anwendungsfall halt.

Wenn du recht genau weisst, dass deine Einträge z.B. grob quadradtisch oder logarithmisch vorkommen, könntest du durch Anpassung des Teilungsintervalls die einfache binäre Suche auch schon auf ein prima Niveau bekommen, aber das sind dann spezialisierte Anpassungen die ganz von der jeweils einzelnen Liste abhängen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: in sortierte liste sortiert einfügen

  Alt 8. Sep 2009, 14:22
Hallo,

Das Problem habe ich auch oft.

Die Liste ist ja bereits sortiert !
Ein neues Element soll einsortiert werden soll.

Zur Zeit hänge ich es einfach hinten an und sortiere noch mal (CustomSort).

Die Frage ist:
Finde ich den Index des neuen Elementes auch ohne komplette Neusortierung,
BinSearch findet ja nur einen Wert, aber der Wert steht ja noch nicht drin.
Es müsste also das "genau eins kleiner davor" Element bzw. dessen Index gefunden werden.

Quicksort ist bei schon sortierten Listen besonders schnell,
oder war das das genaue Gegenteil ?


Heiko
Heiko
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: in sortierte liste sortiert einfügen

  Alt 8. Sep 2009, 18:22
Zitat von hoika:
Die Frage ist:
Finde ich den Index des neuen Elementes auch ohne komplette Neusortierung,
BinSearch findet ja nur einen Wert, aber der Wert steht ja noch nicht drin.
Es müsste also das "genau eins kleiner davor" Element bzw. dessen Index gefunden werden.
Was die binäre Suche auch erledigt. Dort wo der Algo abbricht wegen nicht gefunden, musst du nur noch einen zusätzlichen Vergleich mit den zwei verbleibenden Elementen machen, und dann weisst du wo du einfügen musst.

Was du machst würde ich glatt als Verbrechen bezeichnen! Quicksort ist zwar als Sortierer auf vorsortierten Listen schnell (nicht das schnellste vermute ich allerdings, aber auch nicht übel), aber auch nur wenn man die Vertauschung als Kostenfunktion her nimmt. Es werden trotzdem noch N*(N-1)/2 Vergleiche gebraucht! Binary search dagegen braucht nur log(N) Vergleiche (im worst-case(!)).
Die Frage am Ende ist ja hier: Brauche ich die Liste nur ein Mal am Ende sortiert, oder brauche ich sie die ganze Zeit sortiert während Einträge kommen und gehen? Im ersten Fall ist ein einmaliger Quicksort nach Befüllen sicherlich die schnellere und bessere Wahl, im zweiten ganz klar eine (gute) Suche. Aber das so zu mischen... kann man auf ein paar zig bis hundert Elementen mal machen aus Faulheit, aber eigentlich gehört das bestraft

Ein wenig versalzen tut man sich das alles aber wenn man diese schmucken Listen auf Array-Basis benutzt, da hier das Einfügen im worst-case (an Index 0) eine O(N) Operation ist, und u.U. gleich noch Speicherallokation + Umkopieren auslöst. Eine Double-Linked-List ist bei sehr vielen Elementen wohl das leichtgewichtigste, was man sich aber durch den Verlust des wahlfreien Zugriffs erkaufen muss. Ab dann muss eben traversiert werden, aber in der Regel geht man ja eh mit Schleifen über Listen - da tut's dann nicht weh statt "Liste[i]" mal "CurrentElement := CurrentElement.Next" zu schreiben.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: in sortierte liste sortiert einfügen

  Alt 8. Sep 2009, 19:09
Hallo,

Zitat:
Was du machst würde ich glatt als Verbrechen bezeichnen!
höhö,

jaja, der gute alte Code.

Bei neuen Code wird es per order by vorsortiert.

TJAAAAAAA, WIR WAREN ALLE MAL JUNG


Ich habe hier nen generischen Suchalg (ähnlich wie TList.CustomSort),
vielleicht erweitere ich den noch um ein SortedInsert.


Heiko
Heiko
  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 08:04 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