2017-05-25 4 views
-3

Ich muss einen "Textkorrektor" in C++ erstellen. Das bedeutet, dass der Lehrer eine zufällige englische ".txt" -Datei verwendet und unser Programm verwendet, um Fehler zu erkennen und zu korrigieren. Um dies zu tun, haben wir ein englisches Wörterbuch von ungefähr 350k verschiedenen Wörtern zur Verfügung gestellt. Jedes Wort belegt eine Zeile. Wir müssen für jedes Wort in seiner TXT-Datei prüfen, ob das Wort in dictionary.txt existiert.Lesen einer bestimmten Zeile aus einer großen Datei

Jetzt ... das Hauptproblem davon ist, wie man das Wörterbuch benutzt. Da die Länge der Wörter unterschiedlich ist, kann ich keine Tabelle verwenden, um sie alle zu laden, sondern binäre Suche in der Tabelle, wenn ich ein Wort finden muss.

Ich hoffe, es gibt eine Möglichkeit, einfach in der Datei zu bewegen. Die meisten Antworten hier sagen "Schleife" um die Datei, aber das ist hier keine Möglichkeit, weil wir auf die Ausführungsgeschwindigkeit ausgewertet werden und die Datei 350k Wörter hat. Das Wiederholen von 350.000 Wörtern für ein paar tausend Mal, um eine Datei zu korrigieren, wäre viel zu lang.

Wissen die Länge der Datei, konnte ich nicht einfach sagen "zur Mitte der Datei gehen, vergleichen Sie das Wort, bewegen Sie sich zu einem Viertel (oder drei) der Datei usw."? weil ich die Akte habe und ich die genaue Größe kenne ... Wie ein "gehe zur Linie dieses" oder "geh zu diesem Charakter" - und von dort kann ich einfach ein paar Zeichen zurück oder vorwärts bewegen, um das volle Wort zu erhalten. .

+0

* Da die Wörter in der Länge variieren, kann ich kaum eine Tabelle * verwenden - Think again. Ich würde glauben, dass hier keine Dateiarbeit nötig ist, außer am Anfang, wo Sie die Wörter aus dem Wörterbuch lesen. 350k Wörter sind nichts in der heutigen Zeit. Speichern Sie die Wörter einfach in einer 'std :: unordered_map' und führen Sie einen' find' durch, um zu sehen, ob ein Wort existiert. – PaulMcKenzie

+0

Es wird schneller sein, die gesamte Datei in den Speicher zu laden. Und ich verstehe nicht, warum Sie Teile der Datei verschieben möchten. – drescherjm

+0

Für solche Dinge ist die Standard-Vorlagenbibliothek der richtige Weg. Laden Sie in diesem Fall das Wörterbuch in ein std :: set (http://www.cplusplus.com/reference/set/set/) und suchen Sie dann die Wörter aus dem Text in der Menge. – ravenspoint

Antwort

2

Ich glaube, dass Ihr Problem für einen Radix-Baum fordert. https://en.wikipedia.org/wiki/Radix_tree

Es ermöglicht Ihnen, das Wörterbuch der Wörter viel effizienter als eine Karte zu erstellen, zu speichern und zu suchen, wenn es zu dieser Art von Problem kommt.

Wenn Sie vergleichen, wenn Sie die Buchstaben 'c', 'o', 'r' sehen, können Sie jeden Zweig untersuchen und sehen, dass er möglicherweise mit "core", "correct" oder "corporation" übereinstimmt Beispiel.

Wenn Sie Online-Algorithmus Übungsplätze wie HackerRank überprüfen oder von Amazon oder Microsoft befragt wurden, wird dieses Problem auftauchen.

Verwandte Themen