知识大全 串运算的实现
Posted 位移
篇首语:五陵年少金市东,银鞍白马渡春风。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 串运算的实现相关的知识,希望对你有一定的参考价值。
子串定位运算
串是特殊的线性表 故顺序串和链串上实现的运算分别与顺序表和单链表上进行的操作类似 C语言的串库<string h>里提供了丰富的串函数来实现各种基本运算 因此我们对各种串运算的实现不作讨论 利用串函数实现串的基本运算部分内容【参见练习】 下面讨论在顺序串和链串上实现的子串定位运算
子串定位运算 子串定位运算类似于串的基本运算中的字符定位运算 只不过是找子串而不是找字符在主串中首次出现的位置 此运算的应用非常广泛 【例】在文本编辑中 我们经常要查找某一特定单词在文本中出现的位置 解此问题的有效算法能极大地提高文本编辑程序的响应性能 子串定位运算又称串的模式匹配或串匹配
目标(串)和模式(串) 在串匹配中 一般将主串称为目标(串) 子串称为模式(串) 假设T 为目标串 P为模式串 且不妨设 T= t t t …tn P= p p p …pm ( <m≤n)
串匹配 串匹配就是对于合法的位置(又称合法的位移) ≤i≤n m 依次将目标串中的子串 titi+ …ti+m 和模式串 p p p …pm 进行比较 ①若 titi+ …ti+m = p p p …pm 则称从位置i开始的匹配成功 或称i为有效位移 ②若 titi+ …ti+m ≠ p p p …pm 则称从位置i开始的匹配失败 或称i为无效位移 因此 串匹配问题可简化为找出某给定模式串P在给定目标串T中首次出现的有效位移 注意 有些应用中要求求出P在T中所有出现的有效位移
顺序串上的子串定位运算( )朴素的串匹配算法的基本思想 即用一个循环来依次检查n m+ 个合法的位移i( ≤i≤n m)是否为有效位移 具体过程【参见动画演示】
( )顺序串上的串匹配算法 以下以第二种定长的顺序串类型作为存储结构 给出串匹配的算法 #define MaxStrSize //该值依赖于应用 由用户定义 typedef struct char ch[MaxStrSize]; //可容纳 个字符 并依次存储在ch[ n]中 int length; SeqString; int Naive StrMatch(SeqString T SeqString P) //找模式P在目标T中首次出现的位置 成功返回第 个有效位移 否则返回 int i j k; int m=P length; //模式串长度 int n=T length; //目标串长度 for(i= ;i<=n m;i++) // <=i<=n m是合法的位移 j= ;k=i; //下面用while循环判定i是否为有效位移 while(j<m&&T ch[k]==P ch[j] k++;j++; if(j==m) //既T[i i+m ]=P[ m ] return i; //i为有效位移 否则查找下一个位移 //endfor return ; //找不到有效位移 匹配失败 //NaiveStrMatch
( )算法分析①最坏时间复杂度 该算法最坏情况下的时间复杂度为O((n m+ )m) 分析 当目标串和模式串分别是 an b 和 am b 时 对所有n m+ 个合法的位移 均要比较m个字符才能确定该位移是否为有效位移 因此所需比较字符的总次数为(n m+ )m
②模式匹配算法的改进 朴素的串匹配算法虽然简单 但效率低 其原因是在检查位移i是否为有效位移时 没有利用检查位移i i … 时的部分匹配结果 若利用部分匹配结果 模式串右滑动的距离就不会是每次一位 而是每次使其向右滑动得尽可能远 这样可使串匹配算法的最坏时间控制在O(m+n)数量级上 具体可【参阅有关文献】
cha138/Article/program/sjjg/201311/22622相关参考