当前位置: 首页 > news >正文

编辑距离(Edit Distance)——从字符串相似度到动态规划经典模型

引言

在自然语言处理(NLP)、搜索引擎纠错、DNA序列比对、拼写检查系统等领域,经常需要衡量两个字符串之间的相似程度。

例如:

kitten sitting

显然两个单词非常接近,但究竟有多接近?

如何用数学方法描述这种“接近程度”?

为了解决这一问题,俄罗斯科学家 Vladimir Levenshtein 于 1965 年提出了著名的Levenshtein Distance(编辑距离)

编辑距离定义为:

将一个字符串转换为另一个字符串所需要执行的最少编辑操作次数。

允许的操作包括:

  • 插入(Insert)

  • 删除(Delete)

  • 替换(Replace)


问题描述

给定两个字符串:

word1 word2

求将word1转换为word2所需的最少操作次数。

例如:

horse → ros

转换过程:

horse ↓ replace(h,r) rorse ↓ delete(r) rose ↓ delete(e) ros

答案:

3

编辑距离的本质

假设:

word1 = horse word2 = ros

我们关注的是:

horse前i个字符 与 ros前j个字符

之间的最优转换方案。

因此可以发现:

一个大问题可以分解为若干个更小的子问题。

这正是动态规划的典型特征。


动态规划状态定义

设:

dp[i][j]

表示:

word1前i个字符 转换成 word2前j个字符 所需的最少操作次数

例如:

dp[3][2]

表示:

"hor" → "ro"

的最小编辑距离。


状态转移推导

这是整道题最核心的部分。


情况一:字符相同

假设:

word1[i-1] == word2[j-1]

例如:

abc abc

最后一个字符已经匹配:

c == c

无需额外操作。

因此:

dp[i][j] = dp[i-1][j-1]

情况二:字符不同

假设:

word1[i-1] != word2[j-1]

例如:

horse ros

最后一个字符不同。

此时有三种选择。


1. 删除

删除 word1 的最后一个字符:

horse ↓ hors

问题变成:

dp[i-1][j]

再加一次删除操作:

dp[i-1][j] + 1

2. 插入

向 word1 末尾插入一个字符:

hors ↓ horse

对应:

dp[i][j-1]

再执行一次插入:

dp[i][j-1] + 1

3. 替换

直接修改最后一个字符:

horse ↓ rorse

对应:

dp[i-1][j-1]

加一次替换:

dp[i-1][j-1] + 1

综合状态转移方程

因此得到:

dp[i][j]=\min\left(dp[i-1][j]+1,\ dp[i][j-1]+1,\ dp[i-1][j-1]+cost\right)

其中:

cost = 0 (字符相同) 1 (字符不同)

或者写成:

if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1]; else dp[i][j] = min({ dp[i-1][j], // 删除 dp[i][j-1], // 插入 dp[i-1][j-1] // 替换 }) + 1;

初始化分析

动态规划中最容易忽略的部分就是边界条件。


第一列

dp[i][0]

表示:

word1前i个字符 → 空串

唯一办法:

全部删除

因此:

dp[i][0] = i;

第一行

dp[0][j]

表示:

空串 → word2前j个字符

只能不断插入:

dp[0][j] = j;

DP表格演示

以:

word1 = horse word2 = ros

为例:

""ros
""0123
h1123
o2212
r3222
s4332
e5443

最终:

dp[5][3]

即:

3

代码实现

class Solution { public: int minDistance(string word1, string word2) { int m = word1.size(); int n = word2.size(); vector<vector<int>> dp( m + 1, vector<int>(n + 1, 0) ); // 初始化 for(int i = 0; i <= m; i++) dp[i][0] = i; for(int j = 0; j <= n; j++) dp[0][j] = j; // 状态转移 for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) { if(word1[i-1] == word2[j-1]) { dp[i][j] = dp[i-1][j-1]; } else { dp[i][j] = min({ dp[i-1][j], // 删除 dp[i][j-1], // 插入 dp[i-1][j-1] // 替换 }) + 1; } } } return dp[m][n]; } };

空间优化

观察状态转移:

dp[i][j]

仅依赖于:

dp[i-1][j] dp[i][j-1] dp[i-1][j-1]

即:

  • 当前行

  • 上一行

因此可以压缩成:

O(n)

空间复杂度。

优化后:

时间复杂度:O(mn) 空间复杂度:O(n)

编辑距离的现实应用

编辑距离远不止是一道算法题。

它广泛应用于工业系统。


搜索引擎纠错

用户输入:

googel

系统自动纠正:

google

因为:

EditDistance(googel, google)=2

拼写检查器

例如:

  • Microsoft Word

  • VSCode

  • IntelliJ IDEA

都会计算候选词的编辑距离。


DNA序列比对

生物信息学中:

ACTGCA ACTACA

可以通过编辑距离衡量基因序列相似度。


OCR文字识别

识别结果:

ChatGP7

真实结果:

ChatGPT

编辑距离:

1

系统可以自动修正。


动态规划思想总结

编辑距离是动态规划中的经典代表问题,其核心思想可以概括为:

  1. 将字符串问题转化为二维状态空间。

  2. 定义dp[i][j]表示两个前缀字符串的最优解。

  3. 根据最后一个字符是否相同进行分类讨论。

  4. 将复杂转换过程归结为:

    • 插入

    • 删除

    • 替换

最终建立最优子结构关系。

从算法体系角度看,编辑距离与:

  • 最长公共子序列(LCS)

  • 最长公共子串

  • 不同的子序列

  • 正则表达式匹配

共同构成了字符串动态规划(String DP)的重要基础,其思想在自然语言处理、生物信息学以及搜索推荐系统中均具有广泛应用价值。

http://www.rkmt.cn/news/1440516.html

相关文章:

  • 低成本DIY低音增强电路:基于RC高通滤波器的音频信号处理实践
  • Android Studio中文界面配置终极指南:3步告别英文开发困扰
  • 4个简单步骤彻底解决Minecraft卡顿问题:PCL2启动器内存优化完全指南
  • 长顺县26年最新奢侈品名包名表专业回收权威店铺推荐 - 莘州文化
  • 开源阅读鸿蒙版:5步构建您的专属无广告数字图书馆
  • 2026年甄选秦皇岛手表名表回收,正规渠道赵掌柜二奢店参考指南(185-3117-2838) 海港区高价回收手表 - GrowthUME
  • iTag防丢器物理按钮改造:从误触困扰到可靠工具的硬件调整方案
  • 终极PDF扫描效果生成指南:如何5分钟内创建专业扫描文档
  • 绝区零自动化工具深度探索:全面解锁智能游戏体验
  • 大成镇26年最新奢侈品名包名表专业回收权威店铺推荐 - 莘州文化
  • SKR V1.3主板适配LERDGE TMC2209驱动模块的UART模式硬件改造指南
  • Sora 2首批商用客户正在悄悄降级使用——3家AIGC工作室的紧急避坑清单(含6类高危prompt黑名单)
  • 基于ESP8266与Home Assistant的智能门锁系统DIY实践
  • SAI:5分钟掌握安卓拆分APK安装的终极指南
  • 别再为训练CLIP烧显卡发愁了!EVA-CLIP的三大‘省钱’技巧实测(附代码)
  • 亚洲EMBA世界排名最新榜单|五大顶尖项目实力解析
  • 如何轻松解锁中兴光猫完整权限:智能网络管理工具实战指南
  • 图形化编程入门嵌入式:用Visuino与Seeeduino XIAO实现LED闪烁
  • 猫抓插件完全指南:浏览器视频下载的终极解决方案
  • 基于双卡尔曼滤波(DEKF)的soc估计,在线更新模型参数,还可以估计本周期内soh的小幅度变化166 附赠对应的参考文档。
  • 解放双手的智能战斗伴侣:炉石佣兵战记自动化脚本完全指南
  • 显示器黑屏故障维修:从电容失效原理到焊接更换全流程详解
  • Veo 2分辨率设置终极校准协议:色深/时序/EDID欺骗三重握手失败诊断流程(含HDMI 2.1b认证设备清单)
  • 功能开关:产品经理必备的灰度发布与A/B测试实战指南
  • 普安县26年最新奢侈品名包名表专业回收权威店铺推荐 - 莘州文化
  • 为什么选择mbart-large-50-many-to-many-mmt?揭秘其50种语言翻译的独特优势
  • 电路设计入门:从欧姆定律到PCB实战,手把手带你玩转电子世界
  • 超越基础控制:如何将你的宇树Z1机械臂仿真与自定义ROS节点深度集成
  • 如何快速掌握MacType:Windows字体渲染优化的完整指南
  • 我用一台旧电脑跑了个 AI 模型,发现比云 API 还香(附一键部署命令)