字符串模糊查找

时间:2012-11-03 18:06:46

标签: search data-structures language-agnostic

这是一个面试问题。

给定一个由名称组成的文件,您将使用什么数据结构来验证名称是否在列表中。如果我们说一个名称与文件中的名称相差不超过一个字符,该怎么办?

3 个答案:

答案 0 :(得分:1)

我会说这取决于具体情况:如果你有数百万的名字,要履行的合同和为你做的产品,那么我会说它去做而忘记自己编写。

然而,在面试问题的背景下,我的建议是DAWG,其中包含所有可能的错误。

很久以前我听说拼写检查器包含一个可能出错的单词列表(而不是试图匹配有效单词列表),但我不知道这是多么真实。

我曾经在一个单词列表(有错误)中查找单词的问题上工作过一次,但它不仅限于一个错误,而且没有大量的内存可用。所以这些单词只是存储为一个列表(DAWG需要节点和指针,这需要太多的开销)。

答案 1 :(得分:1)

我建议将文件中的名称存储到trie或DAWG中(更好的空间效率)。 名称到达后,开始遍历数据结构。你将有4个变种:

  1. 找到的名字 - >名称有效
  2. 数据结构中的死胡同 - >检查名称中剩余的字符数,如果不超过1 - >名称有效;否则无效。
  3. 名称已结束且未到达结构中的叶子 - >检查当前位置是否有至少一片叶子(将采用O(字母表的大小)) - >如果是,姓名有效;否则无效。
  4. 在单词中间遇到的差异 - >继续遍历下一个字符 - >不再允许错误(从这一点开始,第2段和第3段不再有效)。

答案 2 :(得分:1)

对于第一个问题(精确搜索),您可以使用哈希表或特里结构。布隆过滤器可能会在空间开销时提前告诉您“否”,但永远不会告诉您明确的“是”。

对于第二个问题(模糊搜索),需要更先进的技术。查看http://blog.srch2.com/2012/03/fuzzy-search.html上的博客,讨论此问题的不同解决方案。

相关问题