【问题标题】:How to search for multiple strings in a text file如何在文本文件中搜索多个字符串
【发布时间】:2011-10-04 12:19:54
【问题描述】:

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

如果我想找到一个单词,我只需将所有文本放入 hashmap 并存储每个单词的出现即可。但是,如果我想搜索两个字符串(或者可能更多),有什么算法吗?我应该对两个字符串进行哈希处理吗?

【问题讨论】:

    标签: java string algorithm


    【解决方案1】:

    这在很大程度上取决于文本文件的大小。您通常应该考虑以下几种情况:

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

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

    3. 如果您有多个文档具有高冗余并且您的集合经常更改,请使用 KMP 或 Boyer Moore。例如,如果您想在 DNA 数据中查找某些序列,并且您经常从实验中获得新的序列来寻找新的 DNA,那么简单算法的 O(n^2) 部分会浪费您的时间。

      李>

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

    【讨论】:

      【解决方案2】:

      在建议方法之前需要更多细节:

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

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

      你知道要一次性搜索的单词吗?

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

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

      一个简单的想法是使用滑动窗口哈希,窗口大小与搜索字符串相同。然后在一次通过中,您可以快速检查窗口散列与搜索字符串的散列匹配的位置。它在哪里匹配你仔细检查你是否有一个真正的匹配。

      【讨论】:

      • 我想搜索一个可能不是子字符串的单词(我现在不想处理通配符)。是的,我要在同一个文件中搜索许多不同的词。不,我不知道我要搜索的词取决于用户。是的,我得到了滑动窗口的想法,但问题是滑动窗口的大小,因为我可以搜索一个或两个组合在一起的单词。前任。如果我可以在这个网页中搜索 1. 许多 2. 许多不同的 3. 许多不同的词。在这里,滑动窗口的大小可以是多少?
      • Rabin Karp 仅在某些特殊情况下(基本上同时搜索多个字符串)与 KMP 或 Boyer Moore 具有可比性,否则最好与其他一个一起使用。如果你想一次搜索更大的词集,Rabin Karp 会很有趣,而且实现起来很简单。
      • 浏览器是如何做到的?像铬?它使用哪种算法。因为我试图让浏览器生效
      • 如果你想同时搜索 3 个不同长度的不同单词,你可以在同一个 pass 中维护 3 个不同的哈希窗口。您需要以多快的速度执行此操作以及搜索文档的频率?问问自己是否值得费心预处理文档。如果它是像浏览器这样的用户驱动搜索,我会认为上述方法会很好。
      • 如果文件从未更改过,并且您期望进行大量搜索,则应将此文件存储为后缀树。在后缀树上搜索子字符串只需 O(m),其中 m 是字符串的长度(而搜索算法至少需要 O(n),n 是文本的长度)。但是构建树需要 O(n^2),因此您需要足够的查询来弥补这一点。
      猜你喜欢
      • 2011-02-04
      • 2019-10-24
      • 2011-06-23
      • 2011-04-28
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多