Algorithmus zum Finden von Buchstabenkombinationen
spacer
Autor Nachricht
bfelix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 61

WIN 2000 Prof., Win XP Prof., Win 7 Starter und Prof., SuSe Linux 11.3,
Delphi 7 Pers.
BeitragVerfasst: Di 22.03.11 17:00 
Hallo Community,
ich würde gerne einen Algorithmus machen, der alle Buchstaben Kombinationen aus einem bestimmten Vorratsstring mit einer bestimmten Länge findet. Mein Ansatz:
1. Length(vorrat)^(Anzahl Buchstaben-1) mal die Zeichen von vorrat hintereinanderschreiben in TStrings: (dabei hoch eine eigene Funktion zur Potenz, vorrat der Vorratsstring und laenge die Länge der Ausgabestrings)
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
for i:=0 to hoch(Length(vorrat,laenge-1)) do begin
for j:=1 to Length(vorrat) do begin
strs.Items.Add(vorrat[j]);
end;
end;


2. Weiter fällt mir leider nichts ein...

Kann mir irgendwer wenigstens einen Ansatz geben?

Danke im Vorraus,
BFelix
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Chrischuh
ontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic starofftopic starofftopic star
Beiträge: 124
Erhaltene Danke: 1

Win 7
Turbo Delphi
BeitragVerfasst: Di 22.03.11 17:17 
Hi,

meinst du mit deiner Beschreibung Anagramme? Was soll dein Algorithmus können? Könntest du ein Beispiel für einen Vorratsstring geben? Und was der Algorithmus daraus machen soll?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Luckie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 11803
Erhaltene Danke: 146

WindowsXP Professional SP2
BDS2006, VS C++ Express, Eclipse (Java), Flex (Flash, AS)
BeitragVerfasst: Di 22.03.11 17:25 
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function MaxKombinations(Len: integer; const Chars: string): Int64;
var
Factor : Int64;
begin
Result := 0;
Factor := 1;
while Len > 0 do
begin
dec(Len);
Result := Result + Factor;
Factor := Factor * Length(Chars);
end;
end;

function BruteForce(Nb: Int64; Chars: string): string;
begin
Result := '';
while Nb > Length(Chars) do
begin
dec(Nb);
Result := Chars[Nb mod Length(Chars) + 1] + Result;
Nb := Nb div Length(Chars);
end;
if Nb > 0 then
Result := Chars[Nb] + Result;
end;

Aufruf mit:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
MaxChars := MaxKombinations(MinLen, Chars);
while (length(s) <= Maxlen) and (not Terminate) do
begin
s := BruteForce(MaxChars, Chars);

_________________
Gruß Michael
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
bfelix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 61

WIN 2000 Prof., Win XP Prof., Win 7 Starter und Prof., SuSe Linux 11.3,
Delphi 7 Pers.
BeitragVerfasst: Di 22.03.11 17:43 
Könntest du mir mal kurz beschreiben was genau der Code macht und was die Parameter bedeuten??

Danke,
BFelix
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
bfelix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 61

WIN 2000 Prof., Win XP Prof., Win 7 Starter und Prof., SuSe Linux 11.3,
Delphi 7 Pers.
BeitragVerfasst: Di 22.03.11 17:56 
Gut, ich habe jetzt noch einen Ansatz:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
for i:=1 to Length(vorrat) do begin
for j:=1 to Length(vorrat) do begin
for u:=1 to Length(vorrat) do begin
for m:=1 to Length(vorrat) do begin
erg:='';
erg:=erg+vorrat[i];
erg:=erg+vorrat[j];
erg:=erg+vorrat[u];
erg:=erg+vorrat[m];
erg1.Add(erg);
end;
end;
end;
end;

Dabei ist erg ein String und erg1 eine Stringliste für das Ergebnis
Es bibt dann ja eine Liste mit allen Kombinationen mit 4 Buchstaben aus.
Aber wie kann ich das so in einer Schleife verpacken, dass es alle Kombinationen mit der Länge x ausgibt??

Danke,
BFelix
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Chrischuh
ontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic starofftopic starofftopic star
Beiträge: 124
Erhaltene Danke: 1

Win 7
Turbo Delphi
BeitragVerfasst: Di 22.03.11 18:55 
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Kombinationen(Vorrat: string; laenge: Integer; Zwischenspeicher: string; Liste: TStrings);
var i:integer;s:string;
begin
dec(laenge);
for i := 1 to length(vorrat) do
begin
s:=Zwischenspeicher + Vorrat[i];
if laenge>0 then Kombinationen(vorrat,laenge, s, liste) else
liste.Add(s);

end;

end;


Das ist die Prozedur. Hoffe das ist so richtig.
So ist der Aufruf:

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.Clear;
Kombinationen(edit1.Text,4,'',Memo1.Lines);
end;


bzw

ausblenden Delphi-Quelltext markieren
1:
Kombinationen(Vorratsstring,Maximale_länge,'',Ziel_TStrings);


Hoffe das ist das was du suchst.

Es wird jedes mögliche zeichen an den Anfang gesetzt. Und dann wird die Funktion einfach solange erneut aufgerufen, bis die strings lang genug sind.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home