這是一個面試問題,應該關注效率。如何計算大文本文件中指定詞的出現?我只能想到大多數編程語言中的indexOf()方法,但我不認爲這是正確的答案。計算大文本文件中特定詞的出現次數
回答
你想要的是Boyer-Moore algorithm。這是解決這個問題的最有效的已知通用方法。
識別字發生的最好辦法,而不是僅僅出現一個行的文件中的子串字符該序列,可能是從\bword\b
編譯正則表達式Pattern
- 的\b
是「字邊界」。
一旦你有了這個Pattern
沒有直接的方法來計算一行中出現的次數,所以你需要一些基準來找出更快的 - split
(將結果數組的長度減去一個),但不可能,但可能,或者使用該模式的matcher
方法制作一個方法,然後在計數(我賭這個)或其他東西時循環其find
方法。但是單獨檢測字邊界就足夠了PITA,我傾向於總是使用正則表達式來處理任務;-)。
可以通過一次讀取多條線(並計算單詞出現次數)來擠壓某些速度 - 比如一次一個MB。但是,如果你這樣做,那麼你必須關注兆字節中的最後一條「部分」線,因爲這個詞的出現可能會在該部分行的結尾與下一個吞嚥的開始之間分裂 - 可行,但是這種優化只是在脅迫下進行的,因爲它很容易引入錯誤;-)。
+1爲您的答案好主意,但一些代碼也會很好:D – ant 2010-04-20 11:41:58
如果文本文件非常大,indexOf()可能不是一個好主意,因爲您需要將整個文件加載到一個字符串中並因此咀嚼內存。給定足夠的數據,你會崩潰的程序。我認爲你需要查看流讀取API來讀取塊的文件,這些文件比indexOf()更實用。
使用buffered stream字符逐字符到數組讀取文件,直到空白字符遇到或它們的組(空格,製表符,新的生產線,...),比較數組與目標詞的內容,如果比賽增加計數器,清除數組,返回閱讀。
預先分配足夠大小的數組,然後重新使用它進行讀取,如果需要的話進行擴展,不要在每次迭代時分配它。不要每次都清除數組,只需將其讀取計數器設置爲零即可。另外,您可以將字符的讀取和將其與目標進行比較,並將其轉換爲單個循環,從而不再需要中間數組。第一個變體很容易轉換成這個,只是拋出數組並且即時比較,您只需要知道當前字符及其在單詞中的位置。
- 1. 計算在文本中出現特定單詞的次數?
- 2. 計算txt文件中特定文本的出現次數
- 3. 如何計算MySQL BLOB文本中特定單詞的出現次數?
- 4. 如何計算Ruby中文本文件中單詞的出現次數
- 5. Perl - 爲文件的每一行計算特定單詞的出現次數
- 6. 計算文本文件中文字的出現次數
- 7. 計算單詞在txt文件中出現的次數Java
- 8. Python:計算文件中某個單詞出現的次數
- 9. 用C++計算文件中單詞的出現次數
- 10. 如何計算Unix中一大組文件中每個詞的出現次數?
- 11. Java:計算文本文件中字符的出現次數
- 12. 計算文本文件中字符串的出現次數
- 13. 如何加速計算大文件中單詞的出現次數?
- 14. 計算文本文件中每個單詞的出現
- 15. 計算單詞的列表出現在文本文件中
- 16. 計算大文件中字符串的出現次數
- 17. 計算幾個特定詞的出現次數
- 18. 計算從C中的文本文件中出現的單詞的出現次數
- 19. 列出文本文件中出現次數的所有單詞?
- 20. 如何計算單詞在文本文件中的次數
- 21. 從文件內容中刪除停用詞並計算詞的出現次數
- 22. 從文本文件中計算特定單詞 - Java
- 23. 比較兩個文本文件並計算出現次數
- 24. 計算HTML文檔中可見文本的出現次數
- 25. 用於計算文件中特定單詞出現次數的命令行(如json中的鍵數)
- 26. 如何計算xml文件中某個特定屬性的出現次數?
- 27. 計算多個文件中特定正則表達式的出現次數
- 28. 計算大文檔中的每個字的出現次數
- 29. 計算R中某個數據幀行的特定詞的出現次數
- 30. 使用腳本計算字符串在文本文件中出現的次數
是的,除非你提到過,否則我不記得這個算法。 – Sawyer 2010-04-20 08:14:55