编程之美读书笔记_3.3_计算字符串的相似度

本文介绍了如何计算两个字符串的相似度,基于最长公共子序列的思路,给出了递推公式,并提供了C++代码实现。代码中进行了空间优化,仅使用两列数据,并探讨了进一步的性能提升策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.3_计算字符串的相似度

 

和计算两字符串的最长公共子序列相似。

Ai为字符串A(a1a2a3 … am)的前i个字符(即为a1,a2,a3 … ai

Bj为字符串B(b1b2b3 … bn)的前j个字符(即为b1,b2,b3 … bj

L(i , j)为使两个字符串和AiBj相等的最小操作次数。

ai等于bj时 显然L(i, j)=L(i-1, j-1)

ai不等于bj

  若将它们修改为相等,则对两个字符串至少还要操作L(i-1, j-1)

  若删除ai或在Bj后添加ai,则对两个字符串至少还要操作L(i-1, j)

  若删除bj或在Ai后添加bj,则对两个字符串至少还要操作L(i, j-1)

  此时L(i, j)=min( L(i-1, j-1), L(i-1, j), L(i, j-1) )  + 1

 

显然,L(i, 0)=iL(0, j)=j, 再利用上述的递推公式,可以直接计算出L(i, j)值。

为了保持与书中代码一致,下面的函数参数类型是string,而不是char*

 

  

  由于只要求计算两字串的距离,计算时,只用到两列数据,因而可以对代码进一步优化,节省空间。

 

 

 

 

上面的代码还可进一步优化,比如通过指针而不是数组名来访问内存。如果内存足够大,可以多申请空间,每次循环,通过修改保存的数据起始位置,避免内存复制。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值