AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Algorithmen Delphi Permutationen erzeugen
Thema durchsuchen
Ansicht
Themen-Optionen

Permutationen erzeugen

Ein Thema von glkgereon · begonnen am 1. Feb 2006
Antwort Antwort
Benutzerbild von glkgereon
glkgereon

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

Permutationen erzeugen

  Alt 1. Feb 2006, 15: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, 244x aufgerufen)
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 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