C++ SUNDY算法(BM算法的改进)

字符串查找算法中,最著名的两个是KMP算法Knuth-Morris-Pratt)和BM算法(Boyer-Moore)。两个算法在最坏情

况下均具有线性的查找时间。BM算法往往比KMP算法快上3-5倍。但是BM算法还不是最快的算法,这里介绍一种比BM算法更快一些的查找算法。

例如我们要在"substringsearchingalgorithm"查找"search"

第一步,把子串与文本左边对齐:

s u
b s t r i n g s e a r c h i n g a l g o r i t h m

s e a r c h

结果在第二个字符处发现不匹配,于是要把子串往后移动。

但是该移动多少呢?

最简单的做法是移动一个字符位置;

KMP是利用已经匹配部分的信息来移动;

BM算法是做反向比较,并根据已经匹配的部分来确定移动量。

而SUNDY算法是看紧跟在当前子串之后的那个字符(第一个字符串中的'i')。

显然,不管移动多少,这个字符是肯定要参加下一步的比较的,也就是说,如果下一步匹配到了,这个字符必须在子串内。

所以,可以移动子串,使子串中的最右边的这个字符与它对齐。

现在子串'search'中并不存在'i',则说明可

以直接跳过一大片,从'i'之后的那个字符开始作下一步的比较,如下:

s u b s t r i n g s e a
r c h i n g a l g o r i t h m

               
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 a l g o r i t h m

                         s e a r c h

这次匹配成功了!回顾整个过程,我们仅仅移动了两次子串就找到了匹配位置,

可以证明,用这个算法,每一步的移动量都比BM算法要大,所以肯定比BM算法更快。

下面是实现代码:

#include <iostream>
#include <string>
using namespace std;

void SUNDAY(char *text, char *patt)
{
	register size_t temp[256];
	size_t *shift = temp;
	size_t i, patt_size = strlen(patt), text_size = strlen(text);
	cout << "size : " << patt_size << endl;
	for( i=0; i < 256; i++ )
	{
		*(shift+i) = patt_size+1;
	}
	for( i=0; i < patt_size; i++ )
	{
		*(shift + (unsigned char)(*(patt+i))) = patt_size-i;
	}
	//shift['s']=6 步,shitf['e']=5 以此类推
	size_t limit = text_size - patt_size+1;
	for(i=0; i < limit; i += shift[ text[i+patt_size] ])
	{
		if( text[i] == *patt )
		{
			char *match_text = text + i + 1;
			size_t match_size = 1;
			do
			{
				// 输出所有匹配的位置
				if( match_size == patt_size )
				{
					cout << "the NO. is " << i << endl;
				}
			}while((*match_text++) == patt[match_size++]);
		}
	}
	cout << endl;
}
int main(void)
{
	char *text = new char[100];
	text = "substring searching algorithm search";
	char *patt = new char[10];
	patt = "search";
	SUNDAY(text, patt);
	return 0;
}


时间: 2024-10-12 07:30:12

C++ SUNDY算法(BM算法的改进)的相关文章

大话数据结构十二:字符串的模式匹配(BM算法)

1. BM算法简介: KMP算法其实并不是效率最高的字符串匹配算法,实际应用的并不多,各种文本编辑器的"查找"功能大多采用的是BM算法(Boyer Moore).BM算法效率更高,更容易理解. 2. BM算法分析: (1) 假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE". (2) 首先,"字符串"与"搜索词"头部对齐,从尾部开始比较.这是一个很聪明的想法,因为如

bm算法-模式匹配中的BM算法的C语言源代码

问题描述 模式匹配中的BM算法的C语言源代码 用c实现BM算法,匹配字符串和匹配文本都是手动输入,然后输出是否在匹配文本中找到匹配字符串,结果一定要正确没bug.

C++BM算法

BM算法是一种非常著名的字符串查找算法: 在字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的c库函数strstr()快多少,而BM算法则往往比KMP算法快上3-5倍. 下面我们介绍一下BM算法: 1,BM算法是Boyer-Moore算法的简称,由Boyer 和Moore提出.  2,BM算法也是一种快速串匹配算法,BM算法与KMP算法的主要区别是

随着百度算法不断地更新改进,网站降权似乎成了家常便饭的事情

随着百度算法不断地更新改进,网站降权似乎成了家常便饭的事情,这个随时随地的困扰着无数的站长,一旦网站遭遇降权的厄运想要短时间内恢复是一件极为困难的事情.笔者的众多网站几乎都经历过从降权到恢复的过程. 今天要谈论的主题自然是网站被降权后要怎样做才能恢复,要判断网站降权其实很简单,除新站外,一般网站降权都会出现:site只剩下首页.网站收录除百度月底大更新以外的剧减.关键词排名一夜之间百名之外.网站收录全部消失,domain不在首页等等问题.那么网站降权后我们该怎么做呢? 1,调整心理状态 很多站长

最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine-->mine..... 那么,就存在这样一个问题:给定一个单词作为起始单词(相当于图的源点),给定另一个单词作为终点,求从起点单词经过的最少变换(每次变换只会变换一个字符),变成终点单词. 这个问题,其实就是最短路径问题. 由于最短路径问题中,求解源点到终点的最短路径与求解源点到图中所有顶点的最短路径复

文本比较算法Ⅳ——Nakatsu算法

在"文本比较算法Ⅰ--LD算法"."文本比较算法Ⅱ--Needleman/Wunsch算法"中介绍的LD算法和LCS算法都是基于动态规划的.它们的时间复杂度O(MN).空间复杂度O(MN)(在基于计算匹配字符串情况下,是不可优化的.如果只是计算LD和LCS,空间占用可以优化到O(M)). Nakatsu算法在计算匹配字符串的情况下,有着良好的时间复杂度O(N(M-P))和空间复杂度O(N2),而且在采取适当的优化手段时,可以将空间复杂度优化到O(N),这是一个很诱人

数据结构教程 第三课 算法及算法设计要求

本课主题: 算法及算法设计要求 教学目的: 掌握算法的定义及特性,算法设计的要求 教学重点: 算法的特性,算法设计要求 教学难点: 算法设计的要求 授课内容: 一.算法的定义及特性 1.定义: ispass(int num[4][4]) { int i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) if(num[i][j]!=i*4+j+1)/*一条指令,多个操作*/ return 0; return 1; }/*上面是一个类似华容道游戏中判断游戏是否结束的算法*/

《算法帝国》:被算法和算法交易改变的未来

当我们用崭新的视角去观察与思考,世界就会变成另外的模样.这是我们筹备举办"改变未来的算法与算法交易"研讨会的初衷. 美国雄霸全球依赖华尔街与硅谷等强大支柱,而近年来,算法对华尔街的渗透与控制体现出颠覆未来产业生态的力量.图灵公司出版的<算法帝国>一书中介绍,2000年,华尔街通过计算机程序交易的比率不足美国股市交易量的10%:2008年上半年,自动化电子交易占了全美股市交易量的60%:现在,华尔街70%以上的交易依靠所谓的黑盒子或者算法交易(闪电交易)运行.银行家和股票经纪

算法——贪心算法

贪心算法 贪心算法通过一系列的选择来得到问题的解.它所做的每一个选择都是当前状态下局部的最好选择,即贪心选择. 贪心选择的一般特征:贪心选择性质和最优子结构性质. 贪心选择性质: 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到.这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别.在动态规划算法中,每步所做的选择往往依赖于相关子问题的解.因而只有在解出相关子问题后,才能做出选择.而在贪心算法中,仅在当前状态下做出最好选择,即局部最优选择.