Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Algorithmen (https://www.delphipraxis.net/28-library-algorithmen/)
-   -   Delphi Permutationen erzeugen (https://www.delphipraxis.net/62221-permutationen-erzeugen.html)

glkgereon 1. Feb 2006 14:12


Permutationen erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Ich habe aus Eigenbedarf eine kurze Funktion geschrieben, um Permutationen zu erzeugen.
Also eigentlich sind es zwei: bei der einen einen sind die Elemente Chars, bei der anderen Strings.
Beispiel:
will man aus 123 die Werte 123,132,213,231,... machen, so ist Funktion 1 richtig
möchte man dagegen aus AB,CD,EF die Werte AB,CD,EF; AB,EF,CD; CD,AB,EF; CD,EF,AB;... machen, so ist Funktion 2 richtig...

Die einzige Methode die ich bisher gesehn hab für die zweite ist von Hagen in der CodeLib...mit Sicherheit deutlich schneller :)
aber erstens glaube ich, das für viele eine StringList deutlich einfacher zu handhaben ist, und zum zweiten ist mein Quellcode deutlich kürzer und daher für viele etwas besser verständlich :)

Die Erste nimmt als Parameter einen String mit den Werten, und gibt eine StringList zurück.
Delphi-Quellcode:
type
  TSL = TStringList;
  TSLArr = array of TSL;

procedure Permute(var Lst: TStringList; const Vals: string; const Akt: string);
var
  i: Integer;
  S: string;
begin
  if Length(Vals) = 0 then
    Lst.Add(Akt) //Permutation fertig
  else
    for i := 1 to Length(Vals) do
    begin
      S := Vals;
      Delete(S, i, 1);
      Permute(Lst, S, Akt + Vals[i]);
    end;
end;
Die Zweite nimmt als Parameter eine StringList mit den Werten, und gibt einen Array of TStringList zurück.

Delphi-Quellcode:
procedure PermuteExt(var Lst: TSLArr; const Vals: TSL; const Akt: TSL);
var
  i: Integer;
  V, A: TSL;
begin
  if Vals.Count = 0 then
  begin
    SetLength(Lst, Length(Lst) + 1);
    Lst[Length(Lst) - 1] := TStringList.Create;
    Lst[Length(Lst) - 1].AddStrings(Akt);
  end
  else
  begin
    V := TSL.Create;
    A := TSL.Create;
    for i := 0 to Vals.Count - 1 do
    begin
      A.Clear;
      A.AddStrings(Akt);
      A.Add(Vals[i]);
      V.Clear;
      V.AddStrings(Vals);
      V.Delete(i);
      PermuteExt(Lst, V, A);
    end;
    V.Free;
    A.Free;
  end;
end;
prinzipiell genau das selbe Raster....

ein Beispiel-Projekt gibt es auch noch dazu (nicht beschweren, Halt mal so schnell gemacht :) )

[edit=Matze]Code formatiert. Mfg, Matze[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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