C#,字符串相似度的莱文斯坦距离(Levenshtein Distance)算法与源代码

一、莱文斯坦(Levenshtein)

Vladimir I. Levenshtein

弗拉基米尔·I·列文施坦博士是纠错码理论的先驱,被称为俄罗斯编码理论之父。Levenshtein是莫斯科俄罗斯科学院Keldysh应用数学研究所的研究教授,他的贡献体现在消费者的日常生活中。他的“Levenshtein距离”或“编辑距离”是当今拼写检查计算机应用的根源;他还为第三代有线蜂窝电话的基础技术做出了贡献。

Levenshtein博士为度量空间(包括Hamming空间和欧几里德球面)中的代码和设计的最佳大小提供了最著名的通用边界。特别是,他们发现了长期以来寻找的n=8和n=24的接吻数字。Levenshtein博士为几个纠错问题撰写了最佳结构,包括:纠正四分之一或更多错误的代码;具有给定的无逗号索引的代码;完美的代码能够纠正单次删除和单峰位移;以及具有给定未检测错误概率的二进制代码。他在整数的通用高效编码方面的工作导致了算法在数据压缩方面提供了有前途的应用。

Levenshtein距离及其设计和界限广泛应用于许多工程、统计学和生物信息学应用中。他最近的一项研究是基于对几个损坏副本的观察,对信息进行有效解码,这项研究预计将在计算机科学、分子生物学、DNA分析、语音识别甚至剽窃检测等多个领域得到应用。

作为一名IEEE研究员,他是莫斯科数学学会的成员。

二、莱文斯坦距离(Levenshtein Distance)

莱文斯坦距离(Levenshtein Distance)用于衡量两个字符串之间的相似度。
莱文斯坦距离以俄国科学家(Vladimir I. Levenshtein)命名,他于1965年发明了这个算法。
莱文斯坦距离,是编辑距离(Edit Distance)的一种。
编辑距离一般是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
比如:两个字符串分别为a和b。
莱文斯坦距离被定义为:将字符串a变换为字符串b所需的删除、插入、替换操作的次数Ld。
 

 (比较稳定的非递归算法)源程序:

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
	public static partial class StringSearch
	{
		public static int Levenshtein_Distance(string str1, string str2)
		{
			int n = str1.Length;
			int m = str2.Length;
			if (n == 0)
			{
				return m;
			}
			if (m == 0)
			{
				return n;
			}

			int[,] matrix = new int[n + 1, m + 1];
			for (int i = 0; i <= n; i++)
			{
				matrix[i, 0] = i;
			}

			for (int j = 0; j <= m; j++)
			{
				matrix[0, j] = j;
			}

			for (int i = 1; i <= n; i++)
			{
				for (int j = 1; j <= m; j++)
				{
					int temp = (str1[i - 1] == str2[j - 1]) ? 0 : 1;
					matrix[i, j] = Triple_minium(matrix[i - 1, j] + 1, matrix[i, j - 1] + 1, matrix[i - 1, j - 1] + temp);
				}
			}
			return matrix[n, m];
		}

        private static int Triple_minium(int a, int b, int c)
		{
			return (a <= b && a <= c) ? a : ((b <= a && b <= c) ? b : c);
        }
    }
}

递归算法:

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
	public static partial class StringSearch
	{
		private static int Triple_minium(int a, int b, int c)
		{
			return (a <= b && a <= c) ? a : ((b <= a && b <= c) ? b : c);
		}

		public static int Levenshtein_Distance_Recurse_Original(string str1, int m, string str2, int n)
		{
			if (m == 0)
			{
				return n;
			}
			if (n == 0)
			{
				return m;
			}
			if (str1[m - 1] == str2[n - 1])
			{
				return Levenshtein_Distance_Recurse_Original(str1, m - 1, str2, n - 1);
			}
			int d1 = Levenshtein_Distance_Recurse_Original(str1, m, str2, n - 1);
			int d2 = Levenshtein_Distance_Recurse_Original(str1, m - 1, str2, n);
			int d3 = Levenshtein_Distance_Recurse_Original(str1, m - 1, str2, n - 1);

			return (1 + Triple_minium(d1, d2, d3));
		}
    }
}

矩阵双向迭代法的源代码:

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
	public static partial class StringSearch
	{
		public static int Levenshtein_Distance_2Directions(string str1, string str2)
		{
			int m = str1.Length;
			int n = str2.Length;
			int[,] L = new int[m + 1, n + 1];
			for (int i = 0; i <= m; i++)
			{
				for (int j = 0; j <= n; j++)
				{
					if (i == 0 || j == 0)
					{
						L[i, j] = 0;
					}
					else if (str1[i - 1] == str2[j - 1])
					{
						L[i, j] = L[i - 1, j - 1] + 1;
					}
					else
					{
						L[i, j] = Math.Max(L[i - 1, j], L[i, j - 1]);
					}
				}
			}
			int lcs = L[m, n];
			return (m - lcs) + (n - lcs);
		}
	}
}

——————————————————————

POWER BY TRUFFER.CN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/377495.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SERVLET过滤器

SERVLET过滤器 全球因特网用户使用不同类型的Web浏览器访问应用服务器上存储的Web应用程序。每个浏览器根据对应的Web浏览器窗口中的设置显示应用程序中的信息。Web应用程序可能会有一些客户机的Web浏览器不支持的HTML标记或功能。这种情况下,应用程序在客户机的Web浏览器中可…

Pandas文本数据处理大全:类型判断、空白字符处理、拆分与连接【第67篇—python:文本数据】

文章目录 Pandas文本数据处理大全&#xff1a;类型判断、空白字符处理、拆分与连接1. 判断文本数据类型2. 去除空白字符3. 文本数据拆分4. 文本数据连接5. 文本数据替换6. 文本数据匹配与提取7. 文本数据的大小写转换8. 文本数据的长度计算9. 文本数据的排序10. 文本数据的分组…

Spring如何扫描自定义的注解?

目录 一、Spring框架介绍 二、什么是自定义注解 三、如何扫描自定义的注解 一、Spring框架介绍 Spring框架是一个开源的Java应用程序框架&#xff0c;它提供了一种全面的编程和配置模型&#xff0c;用于构建现代化的企业级应用程序。Spring框架的核心原则是依赖注入&#x…

Tkinter教程21:Listbox列表框+OptionMenu选项菜单+Combobox下拉列表框控件的使用+绑定事件

------------★Tkinter系列教程★------------ Tkinter教程21&#xff1a;Listbox列表框OptionMenu选项菜单Combobox下拉列表框控件的使用绑定事件 Tkinter教程20&#xff1a;treeview树视图组件&#xff0c;表格数据的插入与表头排序 Python教程57&#xff1a;tkinter中如何…

【数据库】索引的使用

【数据库】索引的使用 前言出发示例创建表Explain 查看sql执行计划where 查询解析无索引有索引 where oderBy 查询解析无索引有索引 总结 前言 在数据库设计过程中&#xff0c;常需要考虑性能&#xff0c;好的设计可以大大提高sql 语句的增删改查速度。在表的创建过程中&…

IEC 104电力规约详细解读(三) - 遥信

1.功能简述 遥信&#xff0c;、即状态量&#xff0c;是为了将断路器、隔离开关、中央信号等位置信号上送到监控后台的信息。遥信信息包括&#xff1a;反应电网运行拓扑方式的位置信息。如断路器状态、隔离开关状态&#xff1b;反应一次二次设备工作状况的运行信息&#xff0c;如…

OOD分类项目训练

一、项目地址 GitHub - LooKing9218/UIOS 二、label制作 将训练、验证、测试数据的分类信息转换入.csv文件中&#xff0c;运行如下脚本即可&#xff1a; import os import csv#要读取的训练、验证、测试文件的目录&#xff0c;该文件下保存着以各个类别命名的文件夹和对应的分…

Unity SRP 管线【第十讲:SRP/URP 图形API】

Unity 封装的图形API 文章目录 Unity 封装的图形API一、 CommandBuffer 要执行的图形命令列表1. CommandBuffer 属性2. CommandBuffer 常用图形API&#xff08;方法&#xff09;(1)设置(2)获取临时纹理 GetTemporaryRT以及释放(3)设置纹理为渲染目标 SetRenderTarget(4)Command…

