搜档网
当前位置:搜档网 › 微机原理字符串匹配

微机原理字符串匹配

微机原理字符串匹配
微机原理字符串匹配

大学学生实验报告

(2010 —2011 学年第二学期)

课程名称:微型计算机原理与接口技术开课实验室:205 2011年 5 月 30 日

一、实验目的、要求

1.掌握提示信息的使用方法及键盘输入信息的用法。

二、实验原理及基本技术路线图或实验内容

1.编写程序,实现两个字符串比较。如果两个字符串中有一个字符相同,显示“MATCH”,否则,显示“NO MATCH”。

2.程序框图

三、所用仪器、材料和软件

软件名称为:MASM FOR Windows 集成实验环境2009.7

四、实验方法、步骤

根据实验的目的在该环境中编写出源代码,在进行调试、运行后,看能否得出结果。

五、源码程序编制及分析注释

程序清单及注释

CRLF MACRO ;宏定义

MOV AH,02H ;AH=02H

MOV DL,0DH ;DL=0DH

INT 21H ;系统功能调用来输出个回车字符

MOV AH,02H ;AH=02H

MOV DL,0AH ;DL=0AH

INT 21H ;系统功能调用来输出一个换行符ENDM ;宏定义结束

DATA SEGMENT ;数据段定义

MESS1 DB 'MATCH',0DH,0AH,'$' ;定义8个存储单元的数据

MESS2 DB 'NO MATCH',0DH,0AH,'$' ;定义11个存储单元的数据MESS3 DB 'INPUT STRING1:',0DH,0AH,'$' ;定义17个存储单元的数据MESS4 DB 'INPUT STRING2:',0DH,0AH,'$' ;定义17个存储单元的数据MAXLEN1 DB 81 ;字符串1的缓冲区最大字符数ACTLEN1 DB ? ;字符串1的实际输入字符的个数STRING1 DB 81 DUP (?) ;用来存储字符串1的81个单元MAXLEN2 DB 81 ;字符串2的缓冲区最大字符数ACTLEN2 DB ? ;用来存放字符串2的实际字符个数STRING2 DB 81 DUP (?) ;用来存储字符串2的81个单元DATA ENDS ;数据段定义结束

STACK SEGMENT STACK ;堆栈段定义

STA DB 50 DUP (?) ;在堆栈段定义50个空字符

TOP EQU LENGTH STA ;TOP=50

STACK ENDS ;堆栈段定义结束

CODE SEGMENT ;代码段定义

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ;段分配

START: MOV AX,DATA ;

MOV DS,AX ;将数据段的段地址赋给DS

MOV ES,AX ;将数据段的段地址赋给ES

MOV AX,STACK ;

MOV SS,AX ;将堆栈段的段地址赋给SS

MOV SP,TOP ;SP=50

MOV AH,09H ;AH=09H

MOV DX,OFFSET MESS3 ;

INT 21H ;输出'INPUT STRING1:

MOV AH,0AH

MOV DX,OFFSET MAXLEN1

INT 21H ;(DS:DX)=最大字符数,(DS:DX+1)=实际的字符数

CRLF

MOV AH,09H

MOV DX,OFFSET MESS4

INT 21H ;输出INPUT STRING2:

MOV AH,0AH

MOV DX,OFFSET MAXLEN2

INT 21H ;(DS:DX)=最大字符数,(DS:DX+1)=实际的字符数

CRLF ;宏调用

CLD ;DF=0,则串操作有低地址向高地址方向进行

MOV SI,OFFSET STRING1 ;将字符串1的偏移地址赋给SI

MOV CL,[SI-1] ;将字符串1的字符实际个数赋给CL

MOV CH,00H ;CH=00H

KKK: MOV DI,OFFSET STRING2 ;将字符串2的偏移地址赋给DI PUSH CX ;将CX中的值即为字符串1的字符个数压入堆栈

MOV CL,[DI-1] ;将字符串2的字符个数赋给CL

MOV CH,00H ;CH=00H

MOV AL,[SI] ;取出字符串1的第一个字符给AL

MOV DX,DI ;将字符串2的第一个字符赋给DX

REPNZ SCASB ;CX!=0(没有查完)和ZF=0(不相等)时重复

JZ GGG ;ZF=1,表示已经搜到了相等的字符,则转出

INC SI ;SI=SI+1

POP CX ;弹出原先字符串1中剩下未被进行比较的字符个数

LOOP KKK ;CX-1!=0则继续返回到子过程KKK

MOV AH,09H

MOV DX,OFFSET MESS2

INT 21H ;否则CX=0时的系统功能调用将显示NO MATCH

JMP PPP ;将跳转到PPP

GGG: MOV AH,09H

MOV DX,OFFSET MESS1

INT 21H ;系统功能调用将显示MATCH

PPP: MOV AX,4C00H

INT 21H ;系统功能调用显示控制台的操作界面

CODE ENDS ;代码段结束

END START ;伪指令结束

六、实验结果、分析和结论和体会

1、实验结果如图所示

2、实验分析:

注意相关指令的运用与子啊存储空间中分段的运用

3、体会:对一些指令进一步熟悉,对指令的执行过程有很好的了解

字符串的模式匹配算法

在前面的图文中,我们讲了“串”这种数据结构,其中有求“子串在主串中的位置”(字符串的模式匹配)这样的算法。解决这类问题,通常我们的方法是枚举从A串(主串)的什么位置起开始与B串(子串)匹配,然后验证是否匹配。假设A串长度为n,B串长度为m,那么这种方法的复杂度是O(m*n)的。虽然很多时候复杂度达不到m*n(验证时只看头一两个字母就发现不匹配了),但是我们有许多“最坏情况”,比如: A=“aaaaaaaaaaaaaaaaaaaaaaaaab”,B=“aaaaaaaab”。 大家可以忍受朴素模式匹配算法(前缀暴力匹配算法)的低效吗?也许可以,也许无所谓。 有三位前辈D.E.Knuth、J.H.Morris、V.R.Pratt发表一个模式匹配算法,最坏情况下是O(m+n),可以大大避免重复遍历的情况,我们把它称之为克努特-莫里斯-普拉特算法,简称KMP算法。 假如,A=“abababaababacb”,B=“ababacb”,我们来看看KMP是怎样工作的。我们用两个指针i和j分别表示,。也就是说,i是不断增加的,随着i 的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前j个字符(j当然越大越好),现在需要检验A[i+1]和B[j+1]的关系。 例子: S=“abcdefgab” T=“abcdex” 对于要匹配的子串T来说,“abcdex”首字符“a”与后面的串“bcdex”中任意一个字符都不相等。也就是说,既然“a”不与自己后面的子串中任何一字符相等,那么对于主串S来说,前5位字符分别相等,意味着子串T的首字符“a”不可能与S串的第2到第5位的字符相等。朴素算法步骤2,3,4,5的判断都是多余,下次的起始位置就是第6个字符。 例子: S=“abcabcabc” T=“abcabx”

模式匹配的KMP算法详解

模式匹配的KMP算法详解 模式匹配的KMP算法详解 这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KMP算法。大概学过信息学的都知道,是个比较难理解的算法,今天特把它搞个彻彻底底明明白白。 注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法: int Index(String S,String T,int pos)//参考《数据结构》中的程序 { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length && j<=T.Length) { if(S[i]==T[j]){++i;++j;} else{i=i-j+2;j=1;}//**************(1) } if(j>T.Length) return i-T.Length;//匹配成功 else return 0; } 匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?回溯,没错,注意到(1)句,为什么要回溯,看下面的例子: S:aaaaabababcaaa T:ababc aaaaabababcaaa ababc.(.表示前一个已经失配) 回溯的结果就是 aaaaabababcaaa a.(babc) 如果不回溯就是 aaaaabababcaaa aba.bc 这样就漏了一个可能匹配成功的情况 aaaaabababcaaa ababc 为什么会发生这样的情况?这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。如果T为abcdef这样的,大没有回溯的必要。

基于HALCON的模板匹配方法总结.

基于HALCON的模板匹配方法总结 基于HALCON的模板匹配方法总结 HDevelop开发环境中提供的匹配的方法主要有三种,即Component-Based、Gray-Value-Based、Shape-Based,分别是基于组件(或成分、元素)的匹配,基于灰度值的匹配和基于形状的匹配。这三种匹配的方法各具特点,分别适用于不同的图像特征,但都有创建模板和寻找模板的相同过程。这三种方法里面,我主要就第三种-基于形状的匹配,做了许多的实验,因此也做了基于形状匹配的物体识别,基于形状匹配的视频对象分割和基于形状匹配的视频对象跟踪这些研究,从中取得较好的效果。在VC下往往针对不同的图像格式,就会弄的很头疼,更不用说编写图像特征提取、模板建立和搜寻模板的代码呢,我想其中间过程会很复杂,效果也不一定会显著。下面我就具体地谈谈基于HALCON的形状匹配算法的研究和心得总结。 1. Shape-Based matching的基本流程 HALCON提供的基于形状匹配的算法主要是针对感兴趣的小区域来建立模板,对整个图像建立模板也可以,但这样除非是对象在整个图像中所占比例很大,比如像视频会议中人体上半身这样的图像,我在后面的视频对象跟踪实验中就是针对整个图像的,这往往也是要牺牲匹配速度的,这个后面再讲。基本流程是这样的,如下所示: ⑴ 首先确定出ROI的矩形区域,这里只需要确定矩形的左上点和右下点的坐标即可,gen_rectangle1()这个函数就会帮助你生成一个矩形,利用 area_center()找到这个矩形的中心;

⑵ 然后需要从图像中获取这个矩形区域的图像,reduce_domain()会得到这个ROI;这之后就可以对这个矩形建立模板,而在建立模板之前,可以先对这个区域进行一些处理,方便以后的建模,比如阈值分割,数学形态学的一些处理等等; ⑶ 接下来就可以利用create_shape_model()来创建模板了,这个函数有许多参数,其中金字塔的级数由Numlevels指定,值越大则找到物体的时间越少,AngleStart和AngleExtent决定可能的旋转范围,AngleStep指定角度范围搜索的步长;这里需要提醒的是,在任何情况下,模板应适合主内存,搜索时间会缩短。对特别大的模板,用Optimization来减少模板点的数量是很有用的;MinConstrast将模板从图像的噪声中分离出来,如果灰度值的波动范围是10,则MinConstrast应当设为10;Metric参数决定模板识别的条件,如果设为’use_polarity’,则图像中的物体和模板必须有相同的对比度;创建好模板后,这时还需要监视模板,用inspect_shape_model()来完成,它检查参数的适用性,还能帮助找到合适的参数;另外,还需要获得这个模板的轮廓,用于后面的匹配,get_shape_model_contours()则会很容易的帮我们找到模板的轮廓; ⑷ 创建好模板后,就可以打开另一幅图像,来进行模板匹配了。这个过程也就是在新图像中寻找与模板匹配的图像部分,这部分的工作就由函数 find_shape_model()来承担了,它也拥有许多的参数,这些参数都影响着寻找模板的速度和精度。这个的功能就是在一幅图中找出最佳匹配的模板,返回一个模板实例的长、宽和旋转角度。其中参数SubPixel决定是否精确到亚像素级,设为’interpolation’,则会精确到,这个模式不会占用太多时间,若需要更精确,则可设为’least_square’,’lease_square_high’,但这样会增加额外的时间,因此,这需要在时间和精度上作个折中,需要和实际联系起来。比较重要的两个参数是MinSocre和Greediness,前一个用来分析模板的旋转对称和它们之间的相似度,值越大,则越相似,后一个是搜索贪婪度,这个值在很大程度上影响着搜索速度,若为0,则为启发式搜索,很耗时,若为1,则为不安全搜索,但最快。在大多数情况下,在能够匹配的情况下,尽可能的增大其值。 ⑸ 找到之后,还需要对其进行转化,使之能够显示,这两个函数 vector_angle_to_rigid()和affine_trans_contour_xld()在这里就起这个作用。前一个是从一个点和角度计算一个刚体仿射变换,这个函数从匹配函数的

串的模式匹配算法实验报告

竭诚为您提供优质文档/双击可除串的模式匹配算法实验报告 篇一:串的模式匹配算法 串的匹配算法——bruteForce(bF)算法 匹配模式的定义 设有主串s和子串T,子串T的定位就是要在主串s中找到一个与子串T相等的子串。通常把主串s称为目标串,把子串T称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串s中找到一个模式串T;不成功则指目标串s中不存在模式串T。bF算法 brute-Force算法简称为bF算法,其基本思路是:从目标串s的第一个字符开始和模式串T中的第一个字符比较,若相等,则继续逐个比较后续的字符;否则从目标串s的第二个字符开始重新与模式串T的第一个字符进行比较。以此类推,若从模式串T的第i个字符开始,每个字符依次和目标串s中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,算法返回0。 实现代码如下:

/*返回子串T在主串s中第pos个字符之后的位置。若不存在,则函数返回值为0./*T非空。 intindex(strings,stringT,intpos) { inti=pos;//用于主串s中当前位置下标,若pos不为1则从pos位置开始匹配intj=1;//j用于子串T中当前位置下标值while(i j=1; } if(j>T[0]) returni-T[0]; else return0; } } bF算法的时间复杂度 若n为主串长度,m为子串长度则 最好的情况是:一配就中,只比较了m次。 最坏的情况是:主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位比较了m次,最后m位也各比较了一次,还要加上m,所以总次数为:(n-m)*m+m=(n-m+1)*m从最好到最坏情况统计总的比较次数,然后取平均,得到一般情况是o(n+m).

字符串匹配算法总结

Brute Force(BF或蛮力搜索) 算法: 这是世界上最简单的算法了。 首先将匹配串和模式串左对齐,然后从左向右一个一个进行比较,如果不成功则模式串向右移动一个单位。 速度最慢。 那么,怎么改进呢? 我们注意到Brute Force 算法是每次移动一个单位,一个一个单位移动显然太慢,是不是可以找到一些办法,让每次能够让模式串多移动一些位置呢? 当然是可以的。 我们也注意到,Brute Force 是很不intelligent 的,每次匹配不成功的时候,前面匹配成功的信息都被当作废物丢弃了,当然,就如现在的变废为宝一样,我们也同样可以将前面匹配成功的信息利用起来,极大地减少计算机的处理时间,节省成本。^_^ 注意,蛮力搜索算法虽然速度慢,但其很通用,文章最后会有一些更多的关于蛮力搜索的信息。 KMP算法 首先介绍的就是KMP 算法。 这个算法实在是太有名了,大学上的算法课程除了最笨的Brute Force 算法,然后就介绍了KMP 算法。也难怪,呵呵。谁让Knuth D.E. 这么world famous 呢,不仅拿了图灵奖,而且还写出了计算机界的Bible (业内人士一般简称TAOCP). 稍稍提一下,有个叫H.A.Simon的家伙,不仅拿了Turing Award ,顺手拿了个Nobel Economics Award ,做了AI 的爸爸,还是Chicago Univ的Politics PhD ,可谓全才。 KMP 的思想是这样的: 利用不匹配字符的前面那一段字符的最长前后缀来尽可能地跳过最大的距离 比如 模式串ababac这个时候我们发现在c 处不匹配,然后我们看c 前面那串字符串的最大相等前后缀,然后再来移动 下面的两个都是模式串,没有写出来匹配串 原始位置ababa c 移动之后aba bac 因为后缀是已经匹配了的,而前缀和后缀是相等的,所以直接把前缀移动到原来后缀处,再从原来的c 处,也就是现在的第二个b 处进行比较。这就是KMP 。 Horspool算法。 当然,有市场就有竞争,字符串匹配这么大一个市场,不可能让BF 和KMP 全部占了,于是又出现了几个强劲的对手。

模板匹配

halcon模板匹配 * 在一个图片中获取ROI并在此图片中匹配 dev_close_window () dev_open_window (0, 0, 600, 600, 'black', WindowHandle) * 窗口语句 read_image(Image,'L:/Halcon test/mk2.jpg') *read_image(Image,'L:/Halcon test/mk3.jpg') *read_image(Image,'L:/Halcon test/mk4.jpg') * 这里有4张图片,每一张都说明一个小问题,附图分析。 gen_rectangle1 (ROI1, 57.8333, 49.5, 181.167, 342.833) * 画一个矩形选择ROI,矩形在左上角,覆盖一个完整的,无变形规定尺寸的商标,作为模板。 reduce_domain(Image,ROI1,ImageReduced1) * 大图和这个矩形的ROI相减就会得到一个左上角的商标的图案作为模板,命名ImageReduced。 create_shape_model(ImageReduced1,0,0,rad(360),0,'no_pregeneration','use_polarity',40,10,ModelID1) * 创建一个比例不变(1:1)的匹配的轮廓模型。具体参数下个帖子说明,也可见[Halcon算子学习交流区] Halcon模版匹配算子解析。 find_shape_model(Image,ModelID1,0,rad(360),0.7,13,0.5,'interpolation',0,0.9,Row,Column,Angle,Score) * 寻找与模板的大小尺寸必须是一比一匹配的,只是角度的不同而已,若大小发生变化,则不能匹配 get_shape_model_contours(ModelContours1,ModelID1,1) * 在大图中获取匹配。 for i := 0 to |Row|-1 by 1 vector_angle_to_rigid(0,0,0,Row【i】,Column【i】,Angle【i】,HomMat2D) affine_trans_contour_xld(ModelContours2,ContoursAffinTrans,HomMat2D) endfor * 获取匹配。 disp_message (WindowHandle, '总共匹配了' + |Row| + '个商标', 'window', 12, 12, 'red', 'true') * 输出数量统计。 clear_shape_model(ModelID1) stop()

实验三____串的模式匹配

实验三串的模式匹配 一、实验目的 1.利用顺序结构存储串,并实现串的匹配算法。 2.掌握简单模式匹配思想,熟悉KMP算法。 二、实验要求 1.认真理解简单模式匹配思想,高效实现简单模式匹配; 2.结合参考程序调试KMP算法,努力算法思想; 3.保存程序的运行结果,并结合程序进行分析。 三、实验内容 1、通过键盘初始化目标串和模式串,通过简单模式匹配算法实现串的模式匹配,匹配成功后要求输出模式串在目标串中的位置; 2、参考程序给出了两种不同形式的next数组的计算方法,请完善程序从键盘初始化一目标串并设计匹配算法完整调试KMP算法,并与简单模式匹配算法进行比较。 参考程序: #include "stdio.h" void GetNext1(char *t,int next[])/*求模式t的next值并寸入next数组中*/ { int i=1,j=0; next[1]=0; while(i<=9)//t[0] { if(j==0||t[i]==t[j]) {++i; ++j; next[i]=j; } else j=next[j]; } } void GetNext2(char *t , int next[])/* 求模式t 的next值并放入数组next中 */ { int i=1, j = 0; next[1]= 0; /* 初始化 */ while (i<=9) /* 计算next[i+1] t[0]*/ { while (j>=1 && t[i] != t[j] ) j = next[j]; i++; j++;

if(t[i]==t[j]) next[i] = next[j]; else next[i] = j; } } void main() { char *p="abcaababc"; int i,str[10]; GetNext1(p,str); printf("\n"); for(i=1;i<10;i++) printf("%d",str[i]); GetNext2(p,str); printf("\n"); for(i=1;i<10;i++) printf("%d",str[i]); printf("\n\n"); }

MySQL中的字符串模式匹配.

MySQL中的字符串模式匹配 本文关键字:MySQL 字符串模式匹配 MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi、grep 和sed的扩展正则表达式模式匹配的格式。 标准的SQL模式匹配 SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。下面显示一些例子。注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。 例如,在表pet中,为了找出以“b”开头的名字: +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+ 为了找出以“fy”结尾的名字:

+--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+ 为了找出包含一个“w”的名字: +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+

模板匹配详解

模板匹配? 目标? 在这节教程中您将学到: ?使用OpenCV函数matchTemplate在模 板块和输入图像之间寻找匹配,获得匹配结 果图像 ?使用OpenCV函数minMaxLoc在给定的 矩阵中寻找最大和最小值(包括它们的位 置). 原理? 什么是模板匹配?? 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术. ?我们需要2幅图像: 1. 原图像(I):在这幅图像里,我们希望 找到一块和模板匹配的区域 2. 模板(T):将和原图像比照的图像 块 我们的目标是检测最匹配的区域:

?为了确定匹配区域, 我们不得不滑动模板图像和原图像进行比较: ?通过滑动, 我们的意思是图像块一次移动一个像素(从左往右,从上往下). 在每一个位置, 都进行一次度量计算来表明它是“好” 或“坏” 地与那个位置匹配(或者说块图像和原图像的特定区域有多么相似). ?对于T覆盖在I上的每个位置,你把度量值保存到结果图像矩阵(R)中. 在R 中的每个位置都包含匹配度量值:

上图就是TM_CCORR_NORMED方法 处理后的结果图像R . 最白的位置代表最 高的匹配. 正如您所见, 红色椭圆框住的位 置很可能是结果图像矩阵中的最大数值, 所以这个区域(以这个点为顶点,长宽和模 板图像一样大小的矩阵) 被认为是匹配的. 实际上, 我们使用函数minMaxLoc来定 位在矩阵R中的最大值点(或者最小值, 根据函数输入的匹配参数) . 问得好. OpenCV通过函数matchTemplate实现了模板匹配算法. 可用的方法有6个: 1. 平方差匹配method=CV_TM_SQDIFF 这类方法利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大. b. 标准平方差匹配 method=CV_TM_SQDIFF_NORMED

KMP字符串模式匹配算法解释

