文本比较算法Ⅴ——回顾贴,对前面几篇文章的回顾与质疑

简介: 文本比较算法Ⅰ——LD算法  文本比较算法Ⅱ——Needleman/Wunsch算法  文本比较算法Ⅲ——计算文本的相似度  文本比较算法Ⅳ——Nakatsu算法  在写了本系列的前面几篇文章之后。

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

  文本比较算法Ⅱ——Needleman/Wunsch算法

  文本比较算法Ⅲ——计算文本的相似度

  文本比较算法Ⅳ——Nakatsu算法

  在写了本系列的前面几篇文章之后。有些网友质疑文章的正确性。在仔细的推敲之下,这些网友指正的不无道理。下面举一个反例,来质疑前面文章的正确性。

  文本:A:481234781;B:4411327431

  先按照LD算法,计算LD矩阵  

    4 4 1 1 3 2 7 4 3 1
  0 1 2 3 4 5 6 7 8 9 10
4 1 0 1 2 3 4 5 6 7 8 9
8 2 1 1 2 3 4 5 6 7 8 9
1 3 2 2 1 2 3 4 5 6 7 8
2 4 3 3 2 2 3 3 4 5 6 7
3 5 4 4 3 3 2 3 4 5 5 6
4 6 5 4 4 4 3 3 4 4 5 6
7 7 6 5 5 5 4 4 3 4 5 6
8 8 7 6 6 6 5 5 4 4 5 6
1 9 8 7 6 6 6 6 5 5 5 5

  可知,LD(A,B)=5,最佳匹配为

  A:4812347_81

  B:4411327431

  再按照LCS算法,计算LCS矩阵 

    4 4 1 1 3 2 7 4 3 1
  0 0 0 0 0 0 0 0 0 0 0
4 0 1 1 1 1 1 1 1 1 1 1
8 0 1 1 1 1 1 1 1 1 1 1
1 0 1 1 2 2 2 2 2 2 2 2
2 0 1 1 2 2 2 3 3 3 3 3
3 0 1 1 2 2 3 3 3 3 4 4
4 0 1 2 2 2 3 3 3 4 4 4
7 0 1 2 2 2 3 3 4 4 4 4
8 0 1 2 2 2 3 3 4 4 4 4
1 0 1 2 3 3 3 3 4 4 4 5

  可知,LCS(A,B)=5,匹配为

  A:4_81_234781

  B:44113274_31

  不是最佳匹配,而蓝色部分41241的确是最长公共子序列。只是和LD算法算出的最长公共子序列不一样而已。这个说明,最长公共子序列不是唯一的。问题出在哪?出在白色部分的第7行第8列这个单元格的回溯上,在这个单元格,有两个方向可以选,一个是向上,一个是向左,在前文中说到,回溯时优先考虑左上角、上方、下方的顺序。这个是不完全正确的。本例中,这个单元格向左回溯能得到最佳匹配。

 

  然后看看,Nakatsu算法的L矩阵

 

    4 8 1 2 3 4 7 8 1
  i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9
k=0 0 0 0 0 0 0 0 0 0 0
k=1 V 1 1 1 1 1 1 1 1 1
k=2 V V V 3 3 3 2 2 2 2
k=3 V V V V 6 5 5 5 5 3
k=4 V V V V V 9 8 7 7 7
k=5 V V V V V V V V V 10
k=6 V V V V V V V V V V
k=7 V V V V V V V V V V
k=8 V V V V V V V V V V
k=9 V V V V V V V V V V

  正如网友Sumtec指正,红色部分才是最长公共子序列的下标。

  出于好奇,我分析了L矩阵中那些数值

  L(k,i)=j→LCS(i,j)=k

  于是在LCS中,把这些对应值表示出来

  

    4 4 1 1 3 2 7 4 3 1
  0 0 0 0 0 0 0 0 0 0 0
