Rekursion aufteilen
-
@Th
printf ist nur testweise und tut nicht weh, selbst wenn ich es nur alle 10000 durchläufe ausgebe ist das ein witz. um strlen zu ersetzen kenne ich leider keine bessere lösung.klar bei 4 zeichen ist das ein witz, jedoch da es N sein sollen kann es bei 7 zeichen schon EXTREM lange dauern, nämlich mehrere stunden auf nem 1,6 Quad Core. Die Zeit wächst exponenziell an. Wie ich schon sagte: N Zeichen, nicht immer 4!
Dazu geht es mir nicht um die Ausgabe, da die nur Testweise ist. Ob das Programm nun verkompliziert wird ist mir relativ egal. Wenn ich über 10 stunden brauche um eine länge von 20 Zeichen durchzuhasseln auf einem Prozessor (wo 4 sind), ist das nicht mehr akzeptabel. 3,3 Stunden schon eher. Daher bitte keine Debatte um so etwas.
@fdsfsd
da ich geschrieben habe, das mir keine bessere lösung einfällt, ist dein posting das letzte.@(D)Evil
Ich kann dir leider noch nicht folgen... Hast du das Programm überhaupt gestartet?Nochmals danke für jede Hilfe.
-
vor ner weile gabs schon mal das gleiche problem und lösungen dazu die an beliebiger stelle gestartet werden können
-
fdsfsd schrieb:
vor ner weile gabs schon mal das gleiche problem und lösungen dazu die an beliebiger stelle gestartet werden können
wärest du so nett und könntest link geben? mit der suchfunktion mit den stichworten "rekursion" finde ich kein topic dazu.
-
Ist denn die Reihenfolge der Abarbeitung egal?
Ich tippe darauf, daß du einen Serien-Nummer-Cracker schreiben willst -)Dann unterteil deine rekursive Funktion in zwei, die erste durchläuft einfach jeweils das erste Zeichen für genau 1/4 des Bereichs (38/4), und die untergeordnete für alle weiteren Positionen alle Zeichen (so wie bisher).
Und dann startest du 4 Threads mit jeweils dem passenden Bereich (je nach Betriebssystem mußt du dann entsprechende Funktionen aufrufen: POSIX bzw. WinAPI oder andere plattformübergreifenden Implementierungen, z.B. boost:threads).
Und statt strlen() kannst du doch einfach diesen Wert in eine (globale) Variable packen und dann abfragen, denn innerhalb der Rekursion ändert sich dieser Wert ja nicht!!!
Wie hoch kann denn N bei dir werden? Schon für 8 hast du 10^12 verschiedenen Kombis (d.h. selbst bei 10Mio pro Sekunde bräuchtest du ca. 5 Tage!!!)
-
Rekursiver schrieb:
fdsfsd schrieb:
vor ner weile gabs schon mal das gleiche problem und lösungen dazu die an beliebiger stelle gestartet werden können
wärest du so nett und könntest link geben? mit der suchfunktion mit den stichworten "rekursion" finde ich kein topic dazu.
Weil Rekursion dafür wohl das falsche Wort ist. Such mal nach "Kombinationen" oder sowas. Und nicht nur die Überschriften lesen, die sind meistens Müll.
-
@fdsfsd
Da finde ich leider nur Topics mit Permutation, doch das ist leider nicht das was ich benötige - oder doch?
-
Doch, Permutation müsste richtig sein.
Noch eine kleine Idee meinerseits: Die Idee von Th ist gut, die Rekursion zu 'teilen'. Evtl kannst du dir aber auch überlegen, die Berechnungen als 'Jobs' zu erstellen, also dass du eine Liste von Jobs hast. Dann startest du X Threads, wobei entweder jedem Thread sofort je Y Jobs zugewiesen werden, oder aber sich die Threads nach jedem fertigen Job einen neuen holen. Mit den Jobs kannst du die Berechnung leichter auf mehrere Rechner verteilen, du musst nur noch Kommunikation einbauen und eben Jobs zuweisen.
Ich bin mir aber grad unsicher, ob sich Permutationen wirklich sinnvoll aufteilen lassen, da du ja auch Vorberechnungen benutzt/benutzen kannst. Hab aber grad keine Lust nachzudenken, wollt jetzt vor den Fernseher

oh, wurde dieser Link schon gepostet?
-
@Badestrand
Aber eine Permutation ist doch nur die Kombination aus gegebenen buchstaben in der länge ihrer anzahl. ich benötige doch die kombination aus gegebenen buchstaben in der länge, welche nicht mit der anzahl buchstaben in beziehung steht? jedenfalls weiß ich nicht was mir das bringt.
-
Rekursiver schrieb:
@Badestrand
Aber eine Permutation ist doch nur die Kombination aus gegebenen buchstaben in der länge ihrer anzahl. ich benötige doch die kombination aus gegebenen buchstaben in der länge, welche nicht mit der anzahl buchstaben in beziehung steht? jedenfalls weiß ich nicht was mir das bringt.
Liegt wahrscheinlich an mir, aber ich krieg den Sinn des Satzes grad nicht

Hab dein Programm mal bei mir durchlaufen lassen, fürcharacter_table = { 'a', 'b', 'c'};ergäbe sich dochaaa aab aac aba abb abc aca acb acc baa ... cccoder nicht?
-
Badestrand schrieb:
Rekursiver schrieb:
@Badestrand
Aber eine Permutation ist doch nur die Kombination aus gegebenen buchstaben in der länge ihrer anzahl. ich benötige doch die kombination aus gegebenen buchstaben in der länge, welche nicht mit der anzahl buchstaben in beziehung steht? jedenfalls weiß ich nicht was mir das bringt.
Liegt wahrscheinlich an mir, aber ich krieg den Sinn des Satzes grad nicht

Hab dein Programm mal bei mir durchlaufen lassen, fürcharacter_table = { 'a', 'b', 'c'};ergäbe sich dochaaa aab aac aba abb abc aca acb acc baa ... cccoder nicht?
Ja, aber ich habe mehr zeichen in der character_table als der string lang ist - daher bringt mir permutation nichts, jedenfalls würde mir nicht einfallen wie.

-
die tun das was du willst
http://www.c-plusplus.net/forum/viewtopic-var-t-is-199754-and-highlight-is-*kombinationen*.html