文本比较算法剖析(1)-如何确定最大匹配率

来源:互联网 发布:window 查看端口 编辑:程序博客网 时间:2024/05/21 23:02

最近看到有人在找关于文本比较的算法,刚好最近休假,研究了一下,终于找到一个简单有效的算法,和大家分享一下。

算法本身很简单,但是要说清楚思路和原理就比较复杂了,打算分两次发表(明天就要上班拉!),分别对应文本比较算法中的两个主要问题:

1。如何确定最大匹配率; 
2。如何确定最优的匹配路径;

算法本身是基于图论的,太麻烦了,所以不打算介绍整个思路,只将最后的结果详细解说给大家。有问题可以发邮件给我:opensw0001@gmail.com

文本比较算法剖析(1)-如何确定最大匹配率

 

1. 首先,我们假设有两个串left和right,
    left="ABCACADF"
    right="BCXCADFESBABCACA"

    为了直观的分析问题,第一步,我用一个表格来逐个的比较left和right的每个元素:

图中,1 表示left 和 right 的某个元素是匹配的,0, 就是不匹配了, 那么, 现在的问题就是, 如何从表格中的左上角,找到一条路径,满足:
    1. 经过的值为"1"的单元格最多;
    2. 每次只能向右,或者向下,或者向右下方移动一格;
    3. 如果本次位置在值为"1"的格子上,只能向右下方移动一格;
    4. 如果移动到右边界或者下边界外,则终止。

2 .这其实就是一个有条件搜索最大权重路径的问题。但是,这里讲的是文本匹配问题,和图论相比,要简单很多。因为文本是流式的,两个文本之间的所有匹配关系一定是一个很规则的矩阵,这比图论中研究的情况要简单多了。

最先想到的是什么呢?迭代和递归,是不是?别着急,没有那么复杂的,我们来分析一下,再做打算。

我们先用手工标出从每个匹配点出发,一直到边界能够经过的最多匹配点个数,如下图所示:

各位可以自己手工做做,分析数量有限的图形,还是大脑比计算机好使。

3. 我们来分析一下,基本的思路是数学归纳法,呵呵,其实是递归算法的数学原型。

边界上的单元,不用说了,一定是最多只能找到一个匹配点。

而对于表格中的任意一个单元, 我们用 N(l,r) 来表示,对于它,按照上面的规则,它有3个邻接区域 A, B, C.

我们用N(l,r)来表示“将left的第L个元素和right的第R个元素匹配后,能够获取的最大匹配点数”。这个表述有点难以理解,从前面的“找到一个路径...”的观点出发,我们还可以这么说明N(l,r)的含义:“从第L行R列的单元格出发,满足所有4个条件的路径上能够经过的值为"1"的单元个数”。

因为N(l,r)的下一步一定是区域A,B,C中的一个,而且,如果(l,r)是一个匹配点,只能选择进入A区域;如果进入B,C,则(l,r)一定不是一个匹配点。因此,我们可以得到:
      
 N(l,r) = Max( V(l,r)+N(区域A), N(区域B), N(区域C) ) 。"V(l,r)表示单元(l.r)的值,=0表示单元(l,r)不是一个匹配点,=1表示单元(l,r)是一个匹配点"

而一个区域的最大匹配点数,就是从该区域的入口点出发,所能得到的最大匹配点数,即:N(区域[(a,b),(c,d)]) = N(a,b).  "区域[(a,b),(c,d)]的意思是:由点(a,b) 和点(c,d)所构成的矩形区域)"

那么,前式就变成了:

N(l,r) = Max( V(l.r)+N(区域A), N(区域B), N(区域C) ) 
         = Max( N(l+1,r+1)+V(l,r) , N(l,r+1),  N(l+1,r))

在excel中,我们可以验证一下,设置单元格L4的公式=MAX(L5,M5+B4,M4),然后拷贝这个公式直到和前面的矩阵相匹配,我们得到的结果如下:

可以和手工分析的结果对照一下(上图中最右部分),可以看到,结果完全一致。

Yes! 现在已经接近大功告成拉!简单吧!现在,就是如何代码化的问题了。

要将上面的方法编程,还差一个问题:初始化。这个很简单,从Excel的计算结果我们就可以知道。在上面的单元格公式中,边界单元引用了空白单元,而我们知道excel对空白单元取值做算术运算时是按照0计算的,所以初始化为0就可以了。

 再从上面的分析可以知道:
1. 循环应该是从右向左,从下向上的;
2. 每个单元格的值只需要计算一次;
3. 计算N(l,r)时,需要引用3个值
因此,程序应该做逆序循环,用一个数组缓存N(l+1,r)和N(l+1,r+1)的值,用一个临时变量缓存N(l,r+1).

假设left有M个元素;right有N个元素,那么,这个程序的时间复杂度就是O(m.n), 空间复杂度就是Max(m,n).

好了,关于如何计算left和right的最大匹配数,就结束了。很简单,不是么?


from http://blog.csdn.net/clariones/article/details/1396880

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东转卖的商品有问题怎么办 如果衣服下架了然后有退货怎么办 想买二手车可没有懂车的人怎么办 买车的时候异地车牌回家怎么办 天猫下单显示下单人数太多券怎么办 英雄联盟进入游戏后无限崩溃怎么办 打开电视显示百度影棒打不开怎么办 家里路由器网速一会快一会慢怎么办 用快看影视下载电影网速太慢怎么办 苹果手机下载东西网速特别慢怎么办 网上买重庆时时彩输了很多钱怎么办 找不到自己在哪个平台借过钱怎么办 九游账号绑定手机之前绑定的怎么办 九游充过钱的游戏忘了游戏名怎么办 百度网盘密码忘了申诉不了怎么办 手机号被别人注册了百度账号怎么办 快手被盗找回时出来重置密码怎么办 魅族账号密码和密保都忘记了怎么办 vivo账号的密保问题忘了怎么办 oppo账号密保问题忘了怎么办 小米手机刷了机忘了账号密码怎么办 忘了小米账号的密码是多少怎么办 千牛账号在手机上被限制登录怎么办 违规的千牛账号被限制登录了怎么办 苹果id和锁屏密码忘记了怎么办 感应门的编程密码忘记了怎么办 交易猫买的号被找回了怎么办 uc上我的小说看不了怎么办 微信零钱忘记密码没有银行卡怎么办 九游平台冻结提不了现怎么办 计算机考试报名登录名忘记了怎么办 云顶扑克提现怎么提不出来怎么办 微信正在下载一直0kb怎么办 守望先锋运行时出现意外错误怎么办 信用卡暂停使用怎么办还能恢复吗 新刷乳胶漆墙面一碰一个坑怎么办 夏天开空调冻着了头疼打喷嚏怎么办 桑蚕丝衣服被沐浴露退了色怎么办 空间被别人知道了密码登录了怎么办 三星手机显示解析包出现问题怎么办 三星手机下载解析包出现问题怎么办