So finden gemeinsame Zeichenfolgen zwischen zwei sehr großen Dateien?
Habe ich zwei sehr große Dateien (und keiner von Ihnen würde in den Speicher passt). Jede Datei hat eine Schnur, (der keine Leerzeichen drin und ist entweder 99/100/101 Zeichen lang) in jeder Zeile.
Update: Die Saiten sind nicht in irgendeiner Reihenfolge sortiert.
Update2: ich arbeite mit Java unter Windows.
Nun möchte ich, um herauszufinden, der beste Weg,, um herauszufinden, alle Zeichenfolgen, die auftreten, in beiden Dateien.
Denke ich über die Verwendung von externen merge-sort sortiert beide die Dateien und führen Sie dann den Vergleich, aber ich bin nicht sicher, ob das wäre der beste Weg, es zu tun. Da die Saiten sind meistens ungefähr die gleiche Länge haben, wurde ich immer gefragt, wenn die computing-eine Art hash für jede saite wäre eine gute Idee, da sollten Vergleiche zwischen strings einfacher, aber dann würde das bedeuten, dass ich zum speichern der hashes berechnet, für die Streicher, dem ich begegnet bin, von den Dateien, so weit, so dass Sie später verwendet werden können, wenn Sie den Vergleich mit anderen Saiten. Ich bin nicht in der Lage zu fassen, was genau wäre der beste Weg. Ich bin auf der Suche für Ihre Anregungen.
Wenn Sie eine Lösung vorschlagen, bitte auch Staat, wenn die Lösung funktionieren würde, wenn es mehr als 2 Dateien und Zeichenfolgen, die auftreten, in allen von Ihnen mussten gemeistert werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie nicht gesagt, auf welcher Plattform Sie arbeiten, also ich nehme an, du arbeitest unter Windows, aber in dem unwahrscheinlichen Fall, dass Sie auf einer Unix-Plattform, standard-tools wird es für Sie tun.
Ich würde es tun, wie folgt (für beliebige Anzahl von Dateien):
Je nachdem, wie ähnlich die Einträge innerhalb einer Datei ist, könnte es möglich sein, erstellen Sie eine Trie (nicht Baum) aus. Mithilfe dieser versuche kann man die Iteration der anderen Datei, und überprüfen jeden Eintrag, wenn es in der Marina.
Wenn du mehr als 2 Dateien, Durchlaufen Sie eine Datei und erstellen Sie eine neue versuchten einen der Treffer aus. Auf diese Weise die letzten versuche, die Sie haben, enthalten alle Spiele, die enthalten sind in allen Dateien.
Ist es, um die Daten in den Dateien? Der Grund warum ich Frage ist, dass, obwohl eine zeilenweise Vergleich nehmen würde, eine Ewigkeit, durch den eine Datei Zeile für Zeile während Sie eine binäre Suche in der anderen wäre viel schneller. Dies kann nur funktionieren, wenn die Daten sortiert, die in einer bestimmten Weise, obwohl.
Ich würde laden Sie beide Dateien in zwei Datenbank-Tabellen, so dass jeder string in der Datei wurde eine Zeile in der Tabelle und verwenden Sie SQL-Abfragen zum Auffinden von doppelten Zeilen mit join.
Ich würde jede Art Datei, dann verwenden Sie ein symmetrisches Line-Algorithmus, der das Lesen einer Zeile zu einem Zeitpunkt aus einer Datei oder das andere.
Einen hash-basierten Lösung könnte wie folgt Aussehen (in python-pseudocode):
Dann Schleife immer wieder, Druck übereinstimmende Zeilen:
Gibt es zwei potentielle Probleme.
Dies ist O(Linien * Kosten(md5) ).
(wenn Leute einen volleren python-Implementierung, es ist ziemlich einfach zu schreiben, ich weiß nicht, java aber!).
Es zu tun in windows, die ziemlich einfach ..
sagen wir , Sie haben zwei Dateien A und B. 'A' - Dateien enthält die Zeichenfolgen, die Sie suchen möchten, in der Datei B. öffnen Sie einfach die Eingabeaufforderung, und verwenden Sie den folgenden Befehl
dieser Befehl ist sehr schnell und kann vergleichen von zwei Dateien sehr effizient. Die Datei AUSGABE enthält die strings Häufig in A und B.
wenn Sie möchten, führen Sie die ODER-Operationen (strings in B, als Ein anderer), dann verwenden Sie