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

莱文斯坦距离基本原理

关键词Levenshtein Distance一、说明莱文斯坦距离是用于衡量两个序列之间差异的字符串度量计算将一个字符串转换为另一个字符串所需的最少单字符编辑次数——插入、删除或替换。该算法由弗拉基米尔·列文斯坦于1965年开发广泛应用于拼写检查器、DNA分析和模糊字符串匹配。 本文仅关注莱文斯坦距离不会深入探讨算法的复杂度、转置或可变操作成本。二、从实际问题引出在开发一个项目的过程中我遇到了一个棘手的挑战。我需要为用户提供一个用于搜索标签的文本框。问题在于标签通常比较长导致用户在输入时容易出现拼写错误。在这种情况下我有两个选择要么要求用户输入标签的完整名称要么提供一定的搜索灵活性即使存在一些小的拼写错误也能找到匹配项。例如用户可能输入“汽车和赛车运动”而实际标签却是“汽车.赛车运动”。这虽然只是细微的差别但足以导致标准搜索找不到匹配项。为了解决这个问题我实现了莱文斯坦距离计算方法。该方法可以确定将一个字符串转换为另一个字符串所需的插入、删除和替换操作次数。通过这种方法我不仅能够找到最相似的标签还能向用户展示几个相关的标签。在我的任务中我将莱文斯坦距离的阈值设定为 5。这意味着如果将输入的字符串转换为现有标签只需要不超过五次的插入、删除或替换操作则该标签被认为是合适的。如果需要更多修改我希望向用户显示没有找到符合其查询条件的标签。选择 5 这个数字是出于直觉。在实际操作中处理字符串及其比较时通常会使用高级算法这些算法不仅考虑基本的莱文斯坦距离还考虑字符替换、转置和其他操作等其他方面。为了确定莱文斯坦距离使用以下公式莱文斯坦公式这是一个用于计算长度分别为 M 和 N 的两个字符串 S1 和 S2 之间的莱文斯坦距离的递归公式。首先需要理解的是如果两个字符串都为空则它们之间的距离为 0。其次如果第一个字符串为空而第二个字符串的长度大于 0等于 N则需要执行 N 次插入操作才能使第一个空字符串与目标字符串匹配。因此如果 M 0 且 N 0则莱文斯坦距离为 N。最后如果 M 0 且 N 0则需要执行 M 次删除操作才能使目标字符串与目标空字符串匹配此时莱文斯坦距离为 M。三、算法分析如果两个字符串都不为空计算莱文斯坦距离的算法首先构建一个矩阵。在这个矩阵中第一行将原始字符串的符号分别放置在不同的列中第一列将待变换字符串的符号分别放置在不同的单元格中。实际上字符串的顺序可以任意因为将字符串 A 变换为字符串 B 所需的距离与将字符串 B 变换为字符串 A 所需的距离相同。此外每行的第一个符号应代表空字符串。这些空字符串对于计算基本情况至关重要。为了说明这一点我们来计算一下字符串 APPLE 和 APRLE 之间的莱文斯坦距离。矩阵初始化所需的距离值位于右下角的单元格中。要计算每个单元格的值我们需要知道其上方、左侧以及左对角线上的单元格的值。这意味着要获得右下角单元格的值我们必须计算整个矩阵中的值。首先我们需要将原始字符串的每个子字符串与待转换字符串的每个子字符串与空字符串进行比较。这被称为基准情况它将使我们能够获得初始数据以便后续正确地填充矩阵。当比较两个空字符串时显然将一个空字符串转换为另一个空字符串所需的运算次数为零。因此矩阵中的第一个值为 0。第一细胞接下来我们填充第一行和第一列。为了计算其他单元格的值我们将使用其左侧、上方以及左上方对角线上的单元格的值。但对于第一行我们只有左侧的单元格。左侧的单元格用于执行删除操作。因此使用公式D(i, j-1) 1其中i始终为 0因为它是第一行我们发现每个后续单元格的值都应该比前一个单元格的值大 1。这告诉我们例如要将子字符串APP删除为空字符串我们需要执行三次删除操作。第一列的情况也类似。唯一的区别在于对于第二列我们考虑的是插入操作的次数因为我们只能访问其上方的单元格。这样我们就可以回答例如“将空字符串转换为子字符串APR需要多少次插入操作”这样的问题。基本情况接下来对于每个单元格我们需要执行三个小操作得到这些操作的值找出这三个值中的最小值并将其记录在相应的单元格中。对于表示字符 A 和 A 交集的单元格 [1,1]我们需要检查删除的成本、插入的成本和替换的成本。给定单元格的值为i 1j 1。删除的代价是[i, j-1] 1 [1, 0] 1 1 1 2。插入成本为[i-1, j] 1 [0, 1] 1 1 1 2。替代成本为[i-1, j-1] m(a, b) [0, 0] m(a, b) 0 0 0。这里m(a, b) 是一个比较两个字符的函数如果两个字符相同则返回 0如果不同则返回 1。因此我们可以得出结论min(2, 2, 0) 等于 0所以单元格 D(1, 1) 的值为 0。在不同的情况下操作的成本可能会有所不同。在这种常规情况下删除、插入和替换操作的成本都相同即 1。细胞 1,1有人可能会问为什么我们需要用基本值初始化矩阵在上面的例子中最终的矩阵如下所示显然在替换操作的情况下单元格左侧和上方的值总是大于对角线上的值替换值。完整矩阵这是因为在上面的例子中我们比较的是长度相同的字符串删除、插入和替换操作的成本都相同。在这种情况下最优操作始终是替换如果替换的是不同的字符则最优操作是不进行任何操作。这是因为莱文斯坦距离公式的设计目标是最优的而替换操作比任何删除和插入的组合都更高效。因此在字符串长度相同且所有操作成本都相同的情况下可以通过仅计算对角线值来优化算法因为对这些字符串进行插入和删除操作的成本总是更高。但是如果我们考虑长度不同的字符串例如APP和APRLE情况就有所不同了。APP 和 APRLE 的矩阵在这种情况下我们不仅需要考虑替换操作还需要考虑删除操作。为了得到这个矩阵我们只需要从原矩阵中删除最后两列。然后我们立即看到右下角单元格中的值这将是问题的答案APP和APRLE之间的莱文斯坦距离是多少。计算莱文斯坦距离时最重要的是要理解它很大程度上依赖于累积效应。我们需要找到右下角单元格的值而只有准确计算出每个子串与其他所有子串之间的距离才能正确计算出该值。四、代码实现用 JavaScript 实现 Levenshtein 距离。代码尽可能简洁以便更好地理解其实现原理。function levenshteinDistance ( a, b ) { const matrix []; // 初始化矩阵 for ( let i 0 ; i a. length ; i) { matrix[i] []; for ( let j 0 ; j b. length ; j) { matrix[i][j] 0 ; } } // 基本情况初始化 for ( let i 0 ; i a. length ; i) { matrix[i][ 0 ] i; // 从 a 中删除所有字符的成本 } for ( let j 0 ; j b. length ; j) { matrix[ 0 ][j] j; // 从 b 中插入所有字符的成本 } // 填充矩阵 for ( let i 1 ; i a. length ; i) { for ( let j 1 ; j b. length ; j) { matrix[i][j] Math . min ( matrix[i - 1 ][j] 1 , // 删除 matrix[i][j - 1 ] 1 , // 插入 matrix[i - 1 ][j - 1 ] (a[i- 1 ] b[j- 1 ] ? 0 : 1 ) // 替换 ); } } // 返回莱文斯坦距离它 位于矩阵的右下角 return matrix[a.length ][b.length ] ; }

相关文章:

莱文斯坦距离基本原理

关键词:Levenshtein Distance 一、说明 莱文斯坦距离是用于衡量两个序列之间差异的字符串度量计算将一个字符串转换为另一个字符串所需的最少单字符编辑次数——插入、删除或替换。该算法由弗拉基米尔列文斯坦于1965年开发,广泛应用于拼写检查器、DNA分析…...

低空经济浪潮下的无人机结构设计与散热解决方案

🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 💌公众号:莱歌数字(B站同名) 📱个人微信:yanshanYH 211、985硕士,从业16年 从…...

在线问诊系统, 在线问诊平台, 互联网医院,2026java毕业设计项目, 简历项目, 个人学习项目

这是我们码上启航平台的一个新的原创项目【在线问诊平台】。项目是基于SpringBoot3vue3的前后端分离项目,该项目提供完整源代码SQL 脚本核心流程图和文档。可访问码上启航平台以获得“在线问诊平台”项目的源代码 一、项目功能描述 线上问诊系统是一个基于Web的在线…...

基于最小二乘支持向量机(LSSVM)的多输出数据回归预测

基于最小二乘支持向量机(LSSVM)的多输出数据回归预测 LSSVM多输出回归 matlab代码注:暂无Matlab版本要求 -- 推荐 2018B 版本及以上在数据处理与预测领域,最小二乘支持向量机(Least Squares Support Vector Machine, LSSVM)是一种…...

2026 年 3 月 15 日刷题

今天的题目是有关 BFS 广度优先搜索的。BFS 可以理解是从树的顶端一层一层往下逐层遍历。维护一个队列,在遍历过程中不断加入符合要求的元素,最后当队列为空时返回。207 课程表这道题目是拓扑排序,就是将一张有向无环图按照层次来遍历&#x…...

接收单元之变:SPAD-SoC如何重构激光雷达的“视网膜”

本文将从应用的角度出发,深入探讨SPAD-SoC在激光雷达中的技术原理、核心优势、面临挑战以及最新的产业化进展,论证为何SPAD-SoC是未来激光雷达接收单元不可逆转的发展方向。 01 接收单元技术谱系:从APD到SPAD-SoC 在深入讨论SPAD-SoC之前,我们有必要先厘清当前车载激光雷…...

2026年三防布批发TOP10企业揭晓,谁将领跑行业?

“老张,今年三防布的订单又爆了!”上周跟江苏南通做篷布批发的王老板吃饭,他举着手机给我看后台数据——单月出货量突破12万米,同比暴涨37%。这数据让我想起去年行业论坛上专家那句话:“2026年三防布市场规模将突破80亿…...

4节点光储直流微网:多目标控制下的光伏MPPT与储能双向DCDC的二次优化与多智能体一致性研究

4节点光储直流微网 领域:多目标控制、多智能体一致性、二次优化 15kW、400V级,阐述如下 : 光伏mppt:采用粒子群算法 储能双向DCDC: 电流内环采用模型预测控制 电压环采用分布式控制(含通讯) 初级控制采用下垂droop 二次控制采用差异性并加入电…...

CUDA编程学习(四)内存拷贝

本篇文章介绍如何把存储在主机内存上的数据拷贝到存储到设备显卡的内存上。我们将逐步分析代码&#xff0c;完整代码如下#include <cuda_runtime.h> #include "../common/common.h" #include <stdio.h>void initialData(float *ip,int size) {time_t t;s…...

2026多平台后台模板,包括:Html、Laravel、react、VUE、dotnet、angular

✨ 核心亮点✅ 全技术栈覆盖&#xff1a;囊括 Html 静态模板、Laravel 后端框架模板、React/VUE/Angular 前端框架模板、dotnet 微软系模板&#xff0c;一套搞定多场景开发&#xff1b;✅ 企业级标准&#xff1a;模板内置权限管理、数据可视化、表单校验、菜单路由等高频功能&a…...

基于MATLAB的Kmeans自动寻找最佳聚类中心App:‘手肘法‘确定k值与聚类结果可视化

基于MATLAB的Kmeans自动寻找最佳聚类中心App。 通过简单的界面操作&#xff0c;能够实现手肘法确定kmeans算法的最佳聚类数&#xff0c;并自动进行聚类&#xff0c;画图。 点击加载要聚类的数据——点击手肘法计算k值按键——根据生成的不同K值聚类偏差图&#xff0c;获得最佳聚…...

计算机毕业设计 java 虚拟股票交易系统 Java+SpringBoot 模拟股票交易平台 Web 版股市虚拟交易实训系统

计算机毕业设计 java 虚拟股票交易系统 z00to9&#xff08;配套有源码 程序 mysql 数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联 xi 可分享金融投资学习需求增长&#xff0c;新手缺乏安全实操环境&#xff0c;真实股票交易风险高、体验差…...

计算机毕业设计springboot基于Java的高校毕业实习管理系统的设计与实现 基于SpringBoot的高校毕业生实习信息管理平台的设计与实现 基于Java技术的高校学生顶岗实习综合服务平台

计算机毕业设计springboot基于Java的高校毕业实习管理系统的设计与实现jctd2693 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着高等教育的普及&#xff0c;每年有大量的学生…...

基于PSCAD仿真研究:三相空载输电线路过电压保护与断路器分合闸策略分析

pscad仿真 采用pscad搭建220kv三相空载输电线路&#xff0c;仿真合空线&#xff0c;切空线过电压&#xff0c;仿真避雷器&#xff0c;合闸电阻法抑制合闸过电压&#xff0c;仿真控制断路器三相分别在线路相电压为0&#xff0c;30&#xff0c;60&#xff0c;90分合闸的抑制过电压…...

计算机毕业设计 java 校园闲置交易平台 Java+SpringBoot 校园闲置物品交易平台 Web 版高校二手物品交换系统

计算机毕业设计 java 校园闲置交易平台 gb3869&#xff08;配套有源码 程序 mysql 数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联 xi 可分享随着校园物资丰富与环保理念普及&#xff0c;学生闲置物品增多&#xff0c;线下交易渠道窄、信息…...

个人项目复习-云盘Day03

考点13&#xff1a;大文件上传需求和常见问题普遍需求&#xff1a;在云存储、视频分享、在线教育等领域&#xff0c;用户上传大文件的需求日益普遍。核心挑战&#xff1a;网络波动、不稳定性及客户端资源限制&#xff0c;常给用户带来不佳体验&#xff1b;传统整文件上传易因中…...

基于comsol技术的磁可调双带高效吸收器

comsol磁可调双带吸收器。搞电磁超材料的兄弟应该都懂&#xff0c;玩双带吸收器最头疼的就是怎么动态调谐。传统结构一旦加工成型&#xff0c;吸收峰就焊死在固定频段了。最近在COMSOL里折腾磁可调方案发现个骚操作——在铁氧体基底里埋钇铁石榴石&#xff08;YIG&#xff09;阵…...

运维系列虚拟化系列OpenStack系列【仅供参考】:Service Plugin / Agent - 每5玩OpenStack(73) 两张图总结 Neutron 架构 - 每天5分钟玩转

Service Plugin / Agent - 每天5分钟玩转 OpenStack(73) && 两张图总结 Neutron 架构 - 每天5分钟玩转 OpenStack(74) Service Plugin / Agent - 每天5分钟玩转 OpenStack(73) DHCP Routing Firewall Load Balance 两张图总结 Neutron 架构 - 每天5分钟玩转 Open…...

运维系列虚拟化系列OpenStack系列【仅供参考】:详解 ML2 Core Plugin(II) - 每天5分钟玩转 OpenStack(72)

详解 ML2 Core Plugin(II) - 每天5分钟玩转 OpenStack(72) 详解 ML2 Core Plugin(II) - 每天5分钟玩转 OpenStack(72) Type Driver Mechanism Driver mechanism driver 有三种类型: Agent-based Controller-based 基于物理交换机 详解 ML2 Core Plugin(II) - 每天5分…...

运维系列虚拟化系列OpenStack系列【仅供参考】:Neutron 如何支持多种 network provider - 每5玩 OpenS-70 详解 ML2 Core Plugin(I)

Neutron 如何支持多种 network provider - 每天5分钟玩转 OpenStack(70) && 详解 ML2 Core Plugin(I) - 每天5分钟玩转 OpenStack(71) Neutron 如何支持多种 network provider - 每天5分钟玩转 OpenStack(70) linux bridge core plugin linux bridge agent 详解…...

从零起步学习MySQL 第十二章:MySQL分页性能如何优化?

前言&#xff1a;今天在看学长面经时发现了这样一个问题&#xff1a;字节三面——MySQL分页性能如何优化&#xff1f;作为后端开发工程师&#xff0c;分页是我们日常开发中高频接触的需求&#xff0c;小到后台管理系统的列表查询&#xff0c;大到百万级商品库的分页展示&#x…...

便捷省心!手机数码租赁小程序前端功能玩法详解

随着数码产品更新迭代速度加快&#xff0c;短期租赁成为不少用户体验新品、满足临时需求的优选方式。一款体验流畅的手机数码租赁小程序&#xff0c;其前端功能设计直接影响用户使用感受&#xff0c;以下从用户实际使用场景出发&#xff0c;详细介绍其核心功能玩法&#xff0c;…...

便捷寄件,省心直达——快递寄件小程序前端功能解析

日常工作生活中&#xff0c;快递寄件的便捷性的需求日益凸显&#xff0c;繁琐的寄件流程往往耗费人们大量时间。快递寄件小程序以用户核心需求为导向&#xff0c;打造简洁易用的前端功能&#xff0c;打通寄件全流程&#xff0c;弱化营销属性&#xff0c;专注为用户提供高效、省…...

一文带你深入了解Linux五种I/O模型和I/O多路复用

一文带你深入了解Linux五种I/O模型和I/O多路复用 文章目录一文带你深入了解Linux五种I/O模型和I/O多路复用一、几种典型 I/O 模型1. 阻塞 I/O2. 非阻塞 I/O3. 信号驱动 I/O4. I/O 多路复用&#xff08;高级 I/O&#xff09;5. 异步 I/O&#xff08;AIO&#xff09;二、阻塞与非…...

推荐常与服务器打交道的工程师都安装这款MCP工具

ssh-mcp&#xff0c;功能&#xff1a;让AI直接连接服务器进行操作 安装 # 1. Clone the repository: git clone https://github.com/tufantunc/ssh-mcp.git cd ssh-mcp# 2. Install dependencies: npm install &#xff08;需要你先安装nodejs&#xff09;然后在你的工…...

SourceTree cherry-pick遴选功能的使用

目录一. 使用场景二. 若使用merge功能三. 使用cherry-pick&#x1f352;遴选功能四. 代码合并一. 使用场景 &#x1f537;假设有如下的提交历史 其中提交E是一个bug修复提交D和F是正在开发中的功能 现在需要将E这次提交单独放到 main 中&#xff0c;注意我们只需要E这个单独…...

2026年编程指南:C、C++、C#同源不同命,选对高薪不是梦

挑选正确的编程语言&#xff0c;常常相较于一味埋头刻苦学习&#xff0c;更能够对未来五年你的职场身价起到决定作用。同样是进行代码编写&#xff0c;有人每月薪资能达到三万&#xff0c;有人却依旧在投递简历&#xff0c;两者之间的差距就存在于最开始做出的那个选择之上。 C…...

2026年品牌AI可见性危机:你的公司正在“隐身”?附优化完整指南

2026年&#xff0c;你的品牌在AI眼中是“隐形”的吗&#xff1f;GEO优化完整指南你问过AI这个问题吗&#xff1f;打开AI&#xff0c;问一句“推荐一个做XX的公司”&#xff0c;结果AI推荐的列表里有你的竞争对手&#xff0c;却没有你。这很让人头疼&#xff0c;但原因很简单&am…...

计算机毕业设计springboot基于Vue.js的养老护理员直聘网站 基于SpringBoot与Vue.js的养老服务人员智能匹配平台 采用前后端分离架构的康养护理人才在线招聘系统

计算机毕业设计springboot基于Vue.js的养老护理员直聘网站 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着我国人口老龄化程度持续加深&#xff0c;养老服务行业面临护理人…...

计算机毕业设计springboot基于Vue.js的企业资产管理系统 基于SpringBoot与Vue.js的企业固定资产全生命周期管理平台 采用前后端分离架构的企业设备资产数字化运营系统

计算机毕业设计springboot基于Vue.js的企业资产管理系统&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着企业规模的扩张与业务复杂度的提升&#xff0c;传统手工记录模式已难…...