Thema: Delphi Permutationen erzeugen

Einzelnen Beitrag anzeigen

Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

Permutationen erzeugen

  Alt 1. Feb 2006, 14:12
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]
Angehängte Dateien
Dateityp: rar perm_167.rar (1,5 KB, 243x aufgerufen)
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat