【问题标题】:Efficiently finding a list of near matches for list of words and phrases有效地查找单词和短语列表的近似匹配列表
【发布时间】:2017-01-04 18:28:01
【问题描述】:

我正在寻找一种算法,但我不知道问题的名称,所以我找不到任何东西。希望我对问题的解释是有道理的!

假设您有一长串短语,其中每个短语都是一组单词。用户输入一个单词列表,他们的列表“匹配”一个短语,短语中的每个单词都在他们的列表中找到。列表的“分数”是它匹配的短语数。目标是为用户提供最能提高其列表分数的单词列表。

这是一个简单的例子。我们有十个短语:

  1. 木屋
  2. 在树林里露营
  3. 露营小屋
  4. 有趣的露营
  5. 篝火
  6. 野火
  7. 游泳洞
  8. 趣味小屋
  9. 柴火
  10. 火场

并且用户提供了这个列表:

  • 木头
  • 有趣
  • 露营

我们匹配短语 1 和 4,因此得分为 2。但如果用户将“小屋”添加到他们的列表中,他们将再匹配 3 个短语并获得 5 分。“火”将在得分上加 2 .

有了简单的简短列表,没有任何复杂的问题,因为您几乎可以立即遍历选项。但随着列表增长到数十万,它开始需要数百毫秒。感觉应该有办法建立索引,让这个过程更快,但我想不出索引的结构会是什么。

任何花时间阅读所有内容的人,谢谢!希望有人知道我在说什么。

【问题讨论】:

  • 当列表中只有 3 个元素时,为什么只匹配短语 1 和 4?什么算作“匹配”?

标签: algorithm sorting indexing


【解决方案1】:

您需要将单词映射到出现次数。如果您使用哈希表,您可以非常快速地完成它(O(N) - N 是短语中的单词数) - 遍历所有短语,将它们分解为单词,如果单词已经在地图中增加它计数,如果不是 - 将其添加到计数为 1 的地图中。

要计算输入的分数,只需循环输入单词并累积出现次数。 O(M) - 这次 M 是输入单词的数量。

我怀疑您能否获得更好的复杂性(您需要至少扫描一次短语),并且通过正确实施地图(几乎所有现代语言都可用) - 它也会很快。

【讨论】:

    【解决方案2】:

    后缀树。

    它们是相当繁琐和复杂的东西,但基本上我们为每个字符存储一个节点 (26 * 2),然后我们存储每个字符的后缀,因此 th 和 an 的条目等等,但大概不是qj 或其他不会发生的组合。然后你会得到这些的后缀,(所以 the、thr 等等,但是不允许有很多三个字母的组合)。 它允许非常快速的搜索,这不必是精确的。如果我们想匹配 a*d 我们只需遵循 a 的所有后缀,然后只有 d 后缀,然后我们坚持使用 nul。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 2014-02-22
      相关资源
      最近更新 更多