21xrx.com
2024-09-20 00:29:27 Friday
登录
文章检索 我的文章 写文章
如何用C++比较字符串相似度?
2023-07-06 20:04:47 深夜i     --     --
C++ 字符串 相似度 比较

在计算机科学中,字符串相似度是指两个字符串在内容上有多少相似之处。在现代计算机科学中,字符串相似度常被用于纠错、信息检索、数据挖掘等领域。在C++编程中,有很多算法可以用来比较字符串相似度,下面将介绍两种常用的算法:Levenshtein距离和Jaro-Winkler距离。

一、Levenshtein距离

Levenshtein距离又叫编辑距离,是指两个字符串间由一个转换为另一个所需的最少编辑操作次数。编辑操作包括插入一个字符、删除一个字符和替换一个字符。Levenshtein距离越小,表示两个字符串的相似度越高。

C++实现:

int LevenshteinDistance(const string& str1, const string& str2)

{

  int len1 = str1.size();

  int len2 = str2.size();

  vector > dp(len1 + 1, vector (len2 + 1, 0));

  for (int i = 0; i <= len1; i++) dp[i][0] = i;

  for (int i = 0; i <= len2; i++) dp[0][i] = i;

  for (int i = 1; i <= len1; i++) {

    for (int j = 1; j <= len2; j++) {

      if (str1[i - 1] == str2[j - 1]) dp[i][j] = dp[i - 1][j - 1];

      else dp[i][j] = min(dp[i - 1][j] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1));

    }

  }

  return dp[len1][len2];

}

二、Jaro-Winkler距离

Jaro-Winkler距离是在Jaro距离的基础上增加一个字符串前缀的权重值,用于更好地处理短字符串的相似度。Jaro-Winkler距离也是计算两个字符串之间的编辑操作次数,但是比Levenshtein距离更适合短字符串。

C++实现:

double JaroWinklerDistance(const string& str1, const string& str2)

{

  int len1 = str1.size(), len2 = str2.size();

  int m = max(len1, len2), l = 0, w = 0;

  double dj = 0.0, p = 0.1;

  if (len1 == 0 || len2 == 0) return 0;

  if (len1 < len2) swap(str1, str2), swap(len1, len2);

  for (int i = 0; i < len1; i++) {

    for (int j = max(0, i - m); j <= min(len2 - 1, i + m); j++) {

      if (str1[i] == str2[j]) {

        if (i == j) dj += 1.0;

        else if (i != j && str1[i] != str2[j]) w += 1;

        break;

      }

    }

  }

  if (dj == 0) return 0;

  dj = dj / len1;

  double dw = (double)w / 2.0;

  double lp = 0.1;

  int lmax = min((int)str1.size(), 4);

  for (int i = 0; i < lmax && i < len2 && str1[i] == str2[i]; i++) lp += (double)p * 1;

  return dj + dw / len1 + lp * (1 - dj);

}

总结

Levenshtein距离和Jaro-Winkler距离都是常见的用于字符串相似度比较的算法。在实际应用中,可以根据不同的需求和字符串长度,选择相应的算法进行应用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复