`

文本比较算法——LD算法

 
阅读更多

       在日常应用中,文本比较是一个比较常见的问题。文本比较算法也是一个老生常谈的话题。

  文本比较的核心就是比较两个给定的文本(可以是字节流等)之间的差异。目前,主流的比较文本之间的差异主要有两大类。一类是基于编辑距离 (Edit Distance)的,例如LD算法。一类是基于最长公共子串的(Longest Common Subsequence),例如Needleman/Wunsch算法等。

  LD算法(Levenshtein Distance)又成为编辑距离算法(Edit Distance)。他是以字符串A通过插入字符、删除字符、替换字符变成另一个字符串B,那么操作的过程的次数表示两个字符串的差异。

  例如:字符串A:kitten如何变成字符串B:sitting。

    第一步:kitten——》sitten。k替换成s

    第二步:sitten——》sittin。e替换成i

    第三步:sittin——》sitting。在末尾插入g

  故kitten和sitting的编辑距离为3

 

  定义说明:

  LD(A,B)表示字符串A和字符串B的编辑距离。很显然,若LD(A,B)=0表示字符串A和字符串B完全相同

  Rev(A)表示反转字符串A

  Len(A)表示字符串A的长度

  A+B表示连接字符串A和字符串B

  

  有下面几个性质:

  LD(A,A)=0

  LD(A,"")=Len(A)

  LD(A,B)=LD(B,A)

  0≤LD(A,B)≤Max(Len(A),Len(B))

  LD(A,B)=LD(Rev(A),Rev(B))

  LD(A+C,B+C)=LD(A,B)

  LD(A+B,A+C)=LD(B,C)

  LD(A,B)≤LD(A,C)+LD(B,C)(注:像不像“三角形,两边之和大于第三边”)

  LD(A+C,B)≤LD(A,B)+LD(B,C)

 

  为了讲解计算LD(A,B),特给予以下几个定义

  A=a1a2……aN,表示A是由a1a2……aN这N个字符组成,Len(A)=N

  B=b1b2……bM,表示B是由b1b2……bM这M个字符组成,Len(B)=M

  定义LD(i,j)=LD(a1a2……ai,b1b2……bj),其中0≤i≤N,0≤j≤M

  故:  LD(N,M)=LD(A,B)

      LD(0,0)=0

      LD(0,j)=j

      LD(i,0)=i

 

  对于1≤i≤N,1≤j≤M,有公式一

  若ai=bj,则LD(i,j)=LD(i-1,j-1)

  若ai≠bj,则LD(i,j)=Min(LD(i-1,j-1),LD(i-1,j),LD(i,j-1))+1

 

  举例说明:A=GGATCGA,B=GAATTCAGTTA,计算LD(A,B)

  第一步:初始化LD矩阵  

 

 

LD算法矩阵
    G A A T T C A G T T A   G G A T C G A
0 1 2 3 4 5 6 7 8 9 10 11
1                      
2                      
3                      
4                      
5                      
6                      
7                      

 

  第二步:利用上述的公式一,计算第一行

 

 

LD算法矩阵
    G A A T T C A G T T A   G G A T C G A
0 1 2 3 4 5 6 7 8 9 10 11
1 0 1 2 3 4 5 6 7 8 9 10
2                      
3                      
4                      
5                      
6                      
7                      

 

  第三步,利用上述的公示一,计算其余各行 

 

LD算法矩阵
    G A A T T C A G T T A   G G A T C G A
0 1 2 3 4 5 6 7 8 9 10 11
1 0 1 2 3 4 5 6 7 8 9 10
2 1 1 2 3 4 5 6 6 7 8 9
3 2 1 1 2 3 4 5 6 7 8 8
4 3 2 2 1 2 3 4 5 6 7 8
5 4 3 3 2 2 2 3 4 5 6 7
6 5 4 4 3 3 3 3 3 4 5 6
7 6 5 4 4 4 4 3 4 4 5 5

 

  则LD(A,B)=LD(7,11)=5。

 

       这个LD算法时间复杂度为O(MN),空间复杂度为O(MN);

 

       我们往往不仅仅是计算出字符串A和字符串B的编辑距离,还要能得出他们的匹配结果。

  以上面为例A=GGATCGA,B=GAATTCAGTTA,LD(A,B)=5

  他们的匹配为:

    A:GGA_TC_G__A

    B:GAATTCAGTTA

  如上面所示,蓝色表示完全匹配,黑色表示编辑操作,_表示插入字符或者是删除字符操作。如上面所示,黑色字符有5个,表示编辑距离为5。

  利用上面的LD矩阵,通过回溯,能找到匹配字串

  第一步:定位在矩阵的右下角  

 

 

 

LD算法矩阵
    G A A T T C A G T T A   G G A T C G A
0 1 2 3 4 5 6 7 8 9 10 11
1 0 1 2 3 4 5 6 7 8 9 10
2 1 1 2 3 4 5 6 6 7 8 9
3 2 1 1 2 3 4 5 6 7 8 8
4 3 2 2 1 2 3 4 5 6 7 8
5 4 3 3 2 2 2 3 4 5 6 7
6 5 4 4 3 3 3 3 3 4 5 6
7 6 5 4 4 4 4 3 4 4 5 5

 

  第二步:回溯单元格,至矩阵的左上角

    若ai=bj,则回溯到左上角单元格

 

LD算法矩阵
    G A A T T C A G T T A   G G A T C G A
0 1 2 3 4 5 6 7 8 9 10 11
1 0 1 2 3 4 5 6 7 8 9 10
2 1 1 2 3 4 5 6 6 7 8 9
3 2 1 1 2 3 4 5 6 7 8 8
4 3 2 2 1 2 3 4 5 6 7 8
5 4 3 3 2 2 2 3 4 5 6 7
6 5 4 4 3 3 3 3 3 4 5 6
7 6 5 4 4 4 4 3 4 4 5 5

    若ai≠bj,回溯到左上角、上边、左边中值最小的单元格,若有相同最小值的单元格,优先级按照左上角、上边、左边的顺序

 

LD算法矩阵
    G A A T T C A G T T A   G G A T C G A
0 1 2 3 4 5 6 7 8 9 10 11
1 0 1 2 3 4 5 6 7 8 9 10
2 1 1 2 3 4 5 6 6 7 8 9
3 2 1 1 2 3 4 5 6 7 8 8
4 3 2 2 1 2 3 4 5 6 7 8
5 4 3 3 2 2 2 3 4 5 6 7
6 5 4 4 3 3 3 3 3 4 5 6
7 6 5 4 4 4 4 3 4 4 5 5

    若当前单元格是在矩阵的第一行,则回溯至左边的单元格

    若当前单元格是在矩阵的第一列,则回溯至上边的单元格

 

LD算法矩阵
    G A A T T C A G T T A   G G A T C G A
0 1 2 3 4 5 6 7 8 9 10 11
1 0 1 2 3 4 5 6 7 8 9 10
2 1 1 2 3 4 5 6 6 7 8 9
3 2 1 1 2 3 4 5 6 7 8 8
4 3 2 2 1 2 3 4 5 6 7 8
5 4 3 3 2 2 2 3 4 5 6 7
6 5 4 4 3 3 3 3 3 4 5 6
7 6 5 4 4 4 4 3 4 4 5 5

    依照上面的回溯法则,回溯到矩阵的左上角

  第三步:根据回溯路径,写出匹配字串

    若回溯到左上角单元格,将ai添加到匹配字串A,将bj添加到匹配字串B

    若回溯到上边单元格,将ai添加到匹配字串A,将_添加到匹配字串B

    若回溯到左边单元格,将_添加到匹配字串A,将bj添加到匹配字串B

    搜索晚整个匹配路径,匹配字串也就完成了

 

参考来源:http://www.cnblogs.com/grenet/archive/2010/06/01/1748448.html

分享到:
评论

相关推荐

    文本比较算法Ⅰ——LD算法.doc

    文本比较算法Ⅰ——LD算法.doc

    ld.rar_LD算法_edit distance_最小编辑距离_编辑距离

    标签中的“ld算法”、“edit_distance”、“最小编辑距离”和“编辑距离”都是对同一个概念的不同表述,即上述的莱文斯坦距离。 压缩包中的文件“www.pudn.com.txt”可能是某个网站或论坛上关于这个话题的讨论记录...

    字符串相似度算法 levenshtein distance 编辑距离算法

    **字符串相似度算法——Levenshtein Distance(编辑距离)** 在信息技术和计算机科学领域,字符串相似度计算是一个重要的概念,特别是在文本处理、搜索引擎优化、数据校验和生物信息学等多个场景中。Levenshtein ...

    LD3320语音识别完整资料(PCB、原理图、程序).zip

    本资料包——"LD3320语音识别完整资料(PCB、原理图、程序).zip",为我们提供了一个基于LD3320语音识别芯片的完整解决方案,涵盖了硬件设计、软件开发等多个方面,为开发者提供了一套快速实现语音识别功能的参考...

    《PLC综合开发利器——CoDeSys基础编程及应用指南》

    结构化文本是一种高级编程语言,类似于Pascal,适合于编写算法密集型的应用程序。 ##### 顺序流程图(SFC) 顺序流程图是一种基于状态机的编程语言,用于设计顺序控制程序。 ##### 连续功能图(CFC) 连续功能图是...

    开放式工业控制系统的软件开发技术—— CODESYS V3 基础编程指南.pdf

    结构化文本(ST)则类似于Pascal、C和其他高级编程语言的语法结构,非常适用于处理复杂的算法和数据操作。 在程序结构方面,文档强调了系统程序和用户程序的重要性,并讨论了常用编程方法。基础编程部分着重介绍了...

    开放式工业控制系统的软件开发技术—— CODESYS V3 基础编程指南.

    **开放式工业控制系统的软件开发技术——CODESYS V3基础编程指南** CODESYS(Control Development System)是一款基于IEC 61131-3标准的编程环境,广泛应用于开放式工业控制系统,尤其在PLC(可编程逻辑控制器)...

    S7-1200跟我学跟我做——通信与工艺部分

    3. Structured Text (ST):结构化文本语言,适用于复杂算法的编写。 4. Simulation与Online Diagnostics:TIA Portal内置模拟功能,可在线诊断和测试程序,提高调试效率。 五、安全集成 S7-1200还支持集成安全功能...

    图解西门子S7——300 400编程技术

    - **Structured Text (ST) 结构文本**:类似于高级语言,适用于复杂的算法实现。 - **Sequential Function Chart (SFC) 序列功能图**:用于描述系统的顺序控制过程。 - **Function Block Diagram (FBD) 功能块图**:...

    PC_based 跟随时代脚步——研华APAX-6572可编程自动化控制器 可执行更多复杂任务.rar

    6. **强大的编程环境**:支持IEC 61131-3标准编程语言,包括梯形图(LD)、结构文本(ST)、功能块图(FBD)、指令表(IL)等,使得程序编写更加直观易懂。 7. **安全特性**:具备各种安全功能,如故障安全机制,以...

    国产手机语音文件

    4. ivESREngine.irf:这是语音识别引擎的组件,"Engine"通常指的是核心算法和处理逻辑,它负责接收声音输入,转换为文本,并执行相应的操作。 综上所述,这个压缩包可能包含了一套完整的语音识别系统,用于国产手机...

    S7-300 400PLC编程技术(下)

    - **结构化控制语言(SCL)**:基于高级编程语言的文本格式,提供强大的数据处理能力和算法实现。 - **顺序功能图(SFC)**:用于描述系统的状态转换,特别适用于流程控制和状态机设计。 ### 网络通信 S7-300和S7-400...

    PLC五种编程语言.docx

    国际电工委员会(IEC)制定了工业控制编程语言的标准——IEC 1131-3,其中定义了五种标准编程语言,分别是梯形图语言(LD)、指令表语言(IL)、功能模块图语言(FBD)、顺序功能流程图语言(SFC)以及结构化文本...

    TwinCAT IEC61131-3編成

    - **高级语言的支持**:如结构化文本(Structured Text),支持更复杂的逻辑处理和算法实现。 #### PLCopen 组织的角色 PLCopen 是一个全球性的独立组织,致力于推广和维护 IEC 61131 标准。它的主要贡献包括: -...

    喷涂PLC程序.rar

    三菱PLC编程语言通常采用梯形图(Ladder Diagram, LD)或结构文本(Structured Text, ST)。梯形图直观易懂,适合电气工程师,而结构文本更灵活,适用于复杂的逻辑控制。编程时,我们需要根据实际需求,设定I/O点,...

    通用的Acm模板,很好用

    // 这里原文本中的“sum=s”可能是笔误或不完整,需要进一步补充代码来完成大数乘法的实现。 } ``` #### 二、字符串处理 - **字符串替换** - **字符串查找** - **字符串截取** #### 三、计算几何 - **叉乘法求...

Global site tag (gtag.js) - Google Analytics