【问题标题】:Distance between two strings [closed]两根弦之间的距离[关闭]
【发布时间】:2013-02-14 16:49:18
【问题描述】:

我不相信标准库提供任何东西来计算两个字符串之间的距离,而且我似乎在 Boost StringAlgo 中找不到任何东西。那么,还有其他我可以使用的库吗?

我对算法不太挑剔。 Jaro-Winkler 很好,Levenshtein 也很好,我愿意接受建议,我不想编写已经有人编写过的代码..

【问题讨论】:

标签: c++ string algorithm distance


【解决方案1】:

您没有使用实际距离度量来定义您的问题,所以我认为它只需要满足“Metric (mathematics)”中的条件:

集合 X 上的度量是一个函数(称为距离函数或简称为距离) d : X × X → R (其中 R 是实数集)。对于X中的所有x、y、z,该函数需要满足以下条件:

  • d(x, y) ≥ 0(非负性或分离公理)
  • d(x, y) = 0 当且仅当 x = y(不可分辨的同一性,或巧合公理)
  • d(x, y) = d(y, x)(对称)
  • d(x, z) ≤ d(x, y) + d(y, z)(次可加性/三角不等式)。

假设我们这样定义d

          { 0 if x = y
d(x, y) = {
          { 1 otherwise

所以前三个条件都满足了:

  • d(x, y) ≥ 0
  • d(x, y) = 0 iff x = y
  • d(x, y) = d(y, x) = 0 for x = yd(x, y) = d(y, x) = 1 for x ≠ y

对于最后一个条件,有两种情况:

  • d(x, z) = 0。右侧唯一可能的值是012,其中任何一个都可以满足条件。
  • d(x, z) = 1。假设右手边大于或等于一。这意味着它必须为零。那么右侧的两个术语都必须是0,这意味着x = yy = z。第二个条件表示x = z,这反过来又表示d(x, z) = 0。这是一个矛盾,所以右手边必须大于或等于一。

那么我们可以将度量定义为:

int d(std::string x, std::string y) {
    if (x == y) {
        return 0;
    } else {
        return 1;
    }
}

【讨论】:

  • 作为一名数学家,我喜欢你的回答:)
【解决方案2】:

【讨论】:

    【解决方案3】:

    你可以试试SimString

    SimString 是一个用于快速近似字符串检索的简单库。 近似字符串检索在数据库中查找字符串 与查询字符串的相似度不小于阈值。发现 不仅相同而且相似的字符串,近似字符串检索 具有多种应用,包括拼写纠正、灵活 字典匹配、重复检测和记录链接。

    SimString 支持 cosine、Jaccard、dice 和重叠系数作为 相似性度量。 SimString 使用字母 n-gram 作为特征 计算字符串相似度。

    或者SimMetric 库。

    SimMetrics 是一个相似度度量库,例如从编辑距离的 (Levenshtein、Gotoh、Jaro 等)到其他指标(例如 Soundex、 查普曼)。由 (AKT) 资助的英国谢菲尔德大学提供的工作 IRC 由 EPSRC 赞助,授权号 GR/N15764/01。

    或者 libdistance 库,它实现了 Levenshtein、Dameru、Needleman-Wunsch、Hamming、Bloom Filter、Jaccard 和 Minkowski 距离。

    Phonetic algorithms 也可能感兴趣。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2016-09-13
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多