Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
Delphi 10.4 Sydney
|
AW: Doppel schnell aus Lise löschen.
8. Dez 2014, 13:05
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;
|
|
Zitat
|