个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详细”,耐心地把它看完肯定会有所收获的~~,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1,不过还是next[j]这种表示法好理解啊: KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: int Index_BF ( char S [ ], char T [ ], int pos ) { /* 若串S 中从第pos(S 的下标0≤pos

串的朴素模式匹配算法(BF算法)

//算法功能:串的朴素模式匹配是最简单的一种模式匹配算法,又称为 Brute Force 算法,简称为BF算法 #include #include #define MAXL 255 #define FALSE 0 #define TRUE 1 typedef int Status; typedef unsigned char SString[MAXL+1]; //生成一个其值等于串常量strs的串T void StrAssign(SString &T, char *strs) { int i; T[0] = 0; //0号单元存储字串长度 for(i = 0; strs[i]; i++) //用数组strs给串T赋值 T[i+1] = strs[i]; T[0] = i; } //返回子串T在主串S中第pos个字符开始匹配的位置,若不存在,则返回0 int Index(SString S, SString T, int pos) { int i = pos, j = 1; while(i <= S[0] && j <= T[0]) { if(S[i] == T[j]) //继续比较后面的字符 { i++; j++; } else//指针回退,重新开始匹配 { i = i -j + 2; j = 1; } } if(j > T[0]) return i - T[0]; else return 0;

int main() { SString S, T; int m; char strs1[MAXL]; //建立主串S char strs2[MAXL]; //建立模式串T printf("请输入主串和子串:\n"); printf("主串S: "); scanf("%s", strs1); printf("子串T: "); scanf("%s", strs2); StrAssign(S, strs1); StrAssign(T, strs2); m = Index(S, T, 1); if(m) printf("主串 S = {%s}\n子串 T = {%s}\n在第 %d 个位置开始匹配!\n", strs1, strs2, m); else printf("主串 S = {%s}\n子串 T = {%s}\n匹配不成功!\n", strs1, strs2); return 0; }

基于图像灰度的模板匹配方法

基于图像灰度的模板匹配方法 图像匹配技术是数字图像信息处理和计算机视觉领域中 的—个基本问题,并在卫星遥感、空间飞行器的自动导航、武器 投射系统的末制导和寻的、光学和雷达的图像目标跟踪、地球 资源分析与检测、气象预报、医疗诊断、文字读取以及景物分析 中的变化检测等许多领域中得到广泛应用㈣。 一般来说,由于图像在不同时间、不同传感器、不同视角获得的成像条件不同,因此即使是对同一物体,在图像中所表现出来的几何特性、光学特性、空间位置都会有很大的不同,如果考虑到噪声、干扰等影响会使图像发生很大差异, 图像匹配就是通过这些不同之处找到它们的相同点。 图像匹配算法主要分为两类口:一类是基于灰度匹配的方 法;另一类是基于特征匹配的方法。前者主要用空间的一维或 二维滑动模板进行图像匹配,不同算法的区别主要在模板及相 关准则的选择方面,这类方法一般匹配率高,但计算量大,速度 较慢;后者则通过在原始图像中提取点、线、区域等显著特征作 为匹配基元,进而用于特征匹配,一般匹配速度较陕,但匹配精 度不一定高。 1.概念解释: ①数字图像:数字图像是由被称做像素的小块区域组成的二维像素矩阵。一般把图像分成3种形式:单色图像,灰度图像和彩色图像。 ②像素:表示图像颜色的最小单位 ③灰度图像:灰度图是指只含亮度信息,不含色彩信息的图像,就像平时看到的黑白照片:亮度由暗到明,变化是连续的。灰度图的每个像素的亮度用一个数值来表示,通常数值范围在0—255之间,即可用一个字节来表示,0表示黑,255表示白,而其他表示灰度。 ④点阵图:显示器的屏幕由可以发光的像素点组成. 并且从几何位置看, 所用这 些像素点构成一个矩形的阵列.利用计算机控制各像素点按我们指定的要求发光,

模式匹配KMP算法实验步骤

一、问题描述 模式匹配两个串。 二、设计思想 这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KM P算法。 注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法: int Index(String S,String T,int pos)//参考《数据结构》中的程序 { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length && j<=T.Length) { if(S[i]==T[j]){++i;++j;} else{i=i-j+2;j=1;}//**************(1) } if(j>T.Length) return i-T.Length;//匹配成功 else return 0; } 匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?为什么要回溯,看下面的例子: S:aaaaabababcaaa T:ababc aaaaabababcaaa ababc.(.表示前一个已经失配) 回溯的结果就是 aaaaabababcaaa a.(babc) 如果不回溯就是 aaaaabababcaaa aba.bc 这样就漏了一个可能匹配成功的情况 aaaaabababcaaa ababc 这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。如果T为a bcdef这样的,大没有回溯的必要。

改进的地方也就是这里,我们从T串本身出发,事先就找准了T自身前后部分匹配的位置,那就可以改进算法。 如果不用回溯,那T串下一个位置从哪里开始呢? 还是上面那个例子,T为ababc,如果c失配,那就可以往前移到aba最后一个a的位置,像这样: ...ababd... ababc ->ababc 这样i不用回溯,j跳到前2个位置,继续匹配的过程,这就是KMP算法所在。这个当T[j]失配后,j应该往前跳的值就是j的next值,它是由T串本身固有决定的,与S串无关。 《数据结构》上给了next值的定义: 0 如果j=1 next[j]={Max{k|1aaab ->aaab ->aaab 像这样的T,前面自身部分匹配的部分不止两个,那应该往前跳到第几个呢?最近的一个,也就是说尽可能的向右滑移最短的长度。 到这里,就实现了KMP的大部分内容,然后关键的问题是如何求next值?先看如何用它来进行匹配操作。 将最前面的程序改写成: int Index_KMP(String S,String T,int pos) { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length && j<=T.Length) {

C语言字符串模式匹配

数据结构面试之十四——字符串的模式匹配 题注:《面试宝典》有相关习题,但思路相对不清晰,排版有错误,作者对此参考相关书籍和自己观点进行了重写,供大家参考。 十四、字符串的模式匹配 1. 模式匹配定义——子串的定位操作称为串的模式匹配。 2. 普通字符串匹配BF算法(Brute Force 算法,即蛮力算法) 【算法思想】: 第(1)步;从主串S的第pos个字符和模式的第一个字符进行比较之,若相等,则继续逐个比较后续字符;否则从主串的下一个字符起再重新和模式串的字符比较之。 第(2)步骤;依次类推,直至模式T中的每一个字符依次和主串S中的一个连续的字符序列相等,则称匹配成功;函数值为和模式T中第一个字符相等的字符在主串S中的序号,否则称为匹配不成功,函数值为0。 比如对于主串S=”abacababc”; 模式串T=”abab”; 匹配成功,返回4。 对于主串S=”abcabcabaac”; 模式串T=”abab”; 匹配不成功,返回0。 【算法实现】: //普通字符串匹配算法的实现 int Index(char* strS, char* strT, int pos) { //返回strT在strS中第pos个字符后出现的位置。 int i = pos; int j = 0; int k = 0; int lens = strlen(strS);

int lent = strlen(strT); while(i < lens && j < lent) { if(strS[i+k] == strT[j]) { ++j; //模式串跳步 ++k; //主串(内)跳步 } else { i = i+1; j=0; //指针回溯,下一个首位字符 k=0; } }//end i if(j >= lent) { return i; } else { return 0; } }//end [算法时间复杂度]:设主串长度为m,模式串的长度为n。一般情况下n

几种图像的检测和模板匹配方法

几种图像的检测和模板匹配方法 图象的分割与检测(识别)实际上是一项非常困难的工作。很难说清楚为什么图象应该分割成这样而不是那样。人类的视觉系统是非常优越的,它不仅包含了双眼,还包括了大脑,可以从很复杂的景物中分开并识别每个物体,甚至可以毫不费力的跟上每秒好几十帧变化的图象。举两个例子来说明一下人类视觉系统的优越性: 图1是单词THE,这一点很容易看出来,但仔细观察一下,就会发现,图中少了很多线条。在我们人类看来很简单的一件事,让计算机来做就很困难了。 图2中尽管没有任何线条,但我们还是可以很容易的看出中间存在着一个白色三角形。计算机却很难发现。 由于人类在观察图象中应用了大量的知识,所以没有任何一台计算机在分割和检测真实图象时,能达到人类视觉系统的水平。正因为如此,对于大部分图象应用来说,自动分割与检测还是一个将来时,目前只有少数的几个领域(如印刷体识别OCR)自动识别达到了实用的水平。假想在一场足球比赛的录象中,我们希望可以输入命令,由计算机自动搜索出所有射门的镜头并显示在屏幕上,但目前,我们能从一幅图象中获得的信息只是每个像素的颜色或灰度值,除此以外别无其它,完成上述功能实在是太困难了。所以说解决图象分割和检测最根本的方法是在编码(成像)时就给予考虑。这也正是MPEG4及未来的视频压缩编码标准的主要工作。 针对上述困难,现在提出了三种算法:投影法,差影法和模板匹配。 1、投影法 怎样从华盛顿纪念碑图中自动检测到水平方向上纪念碑的位置。 仔细观察,不难发现,纪念碑上像素的灰度都差不多而且与众不同,如果我们选取合适的阈值,做削波处理(这里选175到220),将该图二值化,如下图所示: 图1. 削波处理,将图二值化图2. 图4做竖直方向投影

串的模式匹配算法

串的匹配算法——Brute Force (BF)算法 匹配模式的定义 设有主串S和子串T,子串T的定位就是要在主串S中找到一个与子串T相等的子串。通常把主串S称为目标串,把子串T称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串S中找到一个模式串T;不成功则指目标串S中不存在模式串T。 BF算法 Brute-Force算法简称为BF算法,其基本思路是:从目标串S的第一个字符开始和模式串T中的第一个字符比较,若相等,则继续逐个比较后续的字符;否则从目标串S的第二个字符开始重新与模式串T的第一个字符进行比较。以此类推,若从模式串T的第i个字符开始,每个字符依次和目标串S中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,算法返回0。 实现代码如下: /*返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0. /*T非空。 int index(String S, String T ,int pos) { int i=pos; //用于主串S中当前位置下标,若pos不为1则从pos位置开始匹配int j =1; //j用于子串T中当前位置下标值 while(i<=S[0]&&j<=T[0]) //若i小于S长度且j小于T的长度时循环 { if(S[i]==T[j]) //两个字母相等则继续 { ++i; ++j; } else //指针后退重新开始匹配 { i=i-j+2; //i退回到上次匹配首位的下一位 j=1; } if(j>T[0]) return i-T[0]; else return 0; } }

BF算法的时间复杂度 若n为主串长度,m为子串长度则 最好的情况是:一配就中,只比较了m次。 最坏的情况是:主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位比较了m 次,最后m位也各比较了一次,还要加上m,所以总次数为:(n-m)*m+m=(n-m+1)*m 从最好到最坏情况统计总的比较次数,然后取平均,得到一般情况是O(n+m).

字符串模式匹配

实验7、字符串查找 目的 掌握字符串模式匹配的经典算法。 问题描述 分别用简单方法和KMP方法实现index在文本串中查找指定字符串的功能。 步骤 1.定义字符串类型 2.实现简单的index操作,从文本串中查找指定字符串。 3.实现KMP方法的index操作,从文本串中查找指定字符串。 4.[选]建立一个文本文件,读入每一行来测试自己完成的练习,观察并理解程序的各 个处理。 设备和环境 PC计算机、Windows操作系统、C/C++开发环境 结论 能够理解和掌握字符串模式匹配的典型算法。 思考题 1.对KMP算法分别用手工和程序对某个模式串输出next和nextval。 朴素算法: #include #include #define NOTFOUND -1

#define ERROR -2 #define MAXLEN 100//字符串的最大长度 char S[MAXLEN+10],T[MAXLEN+10],st[MAXLEN+10];//串S和串T int S0,T0; //S0:串S的长度 T0:串T的长度 int pos; //pos的起始位置 void Init(char *S,int &S0)//读入字符串 { int len,i; New_Input: scanf("%s",st);//读入字符串 len=strlen(st); if (len>MAXLEN)//如果字符串的长度大于规定的字符串最大长度 { printf("This String is too long,Please Input a new one.nn"); goto New_Input;//重新读入字符串

串匹配问题:BF算法、KMP算法、BM算法

一、实验内容和目的 1、深刻理解并掌握蛮力算法的设计思想; 2、提高应用蛮力算法设计算法的技能; 3、理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努 力后,都可以对算法的第一个版本进行一定程度的改良,改进其时 间性能。 二、实验原理及基本技术路线图(方框原理图) 串匹配问题——给定两个串S=“s1s2…s n” 和T=“t1t2…t m”,在主 串S中查找子串T的过程称为串匹配,也称模式匹配。 串匹配问题属于易解问题。 串匹配问题的特征: (1)算法的一次执行时间不容忽视:问题规模n 很大,常常需要在 大量信息中进行匹配; (2)算法改进所取得的积累效益不容忽视:串匹配操作经常被调用,执行频率高。 BF算法: 基本思想:从主串S的第一个字符开始和模式T的第一个字符进行比 较,若相等,则继续比较两者的后续字符;若不相等,则从主串S 的第二个字符开始和模式T的第一个字符进行比较,重复上述过程,若T中的字符全部比较完毕,则说明本趟匹配成功;若最后一轮匹配 的起始位置是n-m,则主串S中剩下的字符不足够匹配整个模式T, 匹配失败。这个算法称为朴素的模式匹配算法,简称BF算法。 KMP算法: 1. 在串S和串T中分别设比较的起始下标i和j; 2. 循环直到S中所剩字符长度小于T的长度或T中所有字符均比较 完毕 2.1 如果S[i]=T[j],则继续比较S和T的下一个字符;否则 2.2 将j向右滑动到next[j]位置,即j=next[j];

2.3 如果j=0,则将i和j分别加1,准备下一趟比较; 2.4 如果T中所有字符均比较完毕,则返回匹配的起始下标;否则返回0; BM算法: BM算法与KMP算法的主要区别是匹配操作的方向不同。虽然BM算法仅把匹配操作的字符比突顺序改为从右向左,但匹配发生失败时,模式T右移的计算方法却发生了较大的变化。 设计思想:设文本串T,模式串为P。首先将T与P进行左对齐,然后进行从右向左比较,若是某趟比较不匹配时,BM算法就采用两条启发式规则,即坏字符规则和好后缀规则,来计算模式串向右移动的距离,直到整个匹配过程的结束。

字符串匹配算法的研究_本科论文

字符串匹配算法的研究及其程序实现 计算机学院计算机科学与技术专业2007级指导教师:滕云 摘要:在字符串匹配算法之中,最古老和最著名的是由D. E. Knuth, J. h. Morris, V. R. Pratt 在1997年共同提出的KMP算法。直至今日,人们对字符串匹配问题还在进行着大量的研究,以寻求更简单,或者平均时间复杂度更优的算法;学者们在不同的研究方向上,设计出了很多有效的匹配算法。在现实生活中,串匹配技术的应用十分广泛,其主要领域包括:入侵检测,病毒检测,信息检索,信息过滤,计算生物学,金融检测等等。在许多应用系统中,串匹配所占的时间比重相当大,因此,串匹配算法的速度很大程度上影响着整个系统的性能。该论文重点分析了KMP算法的实现原理和C语言实现,并在此基础上提出了改进的KMP算法,使得该算法更方便实用。 关键词:KMP算法;时间复杂度;串匹配;改进;方便使用; String matching algorithm and Implementation of the Program College of Computer Sciences, Computer Science and Technology Professional grade 2007, Instructor YunTeng Abstractor:Among the string matching algorithm,the oldest and most famous is KMP algorithm co-sponsored by D.E Knuth, J. h. Morris, VR Pratt in 1997. As of today, a lot of research to String matching are still in progress, to seek a more simply or better average time complexity of the algorithm. In different research direction, scholars have designed a lot of valid matching.In real life, the string matching technique is widely used,The main areas include: intrusion detection, virus detection, information retrieval, information filtering, computational biology, financial inspection and so on.In many applications,a large percentage of the time was placed by the string matching, so the string matching algorithms significantly affect the speed performance of the whole system.The paper analyzes the implementation of the KMP algorithm theory and through the C language to achieve it.And we puts forward a modified KMP algorithm in order to makes the algorithm more convenient and practical. Key words:KMP algorithm; Time complexity; String matching; Improved; Easy to use;

相关主题