Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktion schneller machen? (https://www.delphipraxis.net/64381-funktion-schneller-machen.html)

Paul Schmidt 2. Mär 2006 21:54


Funktion schneller machen?
 
Hallihallo :-D

Folgendes Problem:

ich habe eine StringList (LISTE1) mit ca. 10.000 Einträgen der Form:

LISTE1:

Key1=Wert1
Key1=Wert2
Key1=Wert3
Key1=Wert4
Key1=Wert5
Key1=Wert6
Key2=Wert1
Key2=Wert2
Key2=Wert3
Key2=Wert4
Key2=Wert5
Key2=Wert6
Key3=Wert1
Key3=Wert2
Key3=Wert3
Key4=Wert1
Key4=Wert2
Key4=Wert3

usw.

D.h.: es gibt mehrere gleichlautende "key"s und dazu jeweils unterschiedliche Werte, wobei die Anzahl der Paare schwankend ist. Also manchmal hat ein key 10 verschiedene Werte und ein anderer key eben nur mal 3 oder so.
Bis hierhin, ok.

Nun habe ich eine weitere Liste (LISTE2) mit ca. 700 Einträgen, die nur aus "key"s besteht, also:

LISTE2:

key1
key3
key4
key8
key11

Jetzt muss ich diese 700 Einträge abarbeiten und in der Liste mit den 10.000 Einträgen schauen, ob der key vorhanden ist und wenn ja, seine entsprechenden Werte "einsammeln".

Bisher hab ich's so gemacht:

Delphi-Quellcode:
for i := 0 to LISTE2.Count -1 do
begin
  if NOT(LISTE1.IndexOfName(LISTE2.Strings[i]) = -1) then
  begin
   
    while NOT(LISTE1.IndexOfName(LISTE2.Strings[i]) = -1) do
    begin
      //schreibe zugehörigen WERT in andere Liste
      LISTE1.Delete(LISTE1.IndexOfName(LISTE2.Strings[i]));
    end;
  end;
end;
So, mit der Methode dauerts halt schon ein paar Sekunden.
Kennt ihr vllt. ne bessere Möglichkeit, um das ganze etwas zu beschleunigen?

Bin für jeden brauchbaren Hinweis dankbar!

Grüße,
der Paule :)

Bernhard Geyer 2. Mär 2006 22:25

Re: Funktion schneller machen?
 
Einfach: Verwendung von sortierten Stringlisten
Komplizierter: Verwendung von B-Tree's

Phantom1 2. Mär 2006 22:43

Re: Funktion schneller machen?
 
Das Problem bei deinem Algorithmus ist das du zuoft IndexOfName verwendest, diese Methode durchsucht die Stringliste jedesmal von vorne!

Probier es mal so hier:
Delphi-Quellcode:
  for i := 0 to LISTE2.Count-1 do
  begin
    for j := LISTE1.Count-1 downto 0 do begin
      if AnsiUpperCase(LISTE2[i])=AnsiUpperCase(Copy(LISTE1[j], 1, Length(LISTE2[i]))) then begin
        //schreibe zugehörigen WERT in andere Liste
        LISTE1.Delete(j);
      end;
    end;
  end;

negaH 3. Mär 2006 06:31

Re: Funktion schneller machen?
 
LISTE1 ist sortiert ?

Dann das Pferd andersrum aufzäumen. Gehe LISTE1 sequentiell durch. Solange der KEY identisch ist alle Werte in einem String extrahieren. Sobald der KEY sich ändert ordnest du nun den String mit den Werten des alten KEY in LISTE2 ein.

So gehst du LISTE1 mit 10000 Werten nur einmalig durch und LISTE2 mit 700 Werten wird sortiert nach KEY sequentiell aufgebaut. Suchen erledigt sich.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 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