2010-04-20 119 views

回答

2

你想要的是Boyer-Moore algorithm。這是解決這個問題的最有效的已知通用方法。

+0

是的,除非你提到過,否則我不記得這個算法。 – Sawyer 2010-04-20 08:14:55

2

識別發生的最好辦法,而不是僅僅出現一個行的文件中的子串字符該序列,可能是從\bword\b編譯正則表達式Pattern - 的\b是「字邊界」。

一旦你有了這個Pattern沒有直接的方法來計算一行中出現的次數,所以你需要一些基準來找出更快的 - split(將結果數組的長度減去一個),但不可能,但可能,或者使用該模式的matcher方法制作一個方法,然後在計數(我賭這個)或其他東西時循環其find方法。但是單獨檢測字邊界就足夠了PITA,我傾向於總是使用正則表達式來處理任務;-)。

可以通過一次讀取多條線(並計算單詞出現次數)來擠壓某些速度 - 比如一次一個MB。但是,如果你這樣做,那麼你必須關注兆字節中的最後一條「部分」線,因爲這個詞的出現可能會在該部分行的結尾與下一個吞嚥的開始之間分裂 - 可行,但是這種優化只是在脅迫下進行的,因爲它很容易引入錯誤;-)。

+0

+1爲您的答案好主意,但一些代碼也會很好:D – ant 2010-04-20 11:41:58

0

如果文本文件非常大,indexOf()可能不是一個好主意,因爲您需要將整個文件加載到一個字符串中並因此咀嚼內存。給定足夠的數據,你會崩潰的程序。我認爲你需要查看流讀取API來讀取塊的文件,這些文件比indexOf()更實用。

0

使用buffered stream字符逐字符到數組讀取文件,直到空白字符遇到或它們的組(空格,製表符,新的生產線,...),比較數組與目標詞的內容,如果比賽增加計數器,清除數組,返回閱讀。

預先分配足夠大小的數組,然後重新使用它進行讀取,如果需要的話進行擴展,不要在每次迭代時分配它。不要每次都清除數組,只需將其讀取計數器設置爲零即可。另外,您可以將字符的讀取和將其與目標進行比較,並將其轉換爲單個循環,從而不再需要中間數組。第一個變體很容易轉換成這個,只是拋出數組並且即時比較,您只需要知道當前字符及其在單詞中的位置。

+0

他在談論效率。沒有得到結果。 – Jagannath 2010-04-21 06:43:26

+0

好吧,我們來看看 - 用C寫出該算法並將其稱爲低谷JNI :) 無論如何,我的解決方案中效率如此低下? – actual 2010-04-21 07:02:12

相關問題