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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络技术】【Kali Linux】Nmap 嗅探(一)简单扫描

一、实验环境 本次实验进行简单的Nmap扫描&#xff0c;实验使用 Kali Linux 虚拟机和 Ubuntu Linux 虚拟机完成&#xff0c;主机操作系统为 Windows 11&#xff0c;虚拟化平台选择 Oracle VM VirtualBox&#xff0c;如下图所示。 二、实验步骤 1、相关配置 Kali Linux 虚拟机…

10个简单有效的编辑PDF文件工具分享

10个编辑PDF文件工具作为作家、编辑或专业人士&#xff0c;您可能经常发现自己在处理 PDF 文件。无论您是审阅文档、创建报告还是与他人共享工作&#xff0c;拥有一个可靠的 PDF 编辑器供您使用都非常重要。 10个简单适用的编辑PDF文件工具 在本文中&#xff0c;我们将介绍当今…

Verilog刷题笔记23

题目: Suppose you’re building a circuit to process scancodes from a PS/2 keyboard for a game. Given the last two bytes of scancodes received, you need to indicate whether one of the arrow keys on the keyboard have been pressed. This involves a fairly simp…

2/7 算法每日N题(二分+双指针)

第一题&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0, right nums.size() - 1;while(left < right){int mid (right - left) / 2 left;int num nums[mid];if (num target) {return mid;} else if (num >…

React | Center 组件

在 Flutter 中有 Center 组件&#xff0c;效果就是让子组件整体居中&#xff0c;挺好用。 React 中虽然没有对应的组件&#xff0c;但是可以简单封装一个&#xff1a; index.less .container {display: flex;justify-content: center;align-items: center;align-content: ce…

Pandas 对带有 Multi-column(多列名称) 的数据排序并写入 Excel 中

Pandas 从Excel 中读取带有 Multi-column的数据 正文 正文 我们使用如下方式写入数据&#xff1a; import pandas as pd import numpy as npdf pd.DataFrame(np.array([[10, 2, 0], [6, 1, 3], [8, 10, 7], [1, 3, 7]]), columns[[Number, Name, Name, ], [col 1, col 2, co…

DIFFER,一种用于测试和验证转换程序的新工具

我们最近发布了一个新的差异测试工具&#xff0c;称为 DIFFER&#xff0c;用于查找转换后的程序中的错误和健全性违规。 DIFFER 结合了差分、回归和模糊测试的元素&#xff0c;帮助用户发现被软件重写、反膨胀和强化工具更改的程序中的错误。我们使用 DIFFER 评估了 10 个软件反…

数据库管理-第147期 最强Oracle监控EMCC深入使用-04(20240207)

数据库管理147期 2024-02-07 数据库管理-第147期 最强Oracle监控EMCC深入使用-04&#xff08;20240207&#xff09;1 发现Exadata2 Exadata监控计算节点&#xff1a;存储节点RoCE交换机管理交换机PDU 总结 数据库管理-第147期 最强Oracle监控EMCC深入使用-04&#xff08;202402…

Oracle 面试题 | 18.精选Oracle高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

25、数据结构/二叉树相关练习20240207

一、二叉树相关练习 请编程实现二叉树的操作 1.二叉树的创建 2.二叉树的先序遍历 3.二叉树的中序遍历 4.二叉树的后序遍历 5.二叉树各个节点度的个数 6.二叉树的深度 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> ty…

Java面向对象 封装

目录 封装的概念“高内聚&#xff0c;低耦合”封装的好处实例案例测试 封装的概念 封装是把过程和数据包围起来&#xff0c;对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念&#xff0c;即现实世界可以被描绘成一系列完全自治、封装的对象&#xff0c;这些对…

0207作业

继承&#xff1a;是 C中类的一个重要特性&#xff0c;它允许一个类从另一个类中继承成员变量和成员函数。通过继承&#xff0c;可以在子类中重用父类的代码&#xff0c;并可以根据需要进行扩展和修改。继承关系形成了类的层次结构。 虚继承&#xff1a;是一种特殊的继承方式&a…