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.mzph.cn/news/673416.shtml

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

相关文章

PyTorch中torchvision库的详细介绍

torchvision 是 PyTorch 生态系统中的一个关键库&#xff0c;专门为计算机视觉任务设计和优化。它提供了以下几个核心功能&#xff1a; 数据集&#xff1a;内置了多种广泛使用的图像和视频数据集&#xff0c;如 MNIST、CIFAR10/100、Fashion-MNIST、ImageNet、COCO 等&#xff…

Linux中的numactl命令指南

假设我们想控制线程如何被分配到处理器核心&#xff0c;或者选择我们想分配数据的位置&#xff0c;那么numactl命令就适合此类任务。在这篇文章中&#xff0c;我们讨论了如何使用numactl命令执行此类操作。 目录&#xff1a; 介绍语法命令总结参考文献 简介 现代处理器采用…

QGIS编译(跨平台编译)之五十一:Shapelib编译(Windows、Linux、MacOS环境下编译)

文章目录 一、Shapelib介绍二、Shapelib下载三、Windows下编译四、Linux下编译五、MacOS下编译一、Shapelib介绍 Shapelib是一个开源的C/C++库,用于读取、写入和处理ESRI Shapefile格式的空间数据。Shapefile是一种常用的GIS数据格式,包含矢量数据,如点、线、面等。Shapeli…

rkmedia使用记录

1.函数 1&#xff09; RK_MPI_VI_SetChnAttr _CAPI RK_S32 RK_MPI_VI_SetChnAttr(VI_PIPE ViPipe, VI_CHN ViChn,const VI_CHN_ATTR_S *pstChnAttr); /*VI通道属性结构体指针1&#xff09;pcVideoNode&#xff1a;video节点路径2&#xff09;u32BufCnt&#xff1a;VI捕获视频…

ROS学习笔记13:导航相关消息

前言 本人ROS小白&#xff0c;利用寒假时间学习ROS&#xff0c;在此以笔记的方式记录自己每天的学习过程。争取写满20篇(13/20)。 环境&#xff1a;Ubuntu20.04、ROS1&#xff1a;noetic 环境配置&#xff1a;严格按照下方学习链接的教程配置&#xff0c;基本一次成功。 学习链…

VBA技术资料MF116:测试操作系统是否为64位

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

洛谷P1039 [NOIP2003提高组]侦探推理

题目描述 明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中&#xff0c;于是他召集了一群同学玩推理游戏。游戏的内容是这样的&#xff0c;明明的同学们先商量好由其中的一个人充当罪犯&#xff08;在明明不知情的情况下&#xff09;&#xff0c;明明的任务就是找出这…

Android Studio 2022.3.1版本 引入包、maven等需要注意的问题

普通包 以前&#xff1a; // okhttp3 implementation com.squareup.okhttp3:okhttp:3.10.0 新版本&#xff1a; implementation("com.github.bumptech.glide:glide:3.7.0") libs文件夹中的包 以前&#xff1a; android {******sourceSets.main{jniLibs.srcDir…

使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密)

一、前言 在业务系统开发过程中,我们必不可少的会使用数据库,在应用开发过程中,数据库连接信息往往都是以明文的方式配置到yaml配置文件中的,这样有密码泄露的风险,那么有没有什么方式可以避免呢?方案当然是有的,就是对数据库密码配置的时候进行加密,然后读取的时候再…

人工智能|推荐系统——基于tensorflow的个性化电影推荐系统实战(有前端)

代码下载&#xff1a; 基于tensorflow的个性化电影推荐系统实战(有前端).zip资源-CSDN文库 项目简介&#xff1a; dl_re_web : Web 项目的文件夹re_sys&#xff1a; Web app model&#xff1a;百度云下载之后&#xff0c;把model放到该文件夹下recommend&#xff1a; 网络模型相…

Python在小型无人机

Python在小型无人机的发展和研发中具有重要性。以下是几个原因&#xff1a; 简单易学&#xff1a;Python是一种简单易学的编程语言&#xff0c;具有简洁的语法和易于理解的语言结构。这使得开发人员可以更快速地理解和编写代码&#xff0c;从而加快了研发的进程。 多用途性&am…

Android 自定义BaseActivity

直接上代码&#xff1a; BaseActivity代码&#xff1a; package com.example.custom.activity;import android.annotation.SuppressLint; import android.app.Activity; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.os.Looper; impor…

寒假作业-day5

1>现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用直接插入排序实现升序排序 函数4:请使用插入排序实现升序排序 代码&#xff1a; #include<stdio.h&g…

macbook电脑如何永久删除app软件?

在使用MacBook的过程中&#xff0c;我们经常会下载各种App来满足日常的工作和娱乐需求。然而&#xff0c;随着时间的积累&#xff0c;这些App不仅占据了宝贵的硬盘空间&#xff0c;还可能拖慢电脑的运行速度。那么&#xff0c;如何有效地管理和删除这些不再需要的App呢&#xf…

如何使用websocket

如何使用websocket 之前看到过一个面试题&#xff1a;吃饭点餐的小程序里&#xff0c;同一桌的用户点餐菜单如何做到的实时同步&#xff1f; 答案就是&#xff1a;使用websocket使数据变动时服务端实时推送消息给其他用户。 最近在我们自己的项目中我也遇到了类似问题&#xf…

使用CMSIS-DSP库进行嵌入式音频信号处理

在嵌入式环境下&#xff0c;使用CMSIS-DSP库进行音频信号处理是一种常见的应用场景。通过CMSIS-DSP库&#xff0c;开发人员可以利用嵌入式系统的处理能力来实现各种数字信号处理&#xff08;DSP&#xff09;功能&#xff0c;例如音频滤波、均衡器、噪音消除等。本文将介绍如何在…

问题 | IT行业有哪些证书含金量高?

IT行业有哪些证书含金量高? Cisco认证&#xff08;CCNA&#xff0c;CCNP&#xff0c;CCIE&#xff09;&#xff1a;思科是全球最大的网络设备供应商之一&#xff0c;它的认证证书在网络和通信领域被广泛认可。CCNA是初级认证&#xff0c;CCNP是高级认证&#xff0c;而CCIE是专…

NLP_Seq2Seq编码器-解码器架构

文章目录 Seq2Seq架构构建简单Seq2Seq架构1.构建实验语料库和词汇表2.生成Seq2Seq训练数据3. 定义编码器和解码器类4.定义Seq2Seq架构5. 训练Seq2Seq架构6.测试Seq2Seq架构 归纳Seq2Seq编码器-解码器架构小结 Seq2Seq架构 起初&#xff0c;人们尝试使用一个独立的RNN来解决这种…

CentOS7搭建Hadoop集群

准备工作 1、准备三台虚拟机&#xff0c;参考&#xff1a;CentOS7集群环境搭建&#xff08;3台&#xff09;-CSDN博客 2、配置虚拟机之间免密登录&#xff0c;参考&#xff1a;CentOS7集群配置免密登录-CSDN博客 3、虚拟机分别安装jdk&#xff0c;参考&#xff1a;CentOS7集…

【51单片机】实现一个动静态数码管显示项目(前置知识铺垫,代码&图演示)(5)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY…