一种快速的字符串匹配算法
来源:互联网 发布:金融市场技术分析淘宝 编辑:程序博客网 时间:2024/05/29 10:09
/* 快速字符串查找函数:
目前比较流行的字符串有KMP与BM算法,实际上KMP算法在使用的时候比strchr快不了多少,而BM算法也
大约只有KMP算法的3~5倍。这里介绍一个快速字符串查找函数。
举一个例子:
"Hello, world"中查找"word"子串,可以先把两个字符串按照首字节对好:
Hello, world
world
我们可以看出刚开始是不能匹配的,这样需要将子串往后移,至于每次移动多少就成了各种算法值得玩
味的地方了,当然,每次移动一个字符是最简单也最慢的算法;KMP利用以前匹配的信息进行移动,BM算
法利用反向查找的策略来加快移动。
我们可以知道,如果可以匹配的话,当前匹配的后一个字符","肯定需要判断,先检查","在子字符串中
不存在,所以直接移动子字符串的长度个位置,变成下面的模式:
Hello, world
world
继续看后面一个字符"d"在子字符串"world"中倒数第1个位置,将子字符串的"d"与查找字符串的"d"对齐
(移动1位),可以发现:
Hello, world
world
经过3次移动,便找到了查找子字符串,可以证明该方法平均移动的距离比BM算法大,所以该算法比BM算
法快。
*/
char *qsearch(char *text, int n, char *patt, int m)
{
int i = 0;
int tab_p[128] = {0};
char *p = patt;
char *temp_t, *t = text;
if (n < 0)
{
n = strlen(text);
}
if (m < 0)
{
m = strlen(patt);
}
if (m == 0)
{
return text;
}
/* 构造移动表,假设字符都在0~127之间,即纯ASCII码 */
for (i=0; i < 128; i++)
{
tab_p[i] = m + 1;
}
for (; *p; p++)
{
tab_p[*p] = m - (p - patt);
}
/* 开始移动查找 */
while (t+m <= text+n)
{
for(p = patt, temp_t = t; *p != 0; p++,temp_t++)
{
if (*p != *temp_t)
{
break;
}
}
if (*p == 0) /* 找到了 */
{
return t;
}
t += tab_p[*(t+m)];
}
return NULL;
}
- 一种快速的字符串匹配算法
- 一种快速的多模式匹配算法
- 一种基于Sunday算法的单模式字符串匹配算法
- BM(Boyer-Moore)字符串匹配算法的实现(一种有效常用的字符串匹配算法)
- 快速字符串模糊匹配--基于Horspool的模糊匹配算法
- 一种可做特殊用途的字符串匹配算法
- 一种类似和谐系统的字符串匹配算法
- 字符串查找匹配算法的一种Java实现
- 【算法】一种字符串匹配算法:z-algorithm
- KMP-字符串快速匹配算法
- Rabin-Karp-MATCHER字符串匹配算法; 一种效率还不错的匹配算法; 思想是关键.
- 字符串的快速匹配
- 一种快速求解最长回文字符串长度的算法
- 一种改进的字符串匹配算法--Quick Search算法
- 字符串匹配的算法
- HAL:快速的匹配算法
- HAL:快速的匹配算法
- 整数转字符串的一种快速实现
- FD_SET,FD_ISSET这些函数意思
- 常见Oracle HINT的用法
- Prevent Restore 1.1
- hibernate,spring,struts三个框架之间的关系
- 今天第而波,来点有深度的,赶紧做哈.
- 一种快速的字符串匹配算法
- 您不能初始化一个远程桌面连接,因为在远程计算机上的Windows软件被不兼容的软件.dll取代
- 字符串匹配之BM算法
- 基于DSP2407的对帧指针(FP)、栈指针(SP)的分析
- 迷茫
- struts的工作流程
- 我奇思怪想的界面缩放。
- 局部刷新的两种实现方式
- 串的模式匹配KMP算法