一、BF算法

BF算法是普通的模式匹配算法,其基本思想就是将目标串的第一个字符与模式串的第一个字符进行匹配。若相等,则继续比较第二个字符;若不相等,则比较目标串的第二个字符和模式串的第一个字符。依次比较下去,直到得出最后的匹配结果。

示例代码:

static int bf(const char *src, const char *des)

{

int i, pos;

int len_s, len_d;

if(src == NULL || des == NULL)

return -1;

len_s = strlen(src);

len_d = strlen(des);

for(pos = 0; pos < len_s - len_d; pos++) {

for(i = pos; i - pos < len_d; i++) {

if(src[i] != des[i - pos])

break;

}

if((i - pos) == len_d)

return pos;

}

return -1;

}

二、Sunday算法

Sunday算法是Daniel

M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法。其核心思想是:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。Sunday算法思想跟BM算法很相似,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。如果该字符没有在匹配串中出现则直接跳过,即移动步长= 匹配串长度+1;否则,同BM算法一样,即移动步长=匹配串中最右端的该字符到末尾的距离+1。

例如我们要在"substring searching"查找"search",刚开始时,把子串与文本左边对齐:

s

u

b

s

t

r

i

n

g

s

e

a

r

c

h

i

n

g

s

e

a

r

c

h

结果在第二个字符处发现不匹配,于是要把子串往后移动。但是该移动多少呢?这就是各种算法各显神通的地方了,最简单的做法是移动一个字符位置;KMP是利用已经匹配部分的信息来移动;BM算法是做反向比较,并根据已经匹配的部分来确定移动量。这里要介绍的方法是看紧跟在当前子串之后的那个字符(上图中的'i')。

显然,不管移动多少,这个字符是肯定要参加下一步的比较的,也就是说,如果下一步匹配到了,这个字符必须在子串内。所以,可以移动子串,使子串中的最右边的这个字符与它对齐。现在子串'search'中并不存在'i',则说明可以直接跳过一大片,从'i'之后的那个字符开始作下一步的比较,如下图:

s

u

b

s

t

r

i

n

g

s

e

a

r

c

h

i

n

g

s

e

a

r

c

h

比较的结果,第一个字符就不匹配,再看子串后面的那个字符是'r',它在子串中出现在倒数第三位,于是把子串向前移动三位,使两个'r'对齐,如下:

s

u

b

s

t

r

i

n

g

s

e

a

r

c

h

i

n

g

s

e

a

r

c

h

这次匹配成功了!回顾整个过程,我们只移动了两次子串就找到了匹配位置。可以证明:用这个算法,每一步的移动量都比BM算法要大,所以肯定比BM算法更快。

以上Sunday算法文字描述摘自这里。

代码实现:

#include

#include

#include

#include

#define LETTER_MAX_LEN 256

#define MAXLINE 1024

static int sunday(const char *src, const char *des)

{

int i, pos = 0;

int len_s, len_d;

int alphabet[LETTER_MAX_LEN] = {0};

if(src == NULL || des == NULL)

return -1;

len_s = strlen(src);

len_d = strlen(des);

for(i = 0; i < LETTER_MAX_LEN; i++)

alphabet[i] = len_d;

for(i = 0; i < len_d; i++)

alphabet[des[i]] = len_d - i - 1;

for(pos = 1; pos <= len_s - len_d; ) {

for(i = pos - 1; i - pos + 1 < len_d; i++) {

if(src[i] != des[i - pos + 1])

break;

}

if((i - pos + 1) == len_d)

return pos;

else

pos += alphabet[src[pos + len_d - 1]] + 1;

}

return -1;

}

int main(int argc, char **argv)

{

FILE *fp = NULL;

char line[MAXLINE] = {0};

int linesNum;

fp = fopen(argv[1], "r");

if(fp == NULL) {

printf("can not open file %s\n", argv[1]);

return -1;

}

while ((fgets(line, MAXLINE, fp)) != NULL) {

linesNum++;

if (sunday(line, "chinaunix") >= 0)

printf("find match at line %d\n", linesNum);

}

fclose(fp);

fp = NULL;

return 0;

}

