易语言教程_易语言源码_易语言视频教程_易语言论坛

 找回密码
 点击注册

Vip新手入门区
新手学习指南  学员作品展示 Vip课程总纲  Vip绝密课程系列

Vip相关下载区
Vip模块下载   Vip模块绑定   Vip模块例子 魔鬼插件下载  魔鬼插件例子  教程工具下载

Vip论坛服务区
教程问题提问区   模块问题提问区 技术交流区   魔鬼插件建议   忘记密码找回

VIP会员办理QQ: 8643245   
【请先加好友,然后到好友列表双击联系客服,办理VIP会员。】
【基础篇】易语言辅助入门基础教程
VIP模块办理QQ: 7189694 办理正版魔鬼作坊VIP模块 【基础篇】OD与CE入门基础教程
办理【终身VIP会员】“秒杀价” 仅需 RMB278.00元… 【基础篇】零基础绝密汇编语言入门课程 (共26课已完成)…
办理VIP详情…猛击这里查看详情 【基础篇】VIP辅助入门基础教程-新手必学 已发布10课 ……
VIP教程免费试看章节…猛击下载 【第1款】制作“辅助挂”教程目录查看(共107+16_x64下更新课已完成)…
亲爱的VIP学员,请到此写下你学习的感受与发布作品截图… 【第2款】制作“任务挂”教程目录查看(共77+1_x64下更新课已完成)…
卍解吧!不用bp send类封包断点找CALL的各种通杀思路 【第3款】驱动过保护技术课程(共38课已完成)…
【绝密教程】VIP绝密教程系列---注意:随时会更新! 【第4款】VIP邪恶二叉树辅助课程 (共31+17_x64下更新课已完成)…
【精品第13款】3D射击游戏与页游透视 智辅课程 已完成17课… 【第5款】零基础易语言按键辅助教程 (30课已完成)…
【精品第14款】变态功能辅助是如何炼成的 已完成36课… 【第6款】从零开始学习封包辅助技术教程(20课已完成) …
【精品第15款】DNF商业变态辅助的修炼之路 已完成27课… 【第7款】大杀特杀分析来源与CALL吸血鬼课程 (56课已完成)
【精品第16款】中控台多线程多开自动化商业辅助课程 已完成66课… 【第8款】完全零基础网页辅助课程(40课已完成)
【全新精品第17款】检测原理与过游戏内存检测技术课程 已发布9课… 【第9款】自动登录与操控LUA技术课程 (共46+8_x64下更新课已完成)…
【全新精品第18款】手游全自动化任务脚本辅助课程 已发布25课…… 【第10款】网页辅助封包脱机进阶课程 已完成30课…
【全新精品第19款】D3D方框骨骼透视与自瞄辅助课程进阶篇 已发布34课…… 【第11款】VC++ Lua脚本辅助课程 已完成112课…
【全新精品第20款】 X64模拟器吃鸡游戏方框透视自瞄辅助课程 发布中... 【第12款】网游脱机封包智辅课程 已完成35课…
查看: 1491|回复: 0

Sunday算法原理与实现(模式匹配)

[复制链接]

9

主题

7

回帖

17

积分

编程入门

Rank: 1

魔鬼币
550
发表于 2017-5-9 08:13:27 | 显示全部楼层 |阅读模式
    字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore)。两个算法在最坏情况下均具有线性的查找时间。但是在实用上,KMP算法并不比最简单的c库函数strstr()快多少,而BM算法则往往比KMP算法快上3-5倍。但是BM算法还不是最快的算法,这里介绍一种比BM算法更快一些的查找算法---Sunday算法。

   Sunday算法其实思想跟BM算法很相似,只不过Sunday算法是从前往后匹配,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。如果该字符没有在匹配串中出现则直接跳过,即移动步长= 匹配串长度+ 1;否则,同BM算法一样其移动步长=匹配串中最右端的该字符到末尾的距离+1。

具体源代码实现如下(源代码中已注明实现过程):
#include
#include
using namespace std;

//一个字符8位 最大256种
#define MAX_CHAR_SIZE 256
#define MAXSIZE 100

/*设定每个字符最右移动步长,保存每个字符的移动步长
如果大串中匹配字符的右侧一个字符没在子串中,大串移动步长=整个串的距离+1
如果大串中匹配范围内的右侧一个字符在子串中,大串移动距离=子串长度-这个字符在子串中的位置
*/
int *setCharStep(char *subStr)
{
int i;
     int *charStep=new int[MAX_CHAR_SIZE];
     int subStrLen=strlen(subStr);
     for(i=0;i             charStep[i]=subStrLen+1;
     //从左向右扫描一遍 保存子串中每个字符所需移动步长
     for(i=0;i     {
            charStep[(unsigned char)subStr[i]]=subStrLen-i;        
     }
     return charStep;
}


/*
   算法核心思想,从左向右匹配,遇到不匹配的看大串中匹配范围之外的右侧第一个字符在小串中的最右位置
   根据事先计算好的移动步长移动大串指针,直到匹配
*/
int sundaySearch(char *mainStr,char *subStr,int *charStep)
{
     int mainStrLen=strlen(mainStr);
     int subStrLen=strlen(subStr);
     int main_i=0;
     int sub_j=0;
     while(main_i     {                  
            //保存大串每次开始匹配的起始位置,便于移动指针
             int tem=main_i;
             while(sub_j             {
                    if(mainStr[main_i] == subStr[sub_j])
                    {
                            main_i++;
                            sub_j++;
                            continue;                  
                    }               
                    else{
                        //如果匹配范围外已经找不到右侧第一个字符,则匹配失败
                         if(tem+subStrLen > mainStrLen)
                                     return -1;
                         //否则 移动步长 重新匹配
                         char firstRightChar=mainStr[tem+subStrLen];
                         main_i+=charStep[(unsigned char)firstRightChar];
                         sub_j=0;   
                         break;//退出本次失败匹配 重新一轮匹配
                    }  
             }
             if(sub_j == subStrLen)
                       return main_i-subStrLen;
     }
     return -1;
}


int main()
{
char mainStr[MAXSIZE];
char subStr[MAXSIZE];
int answer, i;
printf("\nBoyer-Moore String Searching Program");
printf("\n====================================");
printf("\n\nmainStr String --> ");
gets(mainStr);
printf( "\nsubStr String --> ");
gets(subStr);
int *charStep=setCharStep(subStr);
if ((answer = sundaySearch(mainStr,subStr,charStep)) >= 0)
{
  printf("\n");
  printf("%s\n", mainStr);
  for (i = 0; i < answer; i++)
   printf(" ");
  printf("%s", subStr);
  printf("\n\nPattern Found at location %d\n", answer);
}
else
  printf("\nPattern NOT FOUND.\n");
  return 0;
}


您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

魔鬼作坊|易语言教程|易语言源码|易语言论坛|易语言视频教程| 论坛导航|免责申明|手机版||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表魔鬼作坊立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2019 All Right Reserved.
快速回复 返回顶部 返回列表