AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi TStringlist: Performance & sort/sorted Frage
Thema durchsuchen
Ansicht
Themen-Optionen

TStringlist: Performance & sort/sorted Frage

Ein Thema von kurtm1 · begonnen am 16. Mär 2009 · letzter Beitrag vom 16. Mär 2009
Antwort Antwort
kurtm1

Registriert seit: 13. Dez 2003
348 Beiträge
 
#1

TStringlist: Performance & sort/sorted Frage

  Alt 16. Mär 2009, 15:52
Habe mal eine generelle Frage zur Performance bzw. Verwendung der TStringlist.

Ziel ist es möglichst performant nach der Reihe eine Vielzahl an Elementen einzufügen und am Ende eine sortierte Liste zu erhalten. Generell gibts es zwei mögliche Ansätze:
1. Alle Elemente mit ".Add" einfügen und danach alle mittels ".Sort" sortieren
2. Die Stringlist auf ."Sorted:=true" setzen, womit die Stringlist zu jedem Zeitpunkt / Add Vorgang immer korrekt sortiert ist

Gehe ich richtig in der Annahme, dass Möglichkeit 1 schneller ist, da nicht nach "jedem" Add sortiert wird (oder ist es die 2. Option, da dort laut Delphi Hilfe immer an der alphabetisch korrekten Stelle eingefügt wird)?
  Mit Zitat antworten Zitat
Benutzerbild von hazard999
hazard999

Registriert seit: 2. Okt 2008
38 Beiträge
 
#2

Re: TStringlist: Performance & sort/sorted Frage

  Alt 16. Mär 2009, 15:58
Guck dir einfach die O-Notation für den Avarage-Case an.

1. N + N * LD N
2. Summe von 1 BIS N für X von LD X
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: TStringlist: Performance & sort/sorted Frage

  Alt 16. Mär 2009, 15:58
Bei dieser Frage eindeutig die zweite, denn es wird natürlich nicht jedesmal neu sortiert.

Allerdings ist eine TStringList sicher nicht die performanteste Lösung, die ist nur die einfachste Lösung, wenn man selbst sich nicht zu viele Gedanken drüber machen will.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
hoika

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

Re: TStringlist: Performance & sort/sorted Frage

  Alt 16. Mär 2009, 16:01
Hallo,

also ich sage, die 1. ist einfacher.

Es ist einfacher, zuerst alle Einträge per Add hinzuzufügen
und zum Schluss zu sortieren.

Im zweiten Fall wird ja der Einfüge-Index gesucht.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von hazard999
hazard999

Registriert seit: 2. Okt 2008
38 Beiträge
 
#5

Re: TStringlist: Performance & sort/sorted Frage

  Alt 16. Mär 2009, 16:03
@hoika:

Bitte begründen, in wie fern einfacher?
  Mit Zitat antworten Zitat
hoika

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

Re: TStringlist: Performance & sort/sorted Frage

  Alt 16. Mär 2009, 16:33
Hallo,

einfacher von der Performance her,
also schneller.


Heiko
Heiko
  Mit Zitat antworten Zitat
kurtm1

Registriert seit: 13. Dez 2003
348 Beiträge
 
#7

Re: TStringlist: Performance & sort/sorted Frage

  Alt 16. Mär 2009, 19:28
hmm also (noch) keine eindeutige Antwort..
  Mit Zitat antworten Zitat
hoika

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

Re: TStringlist: Performance & sort/sorted Frage

  Alt 16. Mär 2009, 20:03
Hallo,

probier es einfach aus.
10.000 Einträge und testen.


Heiko
Heiko
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: TStringlist: Performance & sort/sorted Frage

  Alt 16. Mär 2009, 20:09
Übrigens geht es noch viel schneller: Es gibt eine Datenstruktur ('Skiplist'), die sehr schnell eine sortierte Liste aufbaut. Anstatt also die Strings in eine Stringlist einzufügen und dann zu sortieren, füge ich sie in die Skiplist ein und lese die Liste anschließend aus.
Ergebnis: Viel viel schneller als Quicksort (QS ist vom Aufwand O(n log n), Die Skiplist-Version ist O(n)...
(1000ms vs. 70ms bei 100000 Strings)

Hier der Code:
Delphi-Quellcode:
Var
  sKey : String;
  sSkipList : TcsSkipList; // <-- The magic Listenstruktur
  slData : TStringList;
  i : Integer;

Begin
  slData := TStringlist.Create;
  sSkipList := TcsStringSkipList.Create(16);
  Try
    for i:=0 to 100000 do
      sSkipList.Insert(intToStr (100000 - i),nil);
    sSkipList.First;
    While not sSkipList.EndOfList do begin
      sSkipList.CurrentData(sKey,nil);
      slData.Add(sKey);
      sSkipList.Next;
    End;
  Finally
    sSkipList.Free;
  End;
...
End;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:01 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