CV | SAM在医学影像上的模型调研【20240207更新版】

本文主要是SAM&#xff08;Segment Anything&#xff09;在医学影像上的数据集&#xff0c;模型及评估方法调研【持续更新】~ 1.开源数据集 可参考这篇【数据集 | 基于计算机视觉的医学影像处理数据集_CSDN博客】 2.算法模型 2023.04_SAM 论文&#xff1a;2018.08.05v_Segm…

MySQL数据库⑤_基本查询DQL_表的增删查改DML

目录 1. CRUD介绍 2. Create 新增 2.1 单行数据全列插入 2.2 多行数据指定列插入 2.3 插入否则更新 2.4 替换数据 3. Retrieve 查找 3.1 select 查询 3.2 where 条件 3.2.1 MySQL运算符 3.2.2 NULL的查询 3.3 order by 结果排序 3.4 limit 筛选分页结果 4. Updat…

机器学习1一knn算法

1.基础知识点介绍 曼哈顿距离一般是比欧式距离长的除非在一维空间 拐弯的就是曼哈顿距离 Knn查看前5行数据head()&#xff0c;info看空非空 查看特征对应的类型 Head()默认前5行&#xff0c;head&#xff08;3&#xff09;就是前3行数据 Unique()可以查看分类后的结果 csv的…

MongoDB部署策略

内 容 简 介 本文介绍了MongoDB数据库的优点的数据存储模式的安装部署过程。 利用MongoDB在存储海量数据上的优势&#xff0c;部署存储空间大数据。 欢迎批评指正补充 由于编者水平有限&#xff0c;所搜集资料也很有限&#xff0c;制定的规范肯定有考虑不周全、甚至完全错误…

JavaEE作业-实验三

目录 1 实验内容 2 实验要求 3 思路 4 核心代码 5 实验结果 1 实验内容 简单的线上图书交易系统的web层 2 实验要求 ①采用SpringMVC框架&#xff0c;采用REST风格 ②要求具有如下功能&#xff1a;商品分类、订单、购物车、库存 ③独立完成&#xff0c;编写实验报告 …

Linux---线程

线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列” 一切进程至少都有一个执行线程 线程在进程内部运行&#xff0c;本质是在进程地址空间内运行 在Linux系统中&#xff0c;在CPU眼中…

java学习06---方法

一 方法 方法&#xff08;method&#xff09;是程序中最小的执行单元 注意&#xff1a; 方法必须先创建才可以使用&#xff0c;该过程成为方法定义 方法创建后并不是直接可以运行的&#xff0c;需要手动使用后&#xff0c;才执行&#xff0c;该过程成为方法调用 二 方法的…

(注解配置AOP)学习Spring的第十七天

基于注解配置的AOP 来看注解式开发 : 先把目标与通知放到Spring里管理 : Service("userService") public class UserServiceImpl implements UserService {Overridepublic void show1() {System.out.println("show1......");}Overridepublic void show2…

SpringBoot + Tess4J 实现本地与远程图片的文字识别

1 前言 1.1 概要 在本文中&#xff0c;我们将探讨如何在Spring Boot应用程序里集成Tess4J来实现OCR&#xff08;光学字符识别&#xff09;&#xff0c;以识别出本地和远程图片中的文字。 我们将从添加依赖说起&#xff0c;然后创建服务类以实现OCR&#xff0c;最后展示如何处…

Java项目使用jasypt加密和解密配置文件中关键信息

一、使用背景 项目中application.yml 配置文件中&#xff0c;如数据库、redis、加密算法的私钥等各种配置的username&#xff0c;password的值都是明文的&#xff0c;其实存在一定的安全隐患&#xff0c;如果被人拿到这些配置文件&#xff0c;将直接对系统安全构成极大威胁&…

多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测

多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测 目录 多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预…

【PyQt】06-.ui文件转.py文件

文章目录 前言方法一、基本脚本查看自己的uic安装目录 方法二、添加到扩展工具里面&#xff08;失败了&#xff09;方法二的成功步骤总结 前言 方法一、基本脚本 将Qt Designer&#xff08;一种图形用户界面设计工具&#xff09;生成的.ui文件转换为Python代码的脚本。 pytho…