如何在文本文件中搜索多个字符串

时间:2011-10-04 12:19:54

标签: java string algorithm

我正在使用文本文件。我想用Java实现一个搜索算法。我有一个我需要搜索的文本文件。

如果我想找到一个单词,我可以通过将所有文本放入hashmap并存储每个单词的出现来实现。但是,如果我想搜索两个字符串(或者可能更多),是否有任何算法?我应该以两对方式散列字符串吗?

2 个答案:

答案 0 :(得分:3)

这在很大程度上取决于文本文件的大小。通常有几种情况需要考虑:

  1. 很多关于非常短的文件(网页,文章篇幅等)的查询。文本分发与普通语言一样。一个简单的O(n ^ 2)算法很好。对于长度为n的查询,只需取一个长度为n的窗口并将其滑过。比较并移动窗口,直到找到匹配项。此算法不关心单词,因此您只需将整个搜索视为一个大字符串(包括空格)。这可能是大多数浏览器所做的。 KMP或Boyer Moore不值得努力,因为O(n ^ 2)案件非常罕见。

  2. 对一个大型文档的查询。预处理文档并将其预处理存储。常用存储选项是后缀树和反向列表。如果您有多个文档,则可以通过连接它们并单独存储文档结尾来构建一个文档。这是集合几乎不变的文档数据库的方法。

  3. 如果您有多个文档,其中您的冗余度较高且您的馆藏经常更改,请使用KMP或Boyer Moore。例如,如果你想在DNA数据中找到某些序列并且你经常得到新的序列以便从实验中找到新的DNA,那么天真算法的O(n ^ 2)部分将会耗费你的时间。

  4. 可能有很多可能性需要不同的算法和数据结构,所以你应该找出哪一种最适合你的情况。

答案 1 :(得分:1)

在提出方法之前需要更多细节:

您是仅搜索整个单词还是搜索任何子字符串?

您是否要在同一个未更改的文件中搜索许多不同的单词?

您是否知道要一次搜索所有内容的字词?

字符串有许多有效的(线性)搜索算法。如果可能的话,我建议使用一个已经为你写过的。

http://en.wikipedia.org/wiki/String_searching_algorithm

一个简单的想法是使用滑动窗口哈希,窗口大小与搜索字符串相同。然后,在一次传递中,您可以快速检查以查看窗口哈希与搜索字符串的哈希值匹配的位置。在匹配的地方仔细检查一下你是否真的匹配。