Dies ist eine Interviewfrage, und sollte sich auf Effizienz beziehen. Wie berechnet man das Vorkommen eines bestimmten Wortes in einer großen Textdatei? Ich kann nur an die Methode indexOf() in den meisten Programmiersprachen denken, aber ich denke nicht, dass die richtige Antwort.Berechnen Sie das Vorkommen des angegebenen Wortes in einer großen Textdatei
Antwort
Was Sie wollen, ist die Boyer-Moore algorithm. Es ist die effizienteste bekannte allgemeine Methode für dieses Problem.
Der beste Weg, ein Wort Vorkommen zu identifizieren, da nur als Teil einer Zeile der Datei auftreten, zu dieser Folge von Zeichen gegenüber, mit einem regulären Ausdruck ist wahrscheinlich Pattern
von \bword\b
zusammengestellt - die \b
sind „Wort Grenzen".
Sobald Sie diese Pattern
haben gibt es keine direkte Methode, um die Anzahl der Vorkommen in einer Zeile zu zählen, so dass Sie einen Benchmark benötigen, um herauszufinden, was schneller ist - a split
(die Länge des resultierenden Arrays von Strings minus ein), nicht wahrscheinlich, aber möglich, oder eine Matcher
mit der matcher
Methode des Musters dann Schleifen auf seine find
Methode während des Zählens (ich wette auf diese), oder etwas anderes wieder. Aber das Erkennen von Wortgrenzen alleine reicht für eine PITA, die dazu tendiert, immer reguläre Ausdrücke zu verwenden ;-).
Es ist möglich, etwas Geschwindigkeit durch das Lesen (und Zählen von Wortvorkommen) mehr als eine Zeile pro Zeiteinheit - sagen wir mal MB - zu erreichen. Aber wenn Sie das tun, dann müssen Sie auf die letzte "teilweise" Linie im Megabyte-Schluck achten, da ein Vorkommen des Wortes möglicherweise zwischen dem Ende dieser Teillinie und dem Beginn des nächsten Schluckes aufgeteilt werden kann - machbar , aber die Art der Optimierung tut man einfach unter Zwang, da es so einfach ist, einen Bug einzuführen ;-).
+1 für Ihre Antwort gute Idee, aber einige Code wäre auch schön: D – ant
Wenn die Textdatei wirklich groß ist, ist indexOf() möglicherweise keine gute Idee, weil Sie die ganze Datei in eine Zeichenfolge laden und daher Speicher aufzehren müssten. Bei genügend Daten würde das Programm abstürzen. Ich denke, Sie müssten in die Stream-Lese-APIs schauen, um die Datei in Chunks zu lesen, die mit indexOf() praktischer zu scannen sind.
Die Datei unter Verwendung von buffered stream char-by-char in Array lesen, bis Leerzeichen Zeichen oder Gruppe von ihnen (Leerzeichen, Tabs, neue Zeilen, ...), Inhalt des Arrays mit Zielwort vergleichen, Zähler erhöhen, wenn übereinstimmen , löschen Sie das Array, kehren Sie zum Lesen zurück.
Array mit ausreichender Größe vorbelegen und zum Lesen wiederverwenden, bei Bedarf vergrößern, nicht bei jeder Iteration zuweisen. Löschen Sie das Array nicht jedes Mal, sondern setzen Sie seinen Lesezähler auf Null.
Sie können auch das Lesen von Char kombinieren und es mit dem Ziel in einzelne Schleife vergleichen, wodurch die Notwendigkeit eines Zwischenarrays beseitigt wird. Die erste Variante ist leicht in diese umwandelbar, wirf einfach das Array weg und vergleiche im Fluge, du musst nur das aktuelle Char und seine Position im Wort wissen.
- 1. python - finde das Vorkommen des Wortes in einer Datei
- 2. Finden Sie alle Vorkommen eines Wortes in einer Liste?
- 3. Ersetzen eines Wortes in einer Textdatei
- 4. Wie das letzte Vorkommen eines Wortes in Javascript ersetzen?
- 5. Löschen Sie das Vorkommen eines Wortes aus einer Zeichenfolge in Ruby selektiv?
- 6. Finden Sie alle Vorkommen eines Wortes und ersetzen durch HTML
- 7. Eine Zeichenfolge in einer großen Textdatei abgleichen?
- 8. So lesen Sie Teildaten aus einer großen Textdatei in C++
- 9. Methode zum Ersetzen des Wortes
- 10. Markieren Sie alle Vorkommen einer Zeichenfolge
- 11. Verarbeitung einer sehr großen Textdatei mit faulen Texten und ByteStrings
- 12. Entfernen des ersten Wortes in einer Zeichenfolge
- 13. Hinzufügen einer großen Textdatei zum Ordner "Assets"
- 14. Zählen Sie die Anzahl der Vorkommen jedes Wortes
- 15. superfast Regexmatch in großen Textdatei
- 16. Anzahl der Vorkommen von Wörtern in einer Textdatei zählen
- 17. Was ist die Abkürzung, um das nächste Vorkommen eines Wortes in IntelliJ IDEA zu finden?
- 18. Wie suche ich eine Textdatei nach Anagrammen eines gegebenen Wortes
- 19. Entfernen Sie Daten in einer großen TXT-Datei aller Vorkommen in einer Datenbanktabelle
- 20. Bash - Ersetzen kleiner Linien in einer großen Textdatei effizient
- 21. Count Vorkommen eines Wortes durch ID in Python
- 22. Einfügen eines Wortes in Excel-Zelle an der angegebenen Position
- 23. Leistungsset des großen Satzes
- 24. Berechnen des Nullraums einer Matrix
- 25. Clojure - Mit großen Zahlen berechnen
- 26. Entfernen des ersten Wortes in einer Zeichenfolge in C
- 27. Berechnen des Rotationsvektors einer Kugel
- 28. Finden Sie den Index des Endes eines Wortes in Python
- 29. Finden Sie die durchschnittliche Länge des vorhergehenden Wortes eines anderen Wortes in einem Text-String
- 30. Berechnen Sie den Hash des Inhalts einer Datei in C#?
Ja, ich erinnere mich nicht an diesen Algorithmus, bis du es erwähnt hast. – Sawyer