4 0 1 1 1 1 1 1 1 1 1 1
8 0 1 1 1 1 1 1 1 1 1 1
1 0 1 1 2 2 2 2 2 2 2 2
2 0 1 1 2 2 2 3 3 3 3 3
3 0 1 1 2 2 3 3 3 3 4 4
4 0 1 2 2 2 3 3 3 4 4 4
7 0 1 2 2 2 3 3 4 4 4 4
8 0 1 2 2 2 3 3 4 4 4 4
1 0 1 2 3 3 3 3 4 4 4 5

  可以看出,L矩阵的元素表示每一行每个值出现的最左边的位置。这个能求出最长公共子序列。不过,能否求出最佳匹配,还得思量一番。

 

  最近在研究国外的两篇论文,估计研究完了,应该会有所收获。

  《A longest common subsequence algorithm suitable for similar text strings》

  《An almost-linear time and linear space algorithm for the longest common subsequence problem》

 

  在这里打个广告。这两篇论文,在网上能找到下载页面,但因为没有帐号,所以一直无法下载。昨天在“小米粒资源网”上发帖求助,不过半小时而已,就有人帮你下载,共享给你。效果非常好,在这里也向帮我下载的网友致敬。如果,你需要找一些学术论文(无论是中文的还是英文的),不妨在“小米粒资源网”试试,也许会有意想不到的惊喜。

作者: 万仓一黍
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
目录
相关文章
|
2月前
|
机器学习/深度学习 编解码 PyTorch
【万字长文】看完这篇yolov4详解,那算是真会了
【万字长文】看完这篇yolov4详解,那算是真会了
|
7月前
|
C语言
近期一系列个人做题反复记不住以及思路不清晰问题的总结
近期一系列个人做题反复记不住以及思路不清晰问题的总结
16 0
|
算法 Python
算法创作|找出游戏的获胜者问题解决方法
算法创作|找出游戏的获胜者问题解决方法
106 0
|
算法
零碎的算法笔记(1)
零碎的算法笔记(1)
54 0
|
算法框架/工具
|
算法 NoSQL API
到底该不该看源码(懂这三点儿就够了)
1、不要为了看源码而看源码 2、代码积累到一定程度,遇到问题自然就去查源码了,然后你就看懂了 3、两年内不要刻意去看源码,可以点开简单了解一下就行,前两年疯狂做项目就行了,后期项目做的多了,你自己就会有疑问,每次写代码就会问自己为什么要这样写?底层的原理是什么?很自觉的带着问题就去看源码了,如果你没有这样的疑问,那说明你也不适合去看源码了,写写业务代码,了了一生
158 0
|
小程序 数据安全/隐私保护 计算机视觉
切勿外传,我要把我的写作“小心思”放出来了!| 年终总结之学习篇🚩
切勿外传,我要把我的写作“小心思”放出来了!| 年终总结之学习篇🚩
159 0
切勿外传,我要把我的写作“小心思”放出来了!| 年终总结之学习篇🚩
|
算法 Shell 决策智能
只用一行代码就能搞定,博弈论究竟是什么神仙算法?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 博弈论是一门很庞大的学科,它算是数学的一个分支,也和运筹学甚至是经济学有关。虽然它严格说起来并不是算法领域的内容,但是有不少关于博弈论有趣的算法和问题。
|
存储 算法 程序员
手把手:四色猜想、七桥问题…程序员眼里的图论,了解下?(附大量代码和手绘)
长文预警!本文作者Vardan Grigoryan是一名后端程序员,但他认为图论(应用数学的一个分支)的思维应该成为程序员必备。 本文从七桥问题引入,将会讲到图论在Airbnb房屋查询、推特推送更新时间、Netflix和亚马逊影片/商品个性化推荐、Uber寻找最短路线中的应用,附有大量手把手代码和手绘插图,值得收藏。
3323 0
|
程序员
如何用一段简单的代码讲述一个悲伤的故事?
程序员的悲伤故事难道不应该是: 别人的老板晚上带他出去耍,你的老板半夜催你改代码; 别的程序员工资高、待遇好,而你只是血压高、心态好…… 擦干眼泪告诉自己:程序员前半生的悲伤都不是事儿,因为后半生你就慢慢习惯了。
943 0