Maximum recursion depth

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Danke für die weiteren Vorschläge.
Zum ersten Vorschlag habe ich eine Frage: So wie er hier steht gibt er am Schluss ja dann einfach die Wörter aus, oder?
Die eigentliche "Arbeit" für den Computer wäre dann ja trotzdem die Gleiche, weil er alle Buchstaben finden muss, die bei allen eingegeben Strings vorkommen...

Edit: Missverständnis korrigiert ;)
Zuletzt geändert von MarcelF6 am Freitag 25. Mai 2012, 15:06, insgesamt 1-mal geändert.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Wer ist er? :?:

@Arbeit:
Das Ergebnis sagt doch nichts über den Weg, über den Du das erreicht hast, aus.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Naja, das stimmt schon. Aber falls ich den Algorithmus mit der Vorlage des ersten Vorschlags wieder gleich (d.h. analog) implementieren würde, wäre der PC trotzdem nicht schneller. (bzw. der Code an sich immernoch ungünstig).
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Überleg Dir einfach mal, wie oft Dein Algorithmus die Stringelemente durchlaufen muss (das ist irgendwas exponentielles, O(3^(3*n)) worst case). Meine Version schafft es in O(n^3) für 3 Strings a n Elemente. Keine Frage, dass man das weiter verbessern kann, bleibt man allerdings beim Datentyp Liste, ist es kaum besser zu schaffen, da hier die Suche nunmal O(n) ist. Das Problem adressiert u.a. die Wörterbuchversion, wo man mit einer modifizierten Version es bis auf O(4*n) reduzieren könnte (unter der Annahme, dass der Zugriff O(1) average und die Alphabetlänge gleich der Stringlänge n ist).

Edit:
Falls Du nicht weisst, wovon ich hier rede, probier es einfach mal es mit unterschiedlicher Stringanzahl und Stringlängen.
Zum Schluss noch die vereinfachte Wörterbuchversion mit ein paar Erklärungen:

Code: Alles auswählen

def seq(*args, **kwargs):
    hits = kwargs.get('hits')
    if not hits:
        hits = len(args)
    temp = {}
    for s in args:                         # m Strings
        for c in s:                        # der Länge n (Vereinfachung): O(m*n)
            temp.setdefault(c, 0)          # O(1)
            temp[c] += 1                   # O(1)
    # return: temp enthält k Einträge                                   : O(m*n+k)
    # obere Abschätzung: k kann maximal n sein                          : O((m+1)*n)
    # Subaufrufe sind alle O(1) - keine Abhängigkeit zu m, n oder k
    return [k for k,v in temp.iteritems() if v==hits]
Mit der Counterklasse aus collections ginge der Quellcode noch weiter zu vereinfachen, allerdings sieht man dann die Einzelschritte für die Komplexitätsabschätzung nicht mehr.

Edit2: Unsinnige enumerates rausgenommen.
Antworten