【发布时间】:2011-10-04 12:19:54
【问题描述】:
我正在处理文本文件。我想用 Java 实现一个搜索算法。我有一个需要搜索的文本文件。
如果我想找到一个单词,我只需将所有文本放入 hashmap 并存储每个单词的出现即可。但是,如果我想搜索两个字符串(或者可能更多),有什么算法吗?我应该对两个字符串进行哈希处理吗?
【问题讨论】:
我正在处理文本文件。我想用 Java 实现一个搜索算法。我有一个需要搜索的文本文件。
如果我想找到一个单词,我只需将所有文本放入 hashmap 并存储每个单词的出现即可。但是,如果我想搜索两个字符串(或者可能更多),有什么算法吗?我应该对两个字符串进行哈希处理吗?
【问题讨论】:
这在很大程度上取决于文本文件的大小。您通常应该考虑以下几种情况:
对非常短的文档(网页、论文长度等)进行大量查询。像普通语言一样的文本分布。一个简单的 O(n^2) 算法就可以了。对于长度为 n 的查询,只需取一个长度为 n 的窗口并将其滑过。比较并移动窗口,直到找到匹配项。该算法不关心单词,因此您只需将整个搜索视为一个大字符串(包括空格)。这可能是大多数浏览器所做的。 KMP 或 Boyer Moore 不值得努力,因为 O(n^2) 的情况非常罕见。
对一个大文档的大量查询。预处理您的文档并将其存储为预处理。常见的存储选项是后缀树和倒排列表。如果您有多个文档,您可以通过连接它们并单独存储文档的结尾来构建一个文档。这是集合几乎不变的文档数据库的方法。
如果您有多个文档具有高冗余并且您的集合经常更改,请使用 KMP 或 Boyer Moore。例如,如果您想在 DNA 数据中查找某些序列,并且您经常从实验中获得新的序列来寻找新的 DNA,那么简单算法的 O(n^2) 部分会浪费您的时间。
李>可能有很多更多的可能性需要不同的算法和数据结构,所以你应该找出最适合你的情况。
【讨论】:
在建议方法之前需要更多细节:
您是只搜索整个单词还是任何子字符串?
您要在同一个未更改的文件中搜索许多不同的单词吗?
你知道要一次性搜索的单词吗?
有许多有效的(线性)字符串搜索算法。如果可能的话,我建议使用已经为您编写的。
http://en.wikipedia.org/wiki/String_searching_algorithm
一个简单的想法是使用滑动窗口哈希,窗口大小与搜索字符串相同。然后在一次通过中,您可以快速检查窗口散列与搜索字符串的散列匹配的位置。它在哪里匹配你仔细检查你是否有一个真正的匹配。
【讨论】: