【问题标题】:String fuzzy lookup字符串模糊查找
【发布时间】:2012-11-03 18:06:46
【问题描述】:

这是一道面试题。

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

【问题讨论】:

    标签: search data-structures language-agnostic


    【解决方案1】:

    我会说这取决于上下文:如果您有数以百万计的名字、要履行的合同和为您完成的产品,那么我会说去吧,忘记自己编写它。

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

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

    我曾经做过一次在单词列表中查找单词的问题(有错误),但它不仅限于一个错误,而且没有很多可用的内存。所以单词被简单地存储为一个列表(DAWG 需要节点和指针,这将需要太多开销)。

    【讨论】:

    • 这将导致相当大的空间开销:2*字母大小*单词数。根据具体要求,最好存储有效单词并检查输入的偏差。
    【解决方案2】:

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

    1. 找到名称 --> 名称有效
    2. 数据结构中的死角-->检查名称中剩余的字符数,如果不超过1-->名称有效;否则无效。
    3. 名称已结束,尚未到达结构中的叶子 --> 检查当前位置是否至少有一个叶子(将占用 O(字母大小)) --> 如果是,则命名已验证;否则无效。
    4. 单词中间出现差异 --> 从下一个字符继续遍历 --> 不允许出现更多错误(从此时起,第 2 和第 3 段不再有效)。

    【讨论】:

      【解决方案3】:

      对于第一个问题(精确搜索),您可以使用哈希表或 trie。布隆过滤器可能会提前告诉您“否”,但不会告诉您明确的“是”。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-09
        • 2014-11-10
        • 1970-01-01
        • 2012-02-14
        • 2014-11-02
        • 1970-01-01
        • 2018-05-31
        • 2021-04-19
        相关资源
        最近更新 更多