Java Alphabet Kombinationen erstellen / Mengen korrekt speichern

Schattenfänger

Lt. Junior Grade
Registriert
Nov. 2010
Beiträge
273
Hallo,
ich möchte einen Graphen verkleinern.

Wie der Algorithmus abläuft ist mir klar, allerdings habe ich hier zwei Grobe Probleme ihn umzusetzen.

hier wäre er erklärt, auf der englischen Wiki steht zwar auch einer, aber denn verstehe ich nicht so ganz.

Der Algo funktioniert indem man die Endzustände und Nicht-Endzustände in eigene Mengen schreibt.
Dann mit Wörtern der Länge eins bis n durchgehe und wenn man mit einem Wort innerhalb einer Menge in einen anderen Zustand kommt als mit den anderen wird die Menge geteilt.

1.)
Ich weiß nicht wie ich die Kombinationen erstellen soll.
Ich habe zwar bereits mehrere Schleifen und Rekursionen durchprobiert aber ich komme nicht drauf wie ich die Buchstaben korrekt zusammensetze.
Sagen wir mal ich habe (a,b,c), dann möchte ich von eins bis n:
a,b,c
aa,ab,bb,ba
aaa,aab,bbb,....
Ich komme leider nicht drauf wie ich sowas schreibe.


Die Mengen werden als Set<Set<>> gespeichert.
2.)Wie soll ich die neun Mengen speichern?
Im Moment habe ich drei Schleifen, die zwei Äußeren holen mir die zu betrachtende Menge raus. Die Dritte geht über das Alphabet.
Mir ist leider nicht klar wie ich die Ergebnisse vergleichen soll.
Sagen wir ich habe die Menge (6,7)
6 geht mit a in einen Endzustand, mit b nicht.
7 geht mit a in einen Endzustand, mit b auch. -> unterschiedlich, also trennen.
Also wird die Menge (6,7) aus meinem Set gelöscht und die zwei Mengen 6 und 7 hinzugefügt.
Das einzige was mir eingefallen ist, ist dass ich ja jedes mal die Knoten in eine neue temp-Menge speichern könnte und diese nach abarbeitung dann vergleiche. Aber bei diesem Ansatz kommt es immer darauf hinaus, dass die Anzahl der Mengen so groß wird wie die Anzahl der Wörter.
Sprich 5 mit a nach NichtEnda1
5 mit b nach NichtEndb1
6 mit a nach Enda1
6 mit b nach Nichtenda1
Wenn ich dann aber schon aa,ab, usw habe:
5 mit aa nach endbb
5 mit ab....
Wird irgendwie relativ viel.
Oder sollte ich überhaupt die Alphabet-Schleife nach "draußen" ziehen?

Wäre super wenn mir jemand was zu meinem Problemen sagen könnte.
 
Ich muss ehrlich sagen ich kann dir nur bedingt folgen , Ausschnitte aus dem Code wären hier interessant....

Ansonsten würde ich hoffen , das jemand anderes dein Problem versteht.
 
zu 1) wie die Buchstaben in deinem Alphabet heißen spielt ja keine Rolle, also stell dir vor du zählst einfach im Zahlensystem zur Basis 3 hoch. Also:
Code:
0        0 entspricht a
1        1 entspricht b
2        2 entspricht c
10
11
12
20
21
22
100
101
102
110
111
...
Dazu nimmst du einen normalen Zähler und gibst ihn zur Basis 3 aus.
Code:
for (int i=0; i<27; ++i) {
    System.out.println(Integer.toString(i,3));
}

Edit: Wenn es doch unbedingt a,b und c sein soll muss man die chars noch entsprechend umrechnen. Sollte selbsterklärend sein, wenn man mal einen Blick in die ASCII Tabelle wirft. Dabei sollte einem auch klar werden, dass die Umrechnung in dieser trivialen Form nur mit Alphabeten mit max. 10 Elementen funktioniert.
Code:
for (int i=0; i<27; ++i) {
    StringBuilder base3 = new StringBuilder(Integer.toString(i,3));
    for (int j=0; j<base3.length(); ++j) {
        base3.setCharAt(j, (char)(base3.charAt(j) + 49));
    }
    System.out.println(base3);
 }
Ich hab lange nichts mehr mit Java gemacht, also kann es sein, dass der Code Murks ist obwohl er funktioniert.

2) Dafür bin ich grad zu faul :)
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben