Zitat von
Khabarakh:
Zitat von
Nelphin:
ein mittelgroßer datensatz hat 20 minuten gebraucht um von 122760 zeilen auf 20438 zeilen runtergekürzt zu werden...
Bei O(n²) kein Wunder
. Um auf lineare Laufzeit zu kommen, musst du dein Indexarray durch eine Hashmap ersetzen:
http://www.delphipraxis.net/internal...ct.php?t=53653
erstmal danke für die Antwort!
ich dachte schon ich hätte einen trick gefunden mein indexarray nach dem sorted dupignore kram mit dieser procedure nachträglich zu erstellen:
Delphi-Quellcode:
procedure TForm1.Button21Click(Sender: TObject);
var i,g:integer;
var tauscher:integer;
var start,dauer:Cardinal;
begin
start := GetTickCount();
slopt.Sorted:=false;
setlength(optvarrayindfirst,sl.count); //länge vom indexarray festlegen
for g := 0 to sl.Count - 1 do
optvarrayindfirst[g]:=9999999; // sinnloses befüllen damit mich die 0en nicht verwirren... kann später entfallen.
for i := 0 to slopt.count -1 do begin
tauscher:=sl.indexof(slopt[i]); // prüfen wo der eintrag in der alten liste stand
while tauscher<>-1 do begin
optvarrayindfirst[sl.indexof(slopt[i])]:=i; //im listarray an die gefundene stelle die stelle der neuen liste geben
sl[sl.indexof(slopt[i])]:= 'tausch tausch';// damit beim zweiten indexof nicht die selbe stelle gefunden wird
tauscher:=sl.indexof(slopt[i]);// nächste stelle suchen
end;
end;
dauer := GetTickCount() - start;
panel2.Caption:='Listindex nachziehn hat '+floattostr(dauer/1000)+' Sekunden gedauert';
end;
aber das gleiche problem... funktioniert bei kleinen datenmengen gut, aber bei großen zu langsam.
also werde ich mir morgen das mit den hashlists mal anschaun *seufz* komplettes WE weg und nix hinbekommen...