Einzelnen Beitrag anzeigen

Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#24

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 13:05
Machs doch so [..]
Stimmt. Nochmal zum Geschwindigkeitsproblem. Ob einfache Schleife plus Quicksort schneller ist als Summe N Durchläufe wage ich allerdings zu bezweifeln. Ich lass es aber jetzt erst mal so. Von Hashmaps hab ich leider keine Ahnung und auch leider Keine Zeit weiter hieran zu arbeiten. Thanx!
Delphi-Quellcode:
function TFloatPoints.SortCompare(const I, J: integer): integer;
const
  Eps = 1E-4;
begin
  Result := CompareValue(FItems[I].X, FItems[J].X, Eps);
  if Result = 0 then
    Result := CompareValue(FItems[I].Y, FItems[J].Y, Eps);
end;

procedure TFloatPoints.QuickSort(L, R: integer);
var
  I, J, K: integer;
begin
  repeat
    I := L;
    J := R;
    K := (L + R) shr 1;
    repeat
      while SortCompare(I, K) < 0 do
        Inc(I);
      while SortCompare(J, K) > 0 do
        Dec(J);
      if I <= J then
      begin
        Exchange(I, J);
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSort(L, J);
    L := I;
  until I >= R;
end;

procedure TFloatPoints.Sort;
begin
  if FCount > 1 then
    QuickSort(0, FCount - 1);
end;

(*
procedure TFloatPoints.RemoveDoubles;
var
  I, J: integer;
begin
  for I := FCount - 2 downto 0 do
    for J := FCount - 1 downto I + 1 do
      if Util_SameFloatPoint(FItems[I], FItems[J]) then
        Delete(J);
end;
*)


procedure TFloatPoints.RemoveDoubles;
var
  I: integer;
begin
  Sort;
  for I := FCount - 1 downto 1 do
    if Util_SameFloatPoint(FItems[I], FItems[I - 1]) then
      Delete(I);
end;
  Mit Zitat antworten Zitat