![]() |
Komplette Kombinationsmöglichkeiten einer Zahl ausgeben
Ich habe eine Zahl die aus x Zahlen besteht. Keiner dieser Ziffern is doppelt!
Bespiel: 123 Ausgabe( 123, 132, 312, 321, 231, 213) Aber das ganze wird 4, 5, 6 oder mehr zahlen schon komplizierter! Wie bekomm ich nun alles in einen schönen Algorhitmus? |
Re: Komplette Kombinationsmöglichkeiten einer Zahl ausgeben
hi!
schreit nach einem recursiven algorithmus. ist die einfachste moeglichkeit. laesst sich aber auch ueber dancing links loesen (wahrscheinlich die schnellste methode) ( siehe ![]() MfG Flo |
Re: Komplette Kombinationsmöglichkeiten einer Zahl ausgeben
Also ich habe mir den Text mal durchgelesen (Dancing Links) und ich muss sagen, dass ich damit recht wenig anfangen kann, könntest du das vielleicht auf deutsch erklären? Diese Frage interessiert mich nämlich auch :-D
Flare |
Re: Komplette Kombinationsmöglichkeiten einer Zahl ausgeben
hi!
das ganze zu uebersetzten ueberschreitet sowohl meine zeit wie auch meinen englischwortschatz ;) nach dem text DLX zu verstehen ist auch imho nicht recht einfach. mir hat das hier (am beispiel sudoku): ![]() MfG Flo |
Re: Komplette Kombinationsmöglichkeiten einer Zahl ausgeben
Ich habe es immer als ein Permutationsproblem verstanden. Hier ein modernisierter TP1 Code zum Erstellen aller Kombinationen n aus m:
Delphi-Quellcode:
Der passende Aufruf zu deinem Beispiel:
procedure Permute(Head, Tail: String; s: TStrings; const size: Integer);
var i: Integer; Newhead, Newtail: String; begin for i := 1 to Length(Tail) do begin Newhead := Head + Tail[i]; Newtail := Tail; Delete(NewTail, i, 1); if (Newtail = '') or (Length(Newhead) = size) then s.Add(NewHead) else Permute(Newhead, Newtail, s, size); end; end;
Delphi-Quellcode:
Hier in der DP habe ich auch schon nicht-rekursive Lösungen gesehen.
begin
sNumber := '123'; s := TStringList.Create; Permute('', sNumber, s, Length(sNumber)); WriteLn(s.Text); s.Free; end; Grüße vom marabu |
Re: Komplette Kombinationsmöglichkeiten einer Zahl ausgeben
Hi marabu,
die hier ist nett:
Delphi-Quellcode:
Sie (die Funktion, oder Er, der Algorithmus) erzeugt direkt die n.te Permutation einer Zeichenkette mit x Buchstaben (n=0..x!-1). Sie mischt die Eingabezeichenfolge einfach in einer wohldefinierten Form, herrlich!
Function NthPermutation (const aString : AnsiString; aCount : Cardinal) : String;
Var pos, i, n : Cardinal; c : char; Begin n := Length(aString); result := aString; for i := n downto 2 do begin pos := acount mod i +1; c := result[i]; result[i] := result[Pos]; result[Pos] := c; acount := acount div i; End; End; Ich habe noch Einen: Permutationen ordnen, die Ordnungszahl in eine Zahl mit variabler Basis umwandeln, davon die Inverse (das sind Graycodes) und das dann umgekehrt implementieren, ergibt einen ziemlich perversen Algorithmus. :wiejetzt: Hier die Herleitung: Man kann Permutationen aufzählen. Dazu schreibt man alle Permutationen auf. Anschließend schreibt man neben jede Permutation den Inverse-Code: Für jedes Zeichen wird die Anzahl der Zeichen gezählt, die rechts vom Zeichen vorkommen und größer sind. Jede Stelle i (1..n) dieses Codes wird nun mit (i-1)! multipliziert (von rechts zählen). Wir erhalten die Zahlen von 0 bis n!-1 (n=Anzahl der Stellen). Damit haben wir eine Ordnung auf den Permutationen und können auch die 519.te Permutation ermitteln.
Delphi-Quellcode:
Function NthPermutationViaInverse (aString : String; aCount : Integer) : String;
Var d : Array Of Integer; g, i, n : Integer; Begin n := Length (aString); setlength (d, n); d[1] := 1; For i := 2 to n - 1 do d[i] := i * d[i-1]; Result := ''; for i := n-1 downto 1 do begin g := (aCount div d[i]) + 1; Result := Result + aString[g]; delete (aString, g, 1); aCount := aCount mod d[i]; End; Result := Result + aString; End; |
Re: Komplette Kombinationsmöglichkeiten einer Zahl ausgeben
Hallo alzaimar,
drei zwei eins - und meins - wenn du nichts dagegen hast. Wer weiß wofür ich das mal brauchen kann. Grüße vom marabu |
Re: Komplette Kombinationsmöglichkeiten einer Zahl ausgeben
Das ist gut, dann kann man ja bei einem BruteForce sagen, ich will da und da anfangen. Das könnte ich bei meinem PasswordRecover benutzen, um irgendwo zu unterbrechen und dort später dann weitermachen. Das muss ich mir noch mal durch den Kopf gehen lassen. :gruebel:
Nur wie bekommt man die Gesamtzahl aller Möglichkeiten raus? |
Re: Komplette Kombinationsmöglichkeiten einer Zahl ausgeben
@marabu: Bedien Dich!
@Luckie: n! (n=Anzahl der Stellen) Beweis: IA. Bei einer Stelle gibt es eine Möglichkleit (q.e.d) IB. Bei n-1 Stellen gibt es (n-1)! Möglichkeiten. (unbewiesen, aber Annahme) IS. Nehme ich eine Stelle hinzu, kann ich die an jeder der n Stellen der bisherigen Kombinationen einfügen. Das ergibt summa summarum n* [(n-1)!] = n! Möglichkeiten. (q.e.d) |
Re: Komplette Kombinationsmöglichkeiten einer Zahl ausgeben
Unter der Annahme, dass ein Zeichen nur einmal vorkommen kann und auch mindestens einmal vorkommen muss. Also wäre 322 eine ungültige Kombination.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz