【问题标题】:Best way string-matching algorithm for same-length strings?相同长度字符串的最佳字符串匹配算法?
【发布时间】:2010-12-24 01:56:18
【问题描述】:

我需要实现一个字符串匹配算法来确定哪些字符串最匹配。当可以获得这个固定长度时,我看到汉明距离是一个很好的匹配算法。

如果我改用 Levenshtein 距离公式,匹配质量有什么优势吗?我知道这种方法效率较低,因为它考虑了可变长度的字符串,但我在这里真正关心的是匹配的质量。另外,有没有更好的算法我可以考虑?如果这有什么不同,我会在 Java 中工作。

http://en.wikipedia.org/wiki/Levenshtein_distance

http://en.wikipedia.org/wiki/Hamming_distance

非常感谢

【问题讨论】:

  • 您能描述一下您如何评价比赛的质量吗?这是一个主观的衡量标准,所以如果你能描述你的目标,你会得到更好的答案。
  • 对于 2 个字符串,比如 AHDJD 和 KDLOS,我想判断它们彼此之间的“接近”程度。所以 AAAAA 和 AAAAA 将是 100% 匹配。 BAAAA 和 AAAAA 会接近 97%,KAAAA 和 AAAAAA 会接近 93%……BJKDZ 和 AAAAA 几乎不会相似……这有帮助吗?

标签: algorithm string-matching


【解决方案1】:

考虑字符串:“abcdefg”和“bcdefgh”。

Levenshtein 距离是 2。Hamming 距离(作用于字符而不是位)是 7。

因此,这实际上取决于您是否要将这些字符串视为相似。汉明距离有其适当的用途,但是“这些弦看起来会像人类吗?”不是其中之一。

【讨论】:

  • 我明白了。听起来汉明距离已经过时了,因为你的插图让 Levenshtein 看起来更合适。您知道我可能需要考虑的其他算法吗?
  • 你在另一条评论中说你想要 d("aaaaa","kaaaa") > d("aaaaa","baaaa")。 Levenshtein 不这样做,在这两种情况下都是 1。恐怕我不知道任何其他相关的算法。但也许通过将每个字符分解为(例如)2 位块,并计算这些块而不是字符上的 Levenshtein 距离,你可能会得到更接近你想要的东西。但是仍然不对,因为变化 O -> P 比变化 P -> Q 翻转的位数更多。
  • 啊,这个怎么样:你可以计算对应字符之间的均方根距离。 ('a' - 'k')^2 是 100,('a'-'b')^2 只有 1。这意味着“abc”比“amz”更接近“cba” zam”,所以你仍然可能得不到你喜欢的结果。
【解决方案2】:

Bitap algorithm.你可能会觉得有趣

bitap 算法(也称为 移位或,移位与或 Baeza-Yates-Gonnet 算法)是一个 模糊字符串搜索算法。这 算法告诉给定文本是否 包含一个子字符串,它是 “大约等于”给定的 模式,其中近似相等是 根据 Levenshtein 定义 distance — 如果子字符串和 模式在给定距离 k 内 彼此,然后算法 认为他们是平等的。算法 首先预先计算一组 每个位包含一个位的位掩码 图案的元素。然后就是 能够完成大部分工作 按位运算,它们是 非常快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 2012-12-12
    • 1970-01-01
    • 2016-04-19
    • 2015-10-25
    • 2011-12-14
    • 1970-01-01
    • 2012-12-23
    相关资源
    最近更新 更多