Delphi-PRAXiS
Seite 2 von 7     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   String in TStringList finden verschnellern? (https://www.delphipraxis.net/191366-string-tstringlist-finden-verschnellern.html)

himitsu 7. Jan 2017 16:11

AW: String in TStringList finden verschnellern?
 
Das Tempo ist da logarithmisch und nicht linear.

* jeden Eintrag durchsuchen, also im Durchschnitt 50% aller Einträge, bis man was findet.
* die binäre Suche ist für Sortiertes optimiert, da man beim Vergleich sofort weiß, ob man was getroffen hat und wenn nicht, ob es vor oder hinter dem Eintrag zu finden ist

bei 1000 Einträgem
* linear = durchschnittlich 500 Vergleiche
* binär = maximal 10 Vergleiche


Zusätzlich noch CaseSensitive=True.
Dateinamen sind zwar CaseSensitive=False, aber wenn du außerhalb AnsiUpperCase/FileNameUpperCase machst, dann muß das die Liste nicht mehr bei jedem Eintrag machen.
Beim Dictionary gibt es auch welche, die CaseInsensitiv den Hash berechnen und das dann ebenfalls nicht mehr bei jedem Eintrag machen müssen, während der Suche.

a.def 7. Jan 2017 16:26

AW: String in TStringList finden verschnellern?
 
Zitat:

Man fängt in der Mitte an und schaut, ob der Suchwert größer oder kleiner ist.
Das erinnert mich an ein kleines Spiel, welches ich zu Schulzeiten in Java geschrieben habe. Dabei ging es um das Erraten einer Zahl.

Nun habe ich es verstanden.

himitsu 7. Jan 2017 17:40

AW: String in TStringList finden verschnellern?
 
Darum auch Binär (Zwei), weil man dort immer alles halbiert.

Die maximal nötigen Vergleiche, bis man einen Eintrag gefunden hat, sind auch "zufällig" immer Zweiterpotenzen.

...
65 bis 128 = maximal 7 Vergleiche
129 bis 256 Werte = maximal 8 Vergleiche
257 bis 512 Werte = maximal 9 Vergleiche
513 bis 1024 Werte = maximal 10 Vergleiche
...

mjustin 7. Jan 2017 18:06

AW: String in TStringList finden verschnellern?
 
Wäre eine Lösung mit TDictionary (Generics.Collections) nicht wesentlich schneller, wenn die Anzahl wie angegeben in die Hunderttausende geht?

himitsu 7. Jan 2017 18:13

AW: String in TStringList finden verschnellern?
 
Wurde schon erwähnt.

TDictionary ist eine sortierte Hash-Liste mit binärer Suche.

p80286 7. Jan 2017 18:28

AW: String in TStringList finden verschnellern?
 
Zitat:

Zitat von nahpets (Beitrag 1358330)
In 'ner sortierten Liste wird allerdings mit Find gesucht.

Gleicher Aufruf, unterschiedliches Verhalten, das liebe ich.

Gruß
K-H

a.def 7. Jan 2017 18:44

AW: String in TStringList finden verschnellern?
 
Was haltet ihr denn davon. Ist das eine Lösung?
Speeding Up Delphi's TStringList.IndexOf

Ich nutze nun

Delphi-Quellcode:
function IndexOfListObjects(const sTmp: string; List: TStringListEx): Integer;
begin
 // for Result := 0 to List.Count - 1 do
 // if sTmp = PFileListEntry(List.Objects[Result])^.sFileName then

 if not List.Find(sTmp, Result) then
  Result := -1;
end;

himitsu 7. Jan 2017 19:03

AW: String in TStringList finden verschnellern?
 
Zitat:

Delphi-Quellcode:
function TStringList.IndexOf(const S: string): Integer;
begin
  if not Sorted then Result := inherited IndexOf(S) else
    if not Find(S, Result) then Result := -1;
end;

Wenn deine Liste also Sortiert ist, ergibt es das. :roll:
Delphi-Quellcode:
function TStringList.IndexOf(const S: string): Integer;
begin
  if not Find(S, Result) then
    Result := -1;
end;

a.def 7. Jan 2017 19:24

AW: String in TStringList finden verschnellern?
 
Einziger Unterschied den ich gerade erkennen konnte ist, dass die offizielle Fassung von Find () CompareStrings aufruft, die inoffizielle CompareStr().
Sonst ist alles gleich. Hätte ich mal vorher gucken sollen.

haentschman 8. Jan 2017 06:28

AW: String in TStringList finden verschnellern?
 
Moin...8-)

Was ich nicht verstehe, das du dich gegen das angesprochene TDictionary, jedenfalls habe ich es nicht gesehen, wehrst... :gruebel: Das ist genau das für den Einsatzzweck gut ist... als das rumgeeiere mit der Stringlist... :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.
Seite 2 von 7     12 34     Letzte »    

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