Boyer-Moore字符串查找算法的实现
前段时间在园子里看到一篇讲Boyer-Moore算法原理的文章http://kb.cnblogs.com/page/176945/,写的很详细,于是在这里自己写个C语言的实现,权当是练手吧。
基本思路是每次从模式串的最右端开始匹配,如果后缀不匹配,模式串可以快速地后移,从而快速地匹配字符串。要用一个数组right[],来存储失配时模式串的移动步数。数组的大小是256,即扩展的ASCII码表大小(即256个字符)。若对应字符不存在于模式串中,则赋值-1,否则表示字符出现在模式串中,查找失配时,模式串向右移动的步数。应该还有优化的空间,暂时没想了。
分成两个文件,一个.h文件,一个.c文件。实现中,若匹配成功则返回第一次出现模式串的位置,若不匹配则返回模式串长度。
N: 被搜索的字符串长度。
M: 模式串长度。
strsearch.h :
#ifndef _STRSEARCH_H
#define _STRSEARCH_H /***ASCII list length***/ #define ASCII_LIST_LENGTH 256 /* Interface */ extern int BMSearch(char *dest_str,char *pattern); #endif
strsearch.c :
#include <stdio.h>
#include <string.h>
#include "strsearch.h" #ifdef _cplusplus
extern "C"{
#endif /*
******Implementation of Boyer-Moore Algorithm******
*
* This function is to solve the string search ,and somhow we
* can find the position of pattern string in the dest string
* quickly.
*
* Copyright(c) 2013.9.6 xiaoh
* All rights reserved.
*
***************************************************
*/ /*
* This function is to build the jump step list for each
* charactor.
*
*/ void BoyerMoore(char *pattern,int right[])
{
int M = strlen(pattern); for(int c=;c<ASCII_LIST_LENGTH;c++)
right[c] = -;
for(int j=;j<M;j++)
right[pattern[j]] = j;
} /*
* Main function of Boyer-More Search Algorithm
*
*/ int BMSearch(char *dest_str,char *pattern)
{
/*Array right: steps to move for the pattern string*/
int right[ASCII_LIST_LENGTH]; BoyerMoore(pattern,right); int N = strlen(dest_str);
int M = strlen(pattern); int skip; //number to jump
for(int i=;i<=N-M;i+=skip)
{
skip = ;
for(int j=M-;j>=;j--)
{
if(pattern[j]!=dest_str[j+i])
{
skip = j-right[dest_str[i+j]];//calculate the step to jump
if(skip<)
skip = ;
break;
}
}
if(skip == )
{
printf("Search finished successfully.\n");
return i;
}
}
printf("String cannot be found.\n");
return N;
} #ifdef _cplusplus
}
#endif
查找的最好情况时间复杂度约为O(N/M)(其实是查找完,但不匹配情况),这里需要和O(M)比较下,如果M比较大的话N/M就比较小一些;在最坏情况下,需要比较N/M组,每组比较M次,所以时间复杂度为O(N)。其查找速度确实比KMP算法还要快。
Boyer-Moore字符串查找算法的实现的更多相关文章
- python查找算法的实现-二分法
1.算法:(设查找的数组期间为array[low, high]) (1)确定该期间的中间位置K(2)将查找的值T与array[k]比较.若相等,查找成功返回此位置:否则确定新的查找区域,继续二分查找. ...
- 查找算法的实现(C/C++实现)
存档: #include <stdio.h> #include <stdlib.h> #define max 20 typedef int keytype; #include ...
- Go语言 二分查找算法的实现
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,二分查找算法的前提是传入的序列是有序的(降序或升序),并且有一个目标值. 二分查找的核心思想是将 n 个元素分成大 ...
- 数据结构与算法--Boyer-Moore和Rabin-Karp子字符串查找
数据结构与算法--Boyer-Moore和Rabin-Karp子字符串查找 Boyer-Moore字符串查找算法 注意,<算法4>上将这个版本的实现称为Broyer-Moore算法,我看了 ...
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
- Sunday算法(字符串查找、匹配)
字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...
- Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...
- Rabin-Karp字符串查找算法
1.简介 暴力字符串匹配(brute force string matching)是子串匹配算法中最基本的一种,它确实有自己的优点,比如它并不需要对文本(text)或模式串(pattern)进行预处理 ...
- C/C++字符串查找函数
C/C++ string库(string.h)提供了几个字符串查找函数,如下: memchr 在指定内存里定位给定字符 strchr 在指定字符串里定位给定字符 strcspn 返回在字符串str1里 ...
随机推荐
- iOS开发 - OC - block的详解 - 基础篇
深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...
- 图像块的访问(填充 padding,步长 stride,窗 Window/kernel/filter)
无填充是有填充的特例(填充为 1). utilities(matlab)-- 图像分块(image2cols.cols2image)(未填充) 1. 一个图像块 ⇒ 返回一个值 输出矩阵的大小: ou ...
- SQLSERVER使用Spring Data JPA实现模糊查询like
mysql下可以使用 CONCAT函数 @Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:use ...
- linux的各个子系统
Linux基本的子系统主要有CPU.Memory.IO.Network. 在这些子系统中,它们之间相互之间高度依赖.不论什么一个子系统的高负载都会引起其它子系统出现故障. 比如: 大量的页调入请求对内 ...
- Ajax打开三种页面的请求
xmlhttprequest对象可以打开两种方式的页面请求 1,.asmx格式的webservice页面. 2,.aspx格式的web窗体 其中web窗体可以是调用一新建的web窗体,同时调用和被调用 ...
- Robot Framework 快速入门_中文版
目录 介绍 概述 安装 运行demo 介绍样例应用程序 测试用例 第一个测试用例 高级别测试用例 数据驱动测试用例 关键词keywords 内置关键词 库关键词 用户定义关键词 变量 定义变量 使用变 ...
- 信小程序支付(C#后台+前台)
今天为大家带来比较简单的支付后台处理 首先下载官方的c#模板(WxPayAPI),将模板(WxPayAPI)添加到服务器上,然后在WxPayAPI项目目录中添加两个“一般处理程序” (改名为GetOp ...
- Android Training - 使用IntentService运行任务(Lesson 1 - 创建IntentService)
写在http://hukai.me/blog/android-training-18-running-background-service-lesson-1/ 版权声明:本文博客原创文章,博客,未经同 ...
- WPF 调用资源图片
原文:WPF 调用资源图片 最近做的wpf项目中,在开发的时候,把图片放到了bin下面,采用了imagePath =System.IO.Directory.GetCurrentDirectory()+ ...
- ListView、TreeView和DataGrid。
原文:ListView.TreeView和DataGrid. 1.ListView. ListView继承自简单的没有特色的ListBox,并使用View属性进行扩展.增加了对基于列显示的支持,并增加 ...