免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2362 | 回复: 1
打印 上一主题 下一主题

[算法] 实现了下Backward Nondeterministic Dawg Matching algorithm [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-26 12:07 |只看该作者 |倒序浏览

  1. /*
  2. * A class for string matching use the
  3. *  Backward Nondeterministic Dawg Matching algorithm
  4. *
  5. *  2008/2/26
  6. *
  7. *  By Yao Jianming
  8. */

  9. #ifndef _BNDMMATCH_H
  10. #define _BNDMMATCH_H

  11. #ifndef STRMATCH_MAXCHER
  12. #define STRMATCH_MAXCHER 256
  13. #endif

  14. #include <string>

  15. class strmatch {
  16. private:
  17.     std::string str;
  18.     int mask[STRMATCH_MAXCHER];

  19.     void makemasktable();

  20. public:
  21.     strmatch(const char* p) : str(p) {makemasktable();}

  22.     void* search(const void* haystack, size_t haystack_len) const;
  23. };

  24. #endif


  25. #include "strmatch.h"

  26. void strmatch::makemasktable()
  27. {
  28.     memset(mask, 0, STRMATCH_MAXCHER*sizeof(int));

  29.     const char* patt = str.c_str();
  30.     int len = str.size();

  31.     int s =1;
  32.     for(int i = len - 1; i >= 0; --i) {
  33.         mask[patt[i]] |= s;
  34.         s <<= 1;
  35.     }
  36. }

  37. void* strmatch::search(const void* haystack, size_t haystack_len) const
  38. {
  39.     const char* text = (const char*)haystack;
  40.     const char* patt = str.c_str();
  41.     int len = str.size();
  42.     int k = 0;

  43.     while(k <= haystack_len - len) {
  44.         int i, d = ~0, shift = len;
  45.         for(i = len - 1; i >= 0 && d != 0; --i) {
  46.             d &= mask[text[k+i]];
  47.             d <<= 1;
  48.         }

  49.         if(i < 0 && d != 0)
  50.             return (void*)(text + k + i + 1);

  51.         if(text[k+i+2] == patt[0])
  52.             shift = i + 2;
  53.             
  54.         k += shift;
  55.     }
  56.    
  57.     return (void*)NULL;
  58. }


  59. #include <sys/time.h>
  60. #include "strmatch.h"

  61. main()
  62. {
  63.     struct timeval start, end;
  64.     gettimeofday(&start, 0);

  65.     strmatch str = "helloworld";
  66.     char text[] = "aaaadfjdfddfdkfalhelloworld";
  67.     char* p = (char*)str.search(text, strlen(text));
  68.     if(p != NULL) printf("%s\n", p);

  69.     gettimeofday(&end, 0);
  70.     long ltime = (end.tv_sec - start.tv_sec) * 1000000 +
  71.                     end.tv_usec - start.tv_usec;
  72.     printf("ltime: %ld\n", ltime);
  73. }
复制代码


试过了能用,各位给看看,哪里需要改进

[ 本帖最后由 yjm0573 于 2008-2-29 10:10 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-02-26 12:07 |只看该作者
后面的怎么变那种字体了?.....................修改过来了

[ 本帖最后由 yjm0573 于 2008-2-26 12:09 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP