【问题标题】:Algorithm to match sequential subset from a list从列表中匹配顺序子集的算法
【发布时间】:2014-01-22 19:45:33
【问题描述】:

我试图记住正确的算法,以在集合中找到与可能子集列表中的元素匹配的子集。例如,给定输入:

aehfaqptpzzy

和子集列表:

{ happy, sad, indifferent }

我们可以看到“happy”这个词是匹配的,因为它在输入中:

a e <strong>h</strong> f <strong>a</strong> q <strong>p</strong> t <strong>p</strong> z z <strong>y</strong>

我很确定有一种特定的算法可以找到所有这些匹配项,但我不记得它叫什么了。

更新

上面的例子不是很好,因为它有字母重复,事实上在我的问题中字典条目和输入字符串都是可排序的集合。例如,

输入:acegimnrqvy

字典: { cgn, dfr, lmr, mnqv, 例如 }

所以在本例中,算法将返回 cgn、mnqv 和 eg 作为匹配项。另外,我想找到“最佳”意味着最长的最佳互补匹配集。因此,在上面的示例中,“最佳”答案将是“cgn mnqv”,例如不会匹配,因为它与较长匹配的 cgn 冲突。

我意识到这个问题可以通过暴力扫描来解决,但这是不可取的,因为字典中可能有数千个条目,输入字符串中可能有数千个值。如果我们试图找到最佳匹配集,可计算性将成为一个问题。

【问题讨论】:

  • 听起来你真的有一个列表,而不是一组。一个集合没有顺序,也不包含重复...
  • 目标字符串中的匹配项是否必须按顺序排列?
  • 在哪一点上,算法肯定只是简单的从左到右扫描?这将是O(MN)(其中M 是目标词的数量,N 是原始列表中的字母数量)。
  • 定义“所有这样的匹配”。对于输入ssaadd,它是否应该为sad 找到6 个匹配项?还是只是想检查sad 是否存在?
  • 它是一套。我已经简化了问题。实际问题涉及声学频率集。例如,声学特征可能是 100/51 150/30 175/35 190/17,其中第一个数字是频率,第二个数字是幅度。问题是找出声学特征是否存在于环境中的一组音调中。

标签: algorithm set subset string-matching


【解决方案1】:

您可以对多个当前状态使用 Aho - Corrasick 算法。对于每个输入字母,您要么停留(跳过字母),要么使用适当的边缘移动。如果两个或多个“演员”在同一个地方相遇,只需将它们合并为一个(如果您只对存在感兴趣而不重要)。

关于复杂性 - 这可能与幼稚的 O(MN) 方法一样慢,因为最多可以有 size of dictionary 演员。然而,在实践中,我们可以很好地利用很多词是其他词的子字符串这一事实,因为永远不会超过size of the trie演员,与字典的大小相比,这往往是很多更小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多