Index alle Ihre Strings in einem Suffix-Baum (link). Dies kann O (Anzahl der Zeichen) sein und Sie müssen es nur einmal tun, bevor Sie beginnen.
Ein Suffixbaum ermöglicht es Ihnen schnell (O (Musterlänge)) festzustellen, ob ein Muster in einer der Zeichenfolgen angezeigt wird, die Sie indiziert haben, und wie oft.
Sie können einen weiteren Durchlauf durch die Struktur durchführen und die Anzahl der Blätter in jedem Teilbaum (O (N) erneut) zählen und Sie erfahren, wie oft Sie den Teilstring vom Stamm zu diesem Knoten finden können Sie oder tun, was Sie wollen, basierend auf wie üblich sie sind.
Jetzt sind 10 Milliarden Strings der Länge 10k, mit 2-Byte-Zeichen (um die 1000 eindeutigen Symbole zu passen) ziemlich groß (18TB, wenn meine Mathematik richtig ist), die nicht in RAM passt. Sie müssen also entweder eine Weile warten oder mehr Computer und eine verteilte Lösung einrichten. Sie können die obige Lösung auf Zeichenketten anwenden, so dass sie in den verfügbaren Speicher passen. Die Suche in der Struktur muss jedoch mit der Anzahl der Stapel multipliziert werden, die Sie ausführen.
Wenn alles in Stapeln ist, dann wäre der effizienteste Weg, Stapel so groß wie möglich zu machen. Wenn Sie den Suffixbaum für einen Stapel erstellt haben, führen Sie alle Ihre Abfragen durch, speichern Sie die Ergebnisse und legen Sie den Pfad ab Baum, um Speicher für den nächsten Stapel von Eingabezeichenfolgen freizugeben.
Wenn Sie nur die Anzahl der Blätter unter einem Knoten zählen, zählen Sie die Gesamtzahl der Erscheinungsbilder des Musters (* einschließlich * mehrerer Auftritte innerhalb derselben Zeichenfolge) und nicht das, wonach das OP gefragt hat Gesamtzahl der Zeichenfolgen, in denen das Muster angezeigt wird). Aber Ihr Weg ist schnell, und TTBOMK, der Letzteres zählt, muss an jedem Knoten das * Set * von Strings speichern, die Blätter darunter haben, und während des DFS Verbindungen berechnen, was die Komplexität von Zeit und Raum multipliziert, also ist das vielleicht gut genug . –
Ich glaube, ich hatte keine Ahnung von der Dosierung. Angenommen, ich habe meine Eingaben in Chargen von angemessener Größe aufgeteilt, die mein Computer/Cluster auf einmal bearbeiten kann - sollte ich nicht alle diese Stapel am Ende zusammenführen, um die richtige Antwort zu erhalten? Liege ich falsch? –
Sie haben Recht, Sie müssen die Ergebnisse am Ende zusammenführen, um die richtige Antwort zu erhalten. Ich nahm an, dass dieser Teil offensichtlich ist. – Sorin