c语言指opt算法实现,Sunday算法c语言版实现相关推荐

  1. sunday算法c语言实现,字符串搜索的Sunday算法

    比起流行的kmp算法,  Sunday不仅搜索效率上要高很多, 而且原理还特别简单易理解,  也容易实现. 字符串匹配--Sunday算法 基本思想及举例 Sunday算法由Daniel M.Sund ...

  2. 【算法】Sunday算法(模式匹配)

    #背景 Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.相对比较KMP和BM算法而言,简单了许多. #原理 平均性能的时间复杂度为O(n): 最差情况的时间复杂度为O ...

  3. 算法之Sunday算法

    Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似: Sunday算法 算法是比BM 和KBM更高效的算法,它不关注好后缀与坏字符,只关注文本串中参加匹配的最末 ...

  4. Sunday算法:查找字符串

    Sunday算法是用于查找子串的一种算法,具体的应用场景看这里 相比于KMP,BM算法,Sunday算法更快,并且更好理解(自认为哈 下面用比较正式的语言介绍一下该算法: 原字符串为文本串,匹配的子串 ...

  5. 【模式匹配】之 —— Sunday算法

    本文代码下载地址 http://download.csdn.net/detail/sun2043430/5273911 Sunday算法思路 Sunday算法的思想和BM算法中的坏字符思想非常类似. ...

  6. Sunday 算法-JavaScript实现

    Sunday算法简介   Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配算法.就是为了确定一个字符串是否包含指定的字符串.   平均时间复杂度:O(n).   最坏情 ...

  7. Sunday算法介绍及Java实现

    前言 最初想写这篇文章的原因是在LeetCode上看到了一道实现strStr函数的题: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haysta ...

  8. 字符串匹配--Sunday算法 1

    字符串匹配(查找)算法是一类重要的字符串算法(String Algorithm).有两个字符串, 长度为m的haystack(查找串)和长度为n的needle(模式串), 它们构造自同一个有限的字母表 ...

  9. sunday算法特征码_Sunday算法介绍及Java实现

    前言 最初想写这篇文章的原因是在LeetCode上看到了一道实现strStr函数的题: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haysta ...

最新文章

  1. 第二篇:n-gram 语言模型
  2. 008_html属性
  3. 哈尔滨工业大学-数据库系统(基本知识与关系模型1)
  4. 关于String.Intern()的一道题
  5. Python - 字符串
  6. matlab利用t-SNE实现高维数据可视化(tsne函数用法实例)
  7. 数学大家闵嗣鹤:生死哥德巴赫猜想
  8. iOS中将后台JSON数据转化为模型的总结
  9. mysql 无限上级_mysql无限上级
  10. Java基础2一基础语法
  11. support.SerializationFailedException: Failed to deserialize payload.
  12. 从客户端中检测到有潜在危险的 Request.Form 值。
  13. Shiro和Zuul权限管理整合方案
  14. 计算机网络的分类3:按网络的工作方式分类,分为集中式网络、分布式网络
  15. wps编号无法继续_wps的多级编号出问题了
  16. 【Eclipse】eclipse在文件夹下可以打开,桌面快捷方式报错
  17. android 简单的闪屏页,闪屏页的实现简单原理
  18. oracle 12988,ORA-12988: cannot drop column from table owned by SYS
  19. 论技术交流的重要性,两个PMOS管背靠背用法详解
  20. 从微信封杀拼多多链接浅谈我是如何解决微信屏蔽封杀外部以及广告链接的

热门文章

  1. 【NLP】如何评价一个摘要是合适的
  2. 视频直播软件开发中关于极光用户修改 [头像、昵称] 的教程
  3. 极光认证初始化失败8005和极光一键登录的流程
  4. 最经典的LOGO设计如何返璞归真
  5. Oracle_如何应对润秒
  6. 周报2京东页面及js
  7. 【转自知乎】5G关键技术之波束成形
  8. cesium鼠标移入移出实体显示提示框
  9. bootscript部署到服务器后图标不显示
  10. python中的UnitTest框架