串匹配之蛮力算法

基于邓俊辉老师的c++数据结构

问题描述
给定文本串T,长度n 如:1001101101
模式串P,长度m,如: 1011
此时默认的字符集是{'1','0'}
求成功匹配的字符首位置

算法描述
将P和T从头对齐,依次比对。一旦失败,将P右移一位,继续从头比对。

蛮力算法

而代码实现上则是由两个指针i,j分别指向T,P

代码实现

//p:pattern模式串  T:text文本串
int match1(char* P,char* T)
{
    size_t n = strlen(T),i=0;//获得文本串的长度,设定指向文本串的指针i
    size_t m = strlen(P),j=0;//获得模式串的长度,设定指向模式串的指针j

    while(j<m && i<n)
    {
        if(T[i]==P[j])//成功匹配字符则同时向右挪一位
        {
            i++;
            j++;
        }
        else{
            i-=(j-1);//相当于i先减去j再加1,也就是在原来的位置上右移一位
            j=0;//j重新归零
        }
    }
    return i-j;//返回成功匹配的起始位置
}

复杂度分析
从最坏情况分析,比如:
T:0000000000000000000000000000001
P : 0001
那么需要比较n-m+1轮,每轮m次 比对
当n>>m时,渐进时间复杂度是O(n*m)
但事实并不悲观。
实际上,当前字符集的个数仅仅为2,极其容易出现局部匹配。
假如字符集的数目很可观,那么将很难出现局部匹配,此时m->1
时间复杂度趋近于O(n)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 归去来兮。 1.1 说明 本篇为《挑战程序设计竞赛(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy阅读 14,902评论 0 160
  • 9.3.3 快速排序   快速排序将原数组划分为两个子数组,第一个子数组中元素小于等于某个边界值,第二个子数组中的...
    RichardJieChen阅读 5,829评论 0 3
  • 在2015年,我第一次接触到了投资,而在不久之后就遇到了15年的股灾,市场上成千上万的人接受了惨重的洗礼,不幸的是...
    杨刀刀daoker阅读 2,405评论 1 0
  • f43c5a04421b阅读 949评论 0 0
  • 文/那年沐子 是纯美和圣洁的体现, 却要勾出 内心深处的邪恶灵魂。 有才华 也有怯懦逃避, 拼命的掩饰呼之欲出 的...
    那年沐子阅读 1,248评论 0 0