Zum Forum springen
Benachrichtigungen
Alles löschen

[Geschlossen] programmiertechnisches problem

6 Beiträge
3 Benutzer
0 Reactions
406 Ansichten
TaZz
Beigetreten: 27.01.2006

Hallo,

ich hab nen problem, wo es mir gerade schwer fällt, dass programmiertechnisch umzusetzen.

folgende ausgangssituation:
- wir haben einen String/Sequenz S mit länge |S|.
- wir haben ein Alphabet ∑ mit |∑| = 20
- wir haben einen Paramater wortlänge |w|

im programm sollen dann alle substrings von S mit länge |w| gebildet werden (kein problem).
dann sollen alle möglichen kombinationen an wörtern aus ∑ mit länge |w| gebildet (also |∑|^|w| kombinationen) und mit dem substring von S verglichen werden - wonach oder wie verglichen wird, ist uninterssant.
die frage ist nun, wie erstelle ich alle möglichen kombinationen. wäre |w| fest, wäre das ganze ja kein problem.
bei |w| = 2 würde man einfach zwei for-schleifen ineinander schachteln und so alle möglichkeiten durchgehen, bei |w| = 3 halt drei for-schleifen. in der innersten schleife würde dann der vergleich durchgeführt werden.

außerdem frage ich mich, ob es sinnvoll wäre, alle möglichen wörter vorher zu erzeugen und abzuspeichern, damit diese nicht für alle möglichen substrings (|S| - |w|) immer wieder neu erstellt werden müssen.
kritisch zu betrachten wäre hier der speicheraufwand, denn für |w| = 4 wären es immerhin schon 160000 kombinationen. aber es wäre auch genauso schlecht, die jedes mal wieder für einen neuen substring neu zu erstellen, was die laufzeit betrifft. gibts da nen guten kompromiss zwischen speicheraufwand und laufzeit?

ps: ich schreib im übrigen in java... vielleicht gibt es hier ja ein paar nützliche klassen oder funktionen, die mir bei der umsetzung helfen könnten.


5 Antworten
xXReDruMXx
Beigetreten: 09.02.2007

ohne alles gelesen zu haben: klingt nach rekursion


TaZz
Beigetreten: 27.01.2006

ja stimmt... mittels rekursion wäre es sicherlich umsetzbar... nur meist sind rekursionen ziemlich unschön, was laufzeiten betrifft. ergo vorher einmal durchführen, um alle möglichen kombinationen zu erstellen?
vielleicht noch nen eleganteren vorschlag?


TaZz
Beigetreten: 27.01.2006

ok, das ganze ist jetzt implementiert mittels rekursion...
wenn trotzdem jemanden noch was einfällt, immer her damit...


OriEy
Beigetreten: 24.08.2006

Also ich hätte das so gemacht:

Du maschst ein int array mit |w| einträgen und belegst es mit Nullen.
Dann in einer whileschleife wird das array "hochgezählt" wie ein Kilometerzähler, d.h. wenn ein eintrag 20 werden würde, wirds auf null gesetzt und der nächste eintrag dafür erhöht.
Die whileschleife wird durchlaufen bis alle einträge 19 sind.
immer wenn hochgezählt wurde wird das array ausgelesen und jedem eintrag ein element aus dem alphabet zugeordnet.

Weis nicht ob das verständlich war, aber bei bedarf kann ich ja noch ein beispiel dazu machen.


TaZz
Beigetreten: 27.01.2006

ich habs verstanden und ist nen interessanter ansatz. :)
aber ist mir jetzt dann ehrlich gesagt doch nicht mehr wert, die rekursion zu ersetzen.
danke trotzdem...


Teilen: