2010-04-20 162 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

相关问题