algorithm – 如何提高关键字搜索的性能?

这是一个面试问题.

您必须编写程序,它会查找包含所有给定关键字的所有文件.您将如何预处理文件以提高搜索性能.

我的答案:

我会使用Lucene(或任何其他文本搜索引擎).如果我需要手动实现它,我将构建一个索引,将文档单词映射到文档ID.我们应该用B树实现该索引.另一种方法是使用RDBMS(mySQL或smth.),但对我来说这看起来有点过分.

是否有意义?你会如何回答这个问题?

最佳答案 我同意,大多数时候文本搜索引擎是要走的路……真的很容易构建和可靠.这里只是一个小细节:默认情况下,大多数引擎会进行OR搜索,因此您必须指定要匹配所有单词.

如果你必须构建自己的解决方案,是的,显然你必须构建映射.我会使用哈希查找而不是树索引,但你的树可能不会太大,所以这只是一个小的性能改进.尽管如此,我没有看到使用树的重点,你不需要它的遍历功能,你永远不会搜索上一个或下一个单词.

当您实际检查如何使用数据结构时,会弹出更多有趣的细节.我们来看一个例子:他来的小马.直觉上,你不会开始查找,可能所有文件都包含它(假设它们是英文文本).小马是一个不错的选择,可以轻松缩小搜索范围.大多数文本搜索引擎都包含一个指标:有多少文档包含该特定单词.因此,基于您从最不频繁的一个开始,并按增加的频率顺序检查单词.

一旦你设法缩小你的搜索范围,你就会开始意识到你的索引不能很好地工作……你仍然有要检查的单词,并且在你的索引中会显示数百个文档,所以此时它将是最好使用反向映射,从文档到单词(再次,哈希查找或trie).您检查少量文档以查看它们是否包含剩余的单词.

注意:这里有很多决定(如何存储映射,简单或双重映射,btree / hash / trie / …)取决于项目的规模.如果您必须搜索几个文件,并构建一些不同的东西,如果您必须索引github上的所有文件,或者进行基因序列搜索,甚至索引可能不适合内存……

点赞