Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#10

Re: Daten auf Einzigartigkeit überprüfen...

  Alt 14. Dez 2009, 01:14
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;
Uwe Raabe
  Mit Zitat antworten Zitat