博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
串的模式匹配算法---Horspool
阅读量:6833 次
发布时间:2019-06-26

本文共 1562 字,大约阅读时间需要 5 分钟。

Horspool算法是一种基于后缀的匹配方法,它的主要难点在于如何安全地移动窗口,以避免遗漏可能的成功匹配。

 

1,Horspool的基本思想

  horspool算法将主串中匹配窗口的最后一个字符跟模式串中的最后一个字符比较。如果相等,继续从后向前对主串和模式串进行比较,直到完全相等或者在某个字符处不匹配为止(如下图中的α与σ失配) 。如果不匹配,则根据主串匹配窗口中的最后一个字符β在模式串中的下一个出现位置将窗口向右移动。

 

2,Horspool的求解过程

此处选择参考文献[1]中的一个例子来详细介绍下Horspool的求解过程

在序列AGATACGATATATAC中搜索字符串ATATA。

首先,要构造失配时模式串中元素的移动距离数组d:

然后开始逐次匹配:

1)A G A T A C G A T A T A T A C

    A T A T A

   在主串的G处失配,此时模式串向右移动的距离是d[A]=2

2)A G A T A C G A T A T A T A C

          A T A T A

  又在主串G处失配,此时模式串向右移动的距离是d[G]=5

3)A G A T A C G A T A T A T A C

                        A T A T A

 此处发现了一个匹配,我们可以继续往下找,此时模式串向右移动的距离是d[A]=2

4)A G A T A C G A T A T A T A C

                              A T A T A

 呃。。。又发现了一个匹配,再继续往下找吧,此时模式串向右移动的距离依然是d[A]=2

5)A G A T A C G A T A T A T A C

                                   A T A T A

移动后,主串指针pos>n-m了,搜索过程结束。

 

3,Horspool算法实现

  这里我提供了一个第2小节中提到的DNA子串查找的horspool算法实现。

1 /* 2  * implementation of Horspool 3  * Author:Horspool 4  * Coder: Cobbliu 5  */ 6 #define WORD 26 7 int horspool(char *T, int lenT, char *P, int lenP) 8 { 9     int d[WORD];10     int i, pos, j;11 12     for(i = 0; i != WORD; i++)13         d[i] = lenP;14     for(i = 0; i != (lenP-1); i++)15         d[P[i]-'A'] = lenP-i-1;16 17     pos = 0;18     while(pos < (lenT-lenP)){19         j = lenP-1;20         while(j >= 0 && T[pos+j]==P[j])  //matching21             j--;22         if(j == -1)23             return pos;24         else //not matched25             pos += d[T[pos+lenP-1]-'A'];26     }27 28     return -1;29 }

 

4,Horspool算法复杂度

     假设主串的长度为n,模式串的长度为m,那么Horspool算法最坏情况下的时间复杂度是O(mn),但平均情况下它的时间复杂度是O(n)。

 

5,参考文献

  [1] 《Flexible Pattern Matching in Strings》 Gonzalo Navarro & Mathieu Raffinot

 

 

转载地址:http://skxkl.baihongyu.com/

你可能感兴趣的文章
SHOP++ 中Hibernate 注解 用法
查看>>
jQuery EasyUI使用教程之创建基本的树网格
查看>>
Fluentd日志处理-插件使用和调试问题(四)
查看>>
实验四 交换机SPAN功能配置 (交换与路由技术)
查看>>
centos7源码安装php5.6并安装pthreads扩展
查看>>
网络基础~linux路由与网关、路由命令
查看>>
强大的联想4U机架式服务器ThinkSystem SR950
查看>>
美国防部:美国×××防御系统存在诸多安全问题
查看>>
阿里云搭建lamp平台
查看>>
Reverse Integer之Java实现
查看>>
Linux的SSH服务初学
查看>>
不同于FTP的另一款文件传输工具
查看>>
MYSQL 逻辑架构
查看>>
第11课--11_04_Linux网络配置之四 ifconfig及ip命令详解
查看>>
Linux命令之grep/sed/awk等行转列
查看>>
3.1 账户管理
查看>>
MySQL 多张表合并成一张表
查看>>
朋友圈广告投放优势及广告投放案例分享
查看>>
vivo Z3的Usb调试模式在哪里,开启vivo Z3Usb调试模式的教程
查看>>
能够让你提升的九个 Python 小技巧
查看>>