两个弦之间的距离

时间:2013-02-28 13:14:56

标签: c++ string algorithm distance

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

我对算法不太挑剔。 Jaro-Winkler也很好,Levenshtein也是如此,我乐于接受建议,我不想编写某人已编码的内容。

3 个答案:

答案 0 :(得分:8)

您没有使用实际距离指标定义您的问题,因此我认为它必须满足“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。假设右侧大于或等于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;
    }
}

答案 1 :(得分:6)

您可以尝试SimString

  

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

     

SimString支持余弦,Jaccard,骰子和重叠系数   相似性措施。 SimString使用字母n-gram作为特征   计算字符串相似度。

SimMetric库。

  

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

libdistance库,其中包含Levenshtein,Dameru,Needleman-Wunsch,Hamming,Bloom Filter,Jaccard和Minkowski距离的实现。

Phonetic algorithms也可能是有意义的。

答案 2 :(得分:0)