编辑距离 算法 Dynamic Programming Algorithm (DPA) for Edit-Distance

关于两个字符串s1,s2的差别,可以通过计算他们的最小编辑距离来决定。

       所谓的编辑距离s1s2变成相同字符串需要下面操作的最小次数。

1.         把某个字符ch1变成ch2

2.         删除某个字符

3.         插入某个字符

例如      s1 = “12433” s2=”1233”;

                     则可以通过在s2中间插入4得到12433s1一致。

                    d(s1,s2) = 1 (进行了一次插入操作)

编辑距离的性质

计算两个字符串s1+ch1, s2+ch2编辑距离有这样的性质:

1.         d(s1,””) = d(“”,s1) = |s1|    d(“ch1”,”ch2”) = ch1 == ch2 ? 0 : 1;

2.         d(s1+ch1,s2+ch2) = min(     d(s1,s2)+ ch1==ch2 ? 0 : 1 ,

d(s1+ch1,s2) + 1,

d(s1,s2+ch2) + 1 );

网的其他版本没有这个+1,没有+1是错误的!

              第一个性质是显然的。

              第二个性质:          由于我们定义的三个操作来作为编辑距离的一种衡量方法。

                                          于是对ch1,ch2可能的操作只有

1.         ch1变成ch2

2.         s1+ch1后删除ch1              d = (1+d(s1,s2+ch2))

3.         s1+ch1后插入ch2              d = (1 + d(s1+ch1,s2))

                                          对于23的操作可以等价于:

                                          _2.   s2+ch2后添加ch1              d=(1+d(s1,s2+ch2))

                                          _3.   s2+ch2后删除ch2              d=(1+d(s1+ch1,s2))

                     因此可以得到计算编辑距离的性质2

编辑距离常用于评价两个字符串的相似度,也可用于计算两个自然语言语句的相似度。
其变种有:
归一编辑距离(Normalized Edit Distance)
Gregor编辑距离
Gavin编辑距离
等。
根据具体的应用场合,还可以分别定义不同的插入代价,替换代价,删除代价,以求得更精确的相似度结果。由此可见dis(s1, s2)!=dis(s2, s1)。

代码如下:(使用了备忘录方法)
string const str1 = "12433";
string const str2 = "12222";
vector<vector<int>> mem(str1.size() + 1, vector<int>(str2.size() + 1, -1));

int Distance(int i, int j){
	if (mem[i][j] == -1){
		if (i == 0 && j == 0){
			mem[i][j] = 0;
		}
		else if (i == 0 || j == 0){
			mem[i][j] = max(i, j);
		}
		else{
			mem[i][j] = min(min(	Distance(i - 1, j) + 1
					,	Distance(i, j - 1)) + 1
					,	Distance(i - 1, j - 1) + (str1[i - 1] == str2[j - 1] ? 0 : 1));
		}
	}

	return mem[i][j];
}

void main(){ 
	cout << Distance(str1.size(), str2.size()) << endl;
	return; 
} 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值