计算编辑距离

编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将kitten一字转成sitting:

  1. sitten (k→s)
  2. sittin (e→i)
  3. sitting (→g)

问题:找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2,操作有三种,添加一个字符,删除一个字符,修改一个字符

解析:

首先定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。

显然可以有如下动态规划公式:

  • if i == 0 且 j == 0,edit(i, j) = 0
  • if i == 0 且 j > 0,edit(i, j) = j
  • if i > 0 且j == 0,edit(i, j) = i
  • if i ≥ 1  且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。

参考代码:

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

#define N 50

void EditDistance(char *ch1, char *ch2)
{
    int len1 = strlen(ch1);
    int len2 = strlen(ch2);
    int **p = new int*[len2 + 1];                    // 二维数组空间动态分配
    for(int i = 0; i < len2+1; i++)
        p[i] = new int[len1 + 1];

    for(int i = 0; i < len2+1; i++)
        p[i][0] = i;
    for(int j = 1; j < len1+1; j++)
        p[0][j] = j;

    int flag;                                        // 记录ch2第i个数和ch1第i个数是否相等
    for(int i = 1; i < len2+1; i++)
    {
        for(int j = 1; j < len1+1; j++)
        {
            flag = (ch2[i-1]==ch1[j-1]) ? 0 : 1;     // 注意下标错位影响
            p[i][j] = min(min(p[i-1][j]+1, p[i][j-1]+1), p[i-1][j-1]+flag);
            printf("%d ", p[i][j]);
        }
        printf("\n");
    }
    printf("ans = %d\n", p[len2][len1]);

    for(int i = 0; i < len2+1; i++)                  /* 二维数组空间动态释放先内层后外层 */
    {
        delete p[i];
        p[i] = NULL;                                 // 避免野指针
    }
    delete [] p;
    p = NULL;                                        // 避免野指针
}

int main()
{
    char ch1[N], ch2[N];
    scanf("%s", ch1);
    scanf("%s", ch2);
    EditDistance(ch1, ch2);
    return 0;
}

时间: 2024-12-15 01:54:37

计算编辑距离的相关文章

字符串相似度计算----编辑距离

题目描述: 要求两字符串有差异的字符个数.例如: aaaaabaaaaa aaaaacaabaa 这两个字符串,最大公共字串长度是5,但它们只有两个字符不同,函数输出值应为2. 如果是: aaabbbcccddd aaaeeeddd 函数的输出值应该是6. 比较形象地形容一下,把两个字符串排成上下两行,每个字符串都可以在任何位置插入空格以便上下对齐,每个列上至少有一个字符来自这两个字符串.当对齐程度最高的时候,没有对上的列的数即为函数输出值. aaabbbcccddd aaaeeeddd 最优对

编辑距离算法(Levenshtein)

编辑距离定义: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数. 许可的编辑操作包括:将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将eeba转变成abac: eba(删除第一个e) aba(将剩下的e替换成a) abac(在末尾插入c) 所以eeba和abac的编辑距离就是3 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. 算法: 算法就是简单的线性动态规划(最长上升子序列就属于线性动态规划).

计算句子相似度

计算编辑距离 # -*- coding: utf-8 -*- def distacal(s1,s2):#计算编辑距离 m = len(s1) n = len(s2) colsize, matrix = m + 1, [] for i in range((m + 1) * (n + 1)): matrix.append(0) for i in range(colsize): matrix[i] = i for i in range(n + 1): matrix[i * colsize] = i f

利用Trie树求多个字符串编辑距离的进一步优化

1.引言 题目的意思应该是:在一个给定的字典中,求与给定的字符串的编辑距离不大于2的所有的单词.原先写过两片关于此问题的文章,那两片篇章文章给出两种解决思路:其一是暴力求解法,这种方法最容易想到.就是将词典中的词一一与给定的字符串计算编辑距离,不大于2的输出,大于2的舍弃,这种方法思路简单但是很费时间.其二根据词典中这些词之间的编辑距离建立一个以单词为节点的Trie树,遍历的时候,通过计算根节点与给定字符串的编辑距离就可以排除掉一部分分支了,然后继续计算该字符串与剩余的分支的根的编辑距离,继续排

文本相似度计算基本方法小结

在计算文本相似项发现方面,有以下一些可参考的方法.这些概念和方法会帮助我们开拓思路. 相似度计算方面 Jaccard相似度:集合之间的Jaccard相似度等于交集大小与并集大小的比例.适合的应用包括文档文本相似度以及顾客购物习惯的相似度计算等. Shingling:k-shingle是指文档中连续出现的任意k个字符.如果将文档表示成其k-shingle集合,那么就可以基于集合之间的 Jaccard相似度来计算文档之间的文本相似度.有时,将shingle哈希成更短的位串非常有用,可以基于这些哈希值

Levenshtein计算相似度距离

使用Levenshtein计算相似度距离,装下模块,调用下函数就好. 拿idf还得自己去算权重,而且不一定准确度高,一般做idf还得做词性归一化,把动词形容词什么全部转成名词,很麻烦. Levenshtein.distance(str1,str2) 计算编辑距离(也称Levenshtein距离).是描述由一个字串转化成另一个字串最少的操作次数,在其中的操作包括插入.删除.替换.如 例如将eeba转变成abac: ① eba(删除第一个e) ② aba(将剩下的e替换成a) ③ abac(在末尾插

Minimum edit distance(levenshtein distance)(最小编辑距离)初探

最小编辑距离的定义:编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten(k→s) sittin(e→i) sitting(→g) 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. Thewords `computer' and `commuter' are

编辑距离及汉明距离的php实现

在计算字符串或图形的相似度时,常用的两个算法,一个是编辑距离,另一个是汉明距离. 简单点说: 编辑距离是通过几次编辑能把一个字符串变成另一个字符串 汉明距离是对应位置进行比较,找出不同的字符个数 想了解详情的请自行搜索. 以下是他们的php代码实现. <?php /**  * 计算编辑距离  *  * @param string $s1  * @param string $s2  */ function levDist($s1, $s2) {     $len1 = strlen($s1);  

nlp自然语言处理中句子相似度计算

在做自然语言处理的过程中,现在智能对话比较火,例如智能客服,智能家电,智能音箱等,我们需要获取用户说话的意图,方便做出正确的回答,这里面就涉及到句子相似度计算的问题,那么本节就来了解一下怎么样来用 Python 实现句子相似度的计算. 句子相似度常用的几种方法: 1.编辑距离 2.杰卡德系数计算 3.Word2Vec 计算 编辑距离,英文叫做 Edit Distance,又称 Levenshtein 距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数, 如果它们的距离越大,说明它们越