字符串编辑距离: 是一种字符串之间相似度计算的方法。给定两个字符串S、T,将S转换成T所需要的删除,插入,替换操作的数量就叫做S到T的编辑路径。而最短的编辑路径就叫做字符串S和T的编辑距离。
举个例子:S=“eeba” T="abac" 我们可以按照这样的步骤转变:(1) 将S中的第一个e变成a;(2) 删除S中的第二个e;(3)在S中最后添加一个c; 那么S到T的编辑路径就等于3。当然,这种变换并不是唯一的,但如果3是所有变换中最小值的话。那么我们就可以说S和T的编辑距离等于3了。
动态规划解决编辑距离
动态规划(dynamic programming)是一种解决复杂问题最优解的策略。它的基本思路就是:将一个复杂的最优解问题分解成一系列较为简单的最优解问题,再将较为简单的的最优解问题进一步分解,直到可以一眼看出最优解为止。
动态规划算法是解决复杂问题最优解的重要算法。其算法的难度并不在于算法本身的递归难以实现,而主要是编程者对问题本身的认识是否符合动态规划的思想。现在我们就来看看动态规划是如何解决编辑距离的。
还是这个例子:S=“eeba” T="abac" 。我们发现当S只有一个字符e、T只有一个字符a的时候,我们马上就能得到S和T的编辑距离edit(0,0)=1(将e替换成a)。那么如果S中有1个字符e、T中有两个字符ab的时候,我们是不是可以这样分解:edit(0,1)=edit(0,0)+1(将e替换成a后,在添加一个b)。如果S中有两个字符ee,T中有两个字符ab的时候,我们是不是可以分解成:edit(1,1)=min(edit(0,1)+1, edit(1,0)+1, edit(0,0)+f(1,1)). 这样我们可以得到这样一些动态规划公式:
如果i=0且j=0 edit(0, 0)=1
如果i=0且j>0 edit(0, j )=edit(0, j-1)+1
如果i>0且j=0 edit( i, 0 )=edit(i-1, 0)+1
如果i>0且j>0 edit(i, j)=min(edit(i-1, j)+1, edit(i,j-1)+1, edit(i-1,j-1)+f(i , j) )
小注:edit(i,j)表示S中[0.... i]的子串 si 到T中[0....j]的子串t1的编辑距离。f(i,j)表示S中第i个字符s(i)转换到T中第j个字符s(j)所需要的操作次数,如果s(i)==s(j),则不需要任何操作f(i, j)=0; 否则,需要替换操作,f(i, j)=1 。
这就是将长字符串间的编辑距离问题一步一步转换成短字符串间的编辑距离问题,直至只有1个字符的串间编辑距离为1。
// Dis.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string> using namespace std; int min(int a, int b) { return a < b ? a : b; } int edit(string str1, string str2) { int max1 = str1.size(); int max2 = str2.size(); int **ptr = new int*[max1 + 1]; for(int i = 0; i < max1 + 1 ;i++) { ptr[i] = new int[max2 + 1]; } for(int i = 0 ;i < max1 + 1 ;i++) { ptr[i][0] = i; } for(int i = 0 ;i < max2 + 1;i++) { ptr[0][i] = i; } for(int i = 1 ;i < max1 + 1 ;i++) { for(int j = 1 ;j< max2 + 1; j++) { int d; int temp = min(ptr[i-1][j] + 1, ptr[i][j-1] + 1); if(str1[i-1] == str2[j-1]) { d = 0 ; } else { d = 1 ; } ptr[i][j] = min(temp, ptr[i-1][j-1] + d); } } cout << "**************************" << endl; for(int i = 0 ;i < max1 + 1 ;i++) { for(int j = 0; j< max2 + 1; j++) { cout << ptr[i][j] << " " ; } cout << endl; } cout << "**************************" << endl; int dis = ptr[max1][max2]; for(int i = 0; i < max1 + 1; i++) { delete[] ptr[i]; ptr[i] = NULL; } delete[] ptr; ptr = NULL; return dis; } int _tmain(int argc, _TCHAR* argv[]) { string str1 = "123"; string str2 = "1234"; int r = edit(str1, str2); cout << "the dis is : " << r << endl; std::system("pause"); return 0; }
相关推荐
编辑距离算法,也称为Levenshtein距离,是计算两个字符串之间差异的一种度量方法,广泛应用于文本处理、拼写纠正、生物信息学等领域。它通过衡量将一个字符串转换为另一个字符串所需的最少单字符操作数(包括删除、...
该文介绍编辑距离算法的原理;通过该文,可学习编辑距离算法的相关知识,可进一步理解Elasticsearch中建议提示搜索中的计算模型!
编辑距离算法描述了将一个字符串转换为另一个字符串的最少单字符编辑(插入、删除或替换)次数。这个概念在信息检索、数据清洗和生物信息学等领域有着广泛的应用。 编辑距离算法的基本思想是通过动态规划来实现。...
编辑距离算法,比较字符串相似度 pb11.5版本
编辑距离算法,也被称为Levenshtein距离,是一种在信息技术和计算机科学中广泛使用的字符串度量方法。这个算法由俄国科学家Vladimir Levenshtein在1965年提出,用于衡量两个字符串之间的相似度。它定义了将一个字符...
### 编辑距离算法及其在网页搜索中的应用 #### 概述 在互联网时代,搜索引擎作为获取信息的主要工具之一,其核心竞争力在于如何更准确、更高效地将用户查询与相关网页进行匹配。传统的相关性排序算法往往侧重于...
编辑距离算法,也被称为Levenshtein距离,是一种衡量两个字符串相似度的度量方法。在信息技术、自然语言处理和生物信息学等领域有着广泛应用。它定义了将一个字符串转换成另一个字符串所需的最少单字符编辑操作次数...
编辑距离算法的基本思想是通过插入、删除和替换操作来转换一个字符串成另一个字符串,计算这些操作的最小次数。这个算法的核心在于动态规划,它解决了如何在两个字符串之间找到最短的编辑路径的问题。《算法导论》是...
在自然语言处理和文本分析的众多算法中,编辑距离算法一直是衡量两个字符串相似度的重要工具。编辑距离算法的优化与实现,不但可以提高文本处理的效率,还能够增强处理结果的准确性。本文针对编辑距离算法的传统不足...
编辑距离算法,也被称为Levenshtein距离,是一种衡量两个字符串相似度的度量方法。在易语言中实现编辑距离算法,可以用于文本比较、拼写检查、数据纠错等多种应用场景。下面将详细介绍编辑距离算法的基本原理、实现...
易语言验证码编辑距离算法源码是一种用于识别和比较文本字符串的技术,主要应用于自动化处理中,例如验证码识别、拼写检查和自动纠错等场景。编辑距离算法,也称为Levenshtein距离,是衡量两个字符串之间差异程度的...
`fasta`算法、`Smith-Waterman`(SW)算法、编辑距离算法以及最长公共子串算法都是这一领域中常用的序列比对方法。下面将详细介绍这些算法。 1. **fasta算法** `fasta`算法是一种快速的全局序列比对方法,由Pearson...
易语言源码易语言编辑距离算法源码.rar 易语言源码易语言编辑距离算法源码.rar 易语言源码易语言编辑距离算法源码.rar 易语言源码易语言编辑距离算法源码.rar 易语言源码易语言编辑距离算法源码.rar 易语言源码...
编辑距离算法,即Levenshtein Distance (LD)算法。 这个算法其实是一个动态规划(DP)。levenshtein() 返回两个字符串之间的 Levenshtein 距离。 Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个...
编辑距离算法,也称为Levenshtein距离,是一种衡量两个字符串相似度的度量方法。在数据处理,尤其是大数据分析和文本相似性比较中,它具有广泛的应用。原版的编辑距离算法允许通过插入、删除和替换操作将一个字符串...
算法导论:15-3编辑距离,把一个源文本串转变为一个目标串
编辑距离问题是一个经典的计算机科学问题,它涉及到字符串的相似度计算和序列的比较。这个问题的主要目标是找到将一个字符串转换成另一个...通过理解和实现编辑距离算法,我们可以更好地理解和处理字符串相似度的问题。