Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Codelibrary Mengenoperation, Änderungsvorschlag? (https://www.delphipraxis.net/208827-codelibrary-mengenoperation-aenderungsvorschlag.html)

Monday 18. Sep 2021 10:58

Codelibrary Mengenoperation, Änderungsvorschlag?
 
Hi,

eine Anmerkung bzw. Frage zu diesen Beitrag in der Code-Library:

https://www.delphipraxis.net/20262-m...inglisten.html

Müsste diese Funktion


Delphi-Quellcode:
procedure DifferenceStrings(const a, b, diff: TStrings);
var
  i, idx : Integer;
begin
  Assert(Assigned(a));
  Assert(Assigned(b));
  Assert(Assigned(diff));
  diff.BeginUpdate;
  try
    diff.Assign(a);
    for i := 0 to b.Count -1 do
    begin
      idx := diff.IndexOf(b.Strings[i]);
      if idx >= 0 then
        diff.Delete(idx);
    end;
  finally
    diff.EndUpdate;
  end;
end;

Nicht korrekterweiße so aussehen?

Delphi-Quellcode:
procedure DifferenceStrings(const a, b, diff: TStrings);
var
  i, idx : Integer;
begin
  Assert(Assigned(a));
  Assert(Assigned(b));
  Assert(Assigned(diff));
  diff.BeginUpdate;
  try
    diff.Assign(a);
    for i := 0 to b.Count -1 do
    begin
      idx := diff.IndexOf(b.Strings[i]);
      if (idx >= 0) and (i < idx) then begin
        diff.Delete(idx);
      end;
    end;
  finally
    diff.EndUpdate;
  end;
end;

LG

Andreas13 18. Sep 2021 17:54

AW: Codelibrary Mengenoperation, Änderungsvorschlag?
 
Hallo Monday,
nein, der Original-Code ist korrekt, denn nach https://www.delphipraxis.net/20262-m...inglisten.html kopiert die Routine a ohne b nach diff:
Zitat:

* NAME: DifferenceStrings
* DESC: kopiert Menge a OHNE Menge b nach diff
* EXAMPLE: a = ['Porsche', 'Daimler', 'BMW', 'Ferrari']
* b = ['VW', 'BMW', 'Fiat', 'Volvo', 'Smart']
* diff = ['Porsche', 'Daimler', 'Ferrari']
Hierbei werden Elemente von a, die auch in b vorkommen, aus der Kopie diff nach dem Kopieren gelöscht. In der Schleife
Delphi-Quellcode:
  for i := 0 to b.Count -1 do
  begin
    idx := diff.IndexOf(b.Strings[i]);
    if idx >= 0 then
      diff.Delete(idx);
  end;
ist idx die Position des eventuellen Duplikats in diff, und diese ist immer kleiner oder gleich als b.Count -1, was dem Element mit dem höchsten Index entspricht. diff.Count - 1, was dem Element mit dem höchsten Index in diff entspricht.

Gruß, Andreas

[Edit]
Anstelle von
Delphi-Quellcode:
if idx >= 0 then
verwende ich generell den – nach meiner Meinung etwas schnelleren - Vergleich
Delphi-Quellcode:
if idx > -1 then
, aber das ist nur Schnickschnack.

freimatz 20. Sep 2021 12:36

AW: Codelibrary Mengenoperation, Änderungsvorschlag?
 
Sehe da nicht so den grossen Unterschied:
Code:
Testpas.247: if Idx >= 0 then
4B0F08B8 837DFC00         cmp dword ptr [ebp-$04],$00
4B0F08BC 7C05             jl $4b0f08c3
Testpas.249: if Idx > -1 then
4B0F08C3 837DFCFF        cmp dword ptr [ebp-$04],-$01
4B0F08C7 7E05             jle $4b0f08ce

Andreas13 22. Sep 2021 13:05

AW: Codelibrary Mengenoperation, Änderungsvorschlag?
 
Hallo Freimatz,
ich sagte doch, es ist Schnickschnack. Aber gemeint habe ich nicht die konkrete Umsetzung von Delphi, sondern die interne Implementierung der Prozessorbefehle "Kleiner" jl und "Kleiner oder gleich" jle. Nach meinen Tests liegt hier ein geringer Geschwindigkeitsvorteil für jl von maximal bis zu 2 % vor. Also nicht die Rede wert...
Gruß, Andreas


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz