AGB  ·  Datenschutz  ·  Impressum  







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

Funktion schneller machen?

Ein Thema von Paul Schmidt · begonnen am 2. Mär 2006 · letzter Beitrag vom 3. Mär 2006
Antwort Antwort
Paul Schmidt

Registriert seit: 7. Feb 2006
22 Beiträge
 
#1

Funktion schneller machen?

  Alt 2. Mär 2006, 21:54
Hallihallo

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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Funktion schneller machen?

  Alt 2. Mär 2006, 22:25
Einfach: Verwendung von sortierten Stringlisten
Komplizierter: Verwendung von B-Tree's
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Funktion schneller machen?

  Alt 2. Mär 2006, 22:43
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;
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: Funktion schneller machen?

  Alt 3. Mär 2006, 06:31
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
  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 12:52 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