龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 4646|回复: 0

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

[复制链接]

8

主题

2

回帖

14

积分

编程入门

Rank: 1

龙马币
36

   字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore)。两个算法在最坏情况下均具有线性的查找时间。但是在实用上,KMP算法并不比最简单的c库函数strstr()快多少,而BM算法则往往比KMP算法快上3-5倍。但是BM算法还不是最快的算法,这里介绍一种比BM算法更快一些的查找算法---Sunday算法。

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

具体源代码实现如下(源代码中已注明实现过程):

  1. #include
  2. #include
  3. using namespace std;

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

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


  23. /*
  24.    算法核心思想,从左向右匹配,遇到不匹配的看大串中匹配范围之外的右侧第一个字符在小串中的最右位置
  25.    根据事先计算好的移动步长移动大串指针,直到匹配
  26. */
  27. int sundaySearch(char *mainStr,char *subStr,int *charStep)
  28. {
  29.      int mainStrLen=strlen(mainStr);
  30.      int subStrLen=strlen(subStr);
  31.      int main_i=0;
  32.      int sub_j=0;
  33.      while(main_i     {                  
  34.             //保存大串每次开始匹配的起始位置,便于移动指针
  35.              int tem=main_i;
  36.              while(sub_j             {
  37.                     if(mainStr[main_i] == subStr[sub_j])
  38.                     {
  39.                             main_i++;
  40.                             sub_j++;
  41.                             continue;                  
  42.                     }               
  43.                     else{
  44.                         //如果匹配范围外已经找不到右侧第一个字符,则匹配失败
  45.                          if(tem+subStrLen > mainStrLen)
  46.                                      return -1;
  47.                          //否则 移动步长 重新匹配
  48.                          char firstRightChar=mainStr[tem+subStrLen];
  49.                          main_i+=charStep[(unsigned char)firstRightChar];
  50.                          sub_j=0;   
  51.                          break;//退出本次失败匹配 重新一轮匹配
  52.                     }  
  53.              }
  54.              if(sub_j == subStrLen)
  55.                        return main_i-subStrLen;
  56.      }
  57.      return -1;
  58. }


  59. int main()
  60. {
  61. char mainStr[MAXSIZE];
  62. char subStr[MAXSIZE];
  63. int answer, i;
  64. printf("\nBoyer-Moore String Searching Program");
  65. printf("\n====================================");
  66. printf("\n\nmainStr String --> ");
  67. gets(mainStr);
  68. printf( "\nsubStr String --> ");
  69. gets(subStr);
  70. int *charStep=setCharStep(subStr);
  71. if ((answer = sundaySearch(mainStr,subStr,charStep)) >= 0)
  72. {
  73.   printf("\n");
  74.   printf("%s\n", mainStr);
  75.   for (i = 0; i < answer; i++)
  76.    printf(" ");
  77.   printf("%s", subStr);
  78.   printf("\n\nPattern Found at location %d\n", answer);
  79. }
  80. else
  81.   printf("\nPattern NOT FOUND.\n");
  82.   return 0;
  83. }
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表