Dann versuch doch mal folgenden Trick - sollte lineare Laufzeit bringen:
Delphi-Quellcode:
var
i: integer;
idx: Integer;
refArray: array of Integer;
ref: Integer;
start, dauer: Cardinal;
begin
start := GetTickCount();
setlength(optvarrayindfirst, sl.Count);
setlength(refArray, sl.Count);
slopt.Clear;
slopt.Sorted := true;
slopt.Duplicates := dupIgnore;
{ als Referenz wird die Position im Original gespeichert }
for i := 0 to sl.Count - 1 do begin
{ nur wenn der String noch nicht existiert, wird Objects belegt }
idx := slopt.AddObject(sl[i], TObject(i));
optvarrayindfirst[i] := Integer(slopt.Objects[idx]);
end;
{ Hier wird ein temporäres Array zum Auflösen der Referenzen angelegt }
for I := 0 to slopt.Count - 1 do begin
ref := Integer(slopt.Objects[I]);
refArray[ref] := I;
end;
{ Nun könnnen wir die Referenzen auflösen }
for I := 0 to Length(optvarrayindfirst) - 1 do begin
optvarrayindfirst[I] := refArray[optvarrayindfirst[I]];
end;
dauer := GetTickCount() - start;
Panel2.Caption := 'reduziert auf ' + inttostr(slopt.Count) + ' hat ' + floattostr(dauer / 1000)
+ ' Sekunden gedauert';
end;