匹配算法

时间:2024-09-08 15:44:30编辑:揭秘君

串的模式匹配是什么?

串的模式匹配即子串定位,是一种重要的串的运算。设S是给定的主串,T是给定的子串,在主串S中查找等于子串T的串的过程称为模式匹配,T称为模式串。如果在S中找到T子串,则称匹配成功,函数返回T在S中首次出现的存储位置(或序号),否则匹配失败,返回0。为了运算方便,假设串采用顺序存储结构,串的长度存放在0号单元,串值从1号单元开始存放,这样字符序号与存储位置一致。

串模式匹配算法(C语言)100分悬赏

第一个朴素算法:
1.普通的串模式匹配算法:
int index(char s[],char t[],int pos)
/*查找并返回模式串T在S中从POS开始的位置下标,若T不是S的子串.则返回-1.*/
{
int i,j,slen,tlen;
i=pos;j=0; //i,j分别指示主串和模式串的位置.
slen=strlen(s);tlen=strlen(t); //计算主串和模式串的长度.
while(i {
if(s[i]==t[j]) {i++;j++;}
else {i=i-j+1;j=0;}
}
if(j>=tlen) return i-tlen;
return -1;
}


第二个KMP算法.该算法支持从主串的任意位置开始搜索.
2.KMP算法:
//求模式串的next函数.
void get_next(char *p,int next[])
{
int i,j,slen;
slen=strlen(p);i=0;
next[0]=-1;j=-1;
while(i {
if(j==-1||p[i]==p[j]) {++i;++j;next[i]=j;}
else j=next[j];
}
}

//KMP模式匹配算法
int index_kmp(char *s,char *p,int pos,int next[])
/* 利用模式串P的NEXT函数,求P在主串S中从第POS个字符开始的位置*/
/*若匹配成功.则返回模式串在主串中的位置下标.否则返回-1 */
{
int i,j,slen,plen;
i=pos-1;j=-1;
slen=strlen(s);plen=strlen(p);
while(i {
if(j==-1||s[i]==p[j]) {++i;++j;}
else j=next[j];


【算法笔记】字符串匹配

BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法:

主串和模式串:
在字符串 A 中查找字符串 B,那字符串 A 就是主串,字符串 B 就是模式串。我们把主串的长度记作 n,模式串的长度记作 m

我们在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的。

BF 算法的时间复杂度是 O(n*m)

等价于

比如匹配Google 和Goo 是最好时间复杂度,匹配Google 和ble是匹配失败的最好时间复杂度。

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特—莫里斯—普拉特算法。KMP算法主要分为两个步骤:字符串的自我匹配,目标串和模式串之间的匹配。

看来网上很多的文章,感觉很多的都没有说清楚,这里直接复制阮一峰的内容,讲的很清晰
内容来自 http://www.ruanyifeng.com/blog/

首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较。因为B与A不匹配,所以搜索词后移一位。

因为B与A不匹配,搜索词再往后移。

就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止。

接着比较字符串和搜索词的下一个字符,还是相同。

直到字符串有一个字符,与搜索词对应的字符不相同为止。

这时,最自然的反应是,将搜索词整个后移一位,再从头逐个比较。这样做虽然可行,但是效率很差,因为你要把"搜索位置"移到已经比较过的位置,重比一遍。

一个基本事实是,当空格与D不匹配时,你其实知道前面六个字符是"ABCDAB"。KMP算法的想法是,设法利用这个已知信息,不要把"搜索位置"移回已经比较过的位置,继续把它向后移,这样就提高了效率。

怎么做到这一点呢?可以针对搜索词,算出一张《部分匹配表》(Partial Match Table)。这张表是如何产生的,后面再介绍,这里只要会用就可以了。

已知空格与D不匹配时,前面六个字符"ABCDAB"是匹配的。查表可知,最后一个匹配字符B对应的"部分匹配值"为2,因此按照下面的公式算出向后移动的位数:

因为 6 - 2 等于4,所以将搜索词向后移动4位。

因为空格与C不匹配,搜索词还要继续往后移。这时,已匹配的字符数为2("AB"),对应的"部分匹配值"为0。所以,移动位数 = 2 - 0,结果为 2,于是将搜索词向后移2位。

因为空格与A不匹配,继续后移一位。

逐位比较,直到发现C与D不匹配。于是,移动位数 = 6 - 2,继续将搜索词向后移动4位。

逐位比较,直到搜索词的最后一位,发现完全匹配,于是搜索完成。如果还要继续搜索(即找出全部匹配),移动位数 = 7 - 0,再将搜索词向后移动7位,这里就不再重复了。

下面介绍《部分匹配表》是如何产生的。

首先,要了解两个概念:"前缀"和"后缀"。 "前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。

"部分匹配值"就是"前缀"和"后缀"的最长的共有元素的长度。以"ABCDABD"为例,

"部分匹配"的实质是,有时候,字符串头部和尾部会有重复。比如,"ABCDAB"之中有两个"AB",那么它的"部分匹配值"就是2("AB"的长度)。搜索词移动的时候,第一个"AB"向后移动4位(字符串长度-部分匹配值),就可以来到第二个"AB"的位置。

BM(Boyer-Moore)算法。它是一种非常高效的字符串匹配算法,有实验统计,它的性能是著名的KMP 算法的 3 到 4 倍。

BM 算法包含两部分,分别是坏字符规则(bad character rule)和好后缀规则(good suffix shift)

未完待续

参考文章:
字符串匹配的Boyer-Moore算法


字符串匹配的传统算法

传统的匹配算法串匹配算法虽然发展了几十年,然而非常实用的算法是近年才出现。串匹配问题的研究存在理论研究和实际应用的脱节。那些专门从事算法研究的学者关心的只是理论上看起来很美妙的算法——具有很好的时间复杂度。而开发人员只追求实际应用中尽可能快的算法。两者之间从不注意对方在干什么。将理论研究和实际应用结合的算法(如BNDM算法)只是近年才出现。在实际应用中常常很难找到适合需求的算法——这样的算法实际上是存在的,但是只有资深专家才比较了解。考虑如下情况,一位软件开发人员,或者一位计算生物学家,或者一位研究人员,又或者一位学生,对字符串匹配领域并没有深入了解,可是现在需要处理一个文本搜索问题。那些汗牛充栋的书籍使得阅读者淹没在各种匹配算法的海洋中,却没有足够的知识选择最适用的算法。最后,常常导致这样的局面:选择一种最简单的算法加以实现。这往往导致很差的性能,从而影响整个开发系统的质量。更糟糕的是,选择了一个理论上看起来很漂亮的算法,并且花费了大量精力去实现。结果,却发现实际效果和一个简单算法差不多,甚至还不如简单算法。因此,应该选用一种“实用”算法,即在实际应用中性能较好,并且一个普通程序员能在几小时内完成算法的实现代码。另外,在字符串匹配研究领域中,一个人所共知的事实是“算法的思想越简单,实际应用的效果越好”。传统的串匹配算法可以概括为前缀搜索、后缀搜索、子串搜索。代表算法有KMP,Shift-And,Shift-Or,BM,Horspool,BNDM,BOM等。所用到的技术包括滑动窗口、位并行、自动机、后缀树等。

KMP模式匹配算法

这里有个相似的问题,也是我回答的,讲了原理http://zhidao.baidu.com/question/329386416.html如果你只要代码的话一个简单的代码#include #include int index_KMP(char *s,char *t,int pos);void get_next(char *t,int *); char s[10]="abcacbcba";char t[4]="bca";int next[4];int pos=0;int main(){ int n; get_next(t,next); n=index_KMP(s,t,pos); printf("%d",n); return 0;}int index_KMP(char *s,char *t,int pos){ int i=pos,j=1; while (i<=(int)strlen(s)&&j<=(int)strlen(t)) { if (j==0||s[i]==t[j-1]) { i++; j++; } else j=next[j]; } if (j>(int)strlen(t)) return i-strlen(t)+1; else return 0;}void get_next(char *t,int *next){ int i=1,j=0; next[0]=next[1]=0; while (i<(int)strlen(t)) { if (j==0||t[i]==t[j]) { i++; j++; next[i]=j; } else j=next[j]; } }


求助!!!!!!!模式匹配和KMP算法

这个题目最难的是KMP算法和实现。其他的书本上都有的。

我自己写的个程序:
测试结果如下:
113113113113113113113113113113113113113113113111311311311311311311
13113113111
at 37

贴上源代码:

#include"stdio.h"
#include "conio.h"
#include "stdio.h"
#include "math.h"

int result;
char pat[]="13113113111";
char str[]="113113113113113113113113113113113113113113113111311311311311311311";
int next[7];

void getNext(char pat[], int next[])
{
int j = 0;
int k = -1;
next[0] = -1;
while (pat[j])
{
if ( k == -1 || pat[j] == pat[k])
{
j++;
k++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int KMP(char *str1, char*pat, int *next)
{
int i=0,j=0;
while(str[i])
{
if(pat[j]==0)
return i-j;
if(j==0 || str[i]==pat[j])
{
++i;
++j;
}else
j=next[j];
}
if(pat[j]==0)
return i-j;
return -1;
}

int main(int argc, char* argv[])
{
int i;

getNext(pat,next);
result=KMP(str,pat,next);
printf("%s\n",str);
for(i=0;i printf("%s\n",pat);
printf("at %d\n",result);
getch();
return 0;
}
祝你好运!


用什么算法实现人脸匹配

实现人脸匹配的算法有很多种,以下是其中几种常用的算法:1. 基于特征点的算法:通过检测人脸的关键点,如眼睛、鼻子、嘴巴等,提取特征向量,通过计算两个人脸特征向量之间的相似度来进行人脸匹配。2. 基于深度学习的算法:使用深度神经网络(Deep Neural Network,DNN)训练模型,将人脸图像映射成具有固定维度的特征向量,再通过计算两个特征向量之间的相似度来进行人脸匹配。3. 基于局部特征的算法:将人脸图像分成多个局部区域,提取每个区域的特征向量,再将多个局部特征向量合并成一个全局特征向量,通过计算两个全局特征向量之间的相似度来进行人脸匹配。4. 基于传统机器学习的算法:使用传统的机器学习算法,如支持向量机(Support Vector Machine,SVM)、随机森林(Random Forest,RF)等,通过训练模型来学习人脸的特征,再通过计算两个人脸特征向量之间的相似度来进行人脸匹配。【摘要】
用什么算法实现人脸匹配【提问】
实现人脸匹配的算法有很多种,以下是其中几种常用的算法:1. 基于特征点的算法:通过检测人脸的关键点,如眼睛、鼻子、嘴巴等,提取特征向量,通过计算两个人脸特征向量之间的相似度来进行人脸匹配。2. 基于深度学习的算法:使用深度神经网络(Deep Neural Network,DNN)训练模型,将人脸图像映射成具有固定维度的特征向量,再通过计算两个特征向量之间的相似度来进行人脸匹配。3. 基于局部特征的算法:将人脸图像分成多个局部区域,提取每个区域的特征向量,再将多个局部特征向量合并成一个全局特征向量,通过计算两个全局特征向量之间的相似度来进行人脸匹配。4. 基于传统机器学习的算法:使用传统的机器学习算法,如支持向量机(Support Vector Machine,SVM)、随机森林(Random Forest,RF)等,通过训练模型来学习人脸的特征,再通过计算两个人脸特征向量之间的相似度来进行人脸匹配。【回答】
亲亲还有什么问题吗?【回答】


用什么算法实现人脸匹配

亲亲,下午好,人脸匹配是一个复杂的问题,需要综合考虑多种算法。以下是一些常用的算法:1 特征提取:通过深度学习方法,如卷积神经网络(CNN),抽取人脸图像中的特征向量,常用方法有VGG、ResNet、Inception等。2 相似度计算:计算两张人脸图像之间的相似度,比较常用的方法包括余弦相似度、欧式距离、曼哈顿距离等。3数据库管理:将多个人脸图像的特征向量存储在数据库中,并设定阈值,当输入的人脸图像与数据库中的某张人脸图像的相似度大于阈值时,认为两者匹配成功。综上所述,人脸匹配通常使用深度学习网络进行特征提取,并使用相似度计算算法和数据库管理来实现匹配【摘要】
用什么算法实现人脸匹配【提问】
亲亲,下午好,人脸匹配是一个复杂的问题,需要综合考虑多种算法。以下是一些常用的算法:1 特征提取:通过深度学习方法,如卷积神经网络(CNN),抽取人脸图像中的特征向量,常用方法有VGG、ResNet、Inception等。2 相似度计算:计算两张人脸图像之间的相似度,比较常用的方法包括余弦相似度、欧式距离、曼哈顿距离等。3数据库管理:将多个人脸图像的特征向量存储在数据库中,并设定阈值,当输入的人脸图像与数据库中的某张人脸图像的相似度大于阈值时,认为两者匹配成功。综上所述,人脸匹配通常使用深度学习网络进行特征提取,并使用相似度计算算法和数据库管理来实现匹配【回答】


bm是什么意思呢

bm的意思有很多,主要有以下几种:1.英文单词:BusinessManagement,意思就是工商管理专业,是市场经济当中最常见的管理专业。2.微信的聊天记录和语音文件。3.水准点,指绝对标高,是理论上的黄海平面基准的高度。4.快时尚品牌店铺的名称,全称叫brandy&melville,主打少女服装,样式新颖,价格亲民,以基础款为主,最大的特点就是尺码小,很受欧美青少年女性的欢迎。以上是几种bm常见的意思,在不同的场景下,bm可能还会有不同含义,可以结合词语出现的场景,判断其具体含义。【摘要】
bm是什么意思呢【提问】
bm的意思有很多,主要有以下几种:1.英文单词:BusinessManagement,意思就是工商管理专业,是市场经济当中最常见的管理专业。2.微信的聊天记录和语音文件。3.水准点,指绝对标高,是理论上的黄海平面基准的高度。4.快时尚品牌店铺的名称,全称叫brandy&melville,主打少女服装,样式新颖,价格亲民,以基础款为主,最大的特点就是尺码小,很受欧美青少年女性的欢迎。以上是几种bm常见的意思,在不同的场景下,bm可能还会有不同含义,可以结合词语出现的场景,判断其具体含义。【回答】


bm是什么意思?

bm的意思有很多:1、BM(BM匹配算法):BM算法被认为是亚线性串匹配算法,它在最坏情况下找到模式所有出现的时间复杂度为O(mn),在最好情况下执行匹配找到模式所有出现的时间复杂度为O(n/m)。2、BM(Black Matrix)是指在玻璃、塑料、金属或树脂等材料上进行的电子印刷。我们现有的智能手机屏幕上周边的有色部分就是BM的一种。3、BM(绝对标高)BM指绝对标高,也就是说与理论的黄海平面基准的高度。BM即Bench Mark(水准点)。4、BM(魔兽争霸兽族英雄):魔兽争霸人物兽族英雄剑圣简称。剑圣(BM)一个物理输出英雄,主要的操作技巧是前期合理运用疾风步去别人家里骚扰,主偷敌人英雄,可以造成敌方前期相当大的牵制。5、BM(前西德的波尼M(BoneyM)演唱组)前西德的波尼M (Boney M)演唱组是七八十年代十分受人瞩目的一个演唱组,乐队成员来自四面八方,有的来自西印度群岛,有的来自牙买加。制作人是弗朗可·菲林(Frank Fariam)。应对策略如果你想识别出哪个剑圣是真身的话,那么按下alt 键,注意那些被剑圣攻击的单位的生命值,看哪个在减少。幻象受到2倍的伤害,所以,如果你发现哪个剑圣生命值下降特别快,那么它肯定是假的。你也可以通过剑圣的行动来分辨哪个是真的,因为很多时候需要剑圣攻击一些特定的目标,而真正的剑圣只有一个。也许会有玩家试图利用幻象的行动来欺骗你,不过大部分玩家做不到这一点。当你分辨出真正的剑圣时,就不要犹豫了。

上一篇:霹雳猫2011

下一篇:girl with one eye