第四章 串g.ppt

第四章 串 基本概念 ClearString (S) 初始条件:串S存在。 操作结果:将S清为空串。 StrEmpty (S) 初始条件:串S存在。 操作结果:若S为空串,则返回TRUE,否则返回FALSE。 StrCompare (S, T) //串比较 初始条件:串S和T存在。 操作结果:若ST,则返回值0; 若S=T,则返回值=0; 若ST,则返回值0。 Concat (T, S1, S2) //串联接 初始条件:串S1和S2存在。 操作结果:用T返回由S1和S2联接而成的新串。 SubString (Sub, S, pos, len) //求子串 初始条件:串S存在,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1。 操作结果:用Sub返回串S的第pos个字符起长度为len的子串。 StrInsert (S, pos, T) 初始条件:串S和T存在, 1≤pos≤StrLength(S)+1。 操作结果:在串S的第pos个字符之前插 入串T。 StrDelete (S, pos, len) 初始条件:串S存在, 1≤pos≤StrLength(S)-len+1。 操作结果:从串S中删除第pos个字符起 长度为len的子串。 2.求子串SubString(Sub, S, pos, len) 4.2.2 堆分配存储表示 4.2.3 块链存储表示 4.3串的模式匹配算法 4.3.1 求子串位置的定位函数 index(S,T,pos) 4.3.2 模式匹配的一种改进算法 (KMP算法) 4.3.1 求子串位置的定位函数 index(S,T,pos) 概念 子串定位操作又称模式匹配,其中S为主串,T为模式串.算法思想如4.1中所描述. 若采用定长顺序存储结构,可写出不依赖于其它串操作的匹配算法. 设计数指针 i 和 j 分别指示主串S和模式串T中当前待比较的字符位置. S[0]和T[0]分别为T和S的长度 可实现以下模式匹配一般算法: int Index (SString S, SString T, int pos){ // 返回子串T在主串S中第pos个字符后的位置, // 若不存在,则返回0.其中,T非空,1≤pos ≤Stringlength(S) 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; } 算法思想和匹配过程: 算法的时间复杂度分析 一般情况下例如: 模式串’STING’ ‘A STRING SERCHING EXAMPL CONSISTING OF’ 单个字符比较次数(WHILE循环次数)= INDEX+T[0]-1+4=41, index约为n,T[0]为m,O(m+n) 特殊情况下例如: 模式串 ‘000000000000…00001’ 每趟比较模式串总是在最后一个失配(比较8次),i指针 回溯到i-6位置,回溯45次,则WHILE循环次数为: 46*8=index*m 约为 n*m , 因此 O(n*m) 4.3.2 模式匹配的一种改进算法 (KMP算法) 改进: 当一趟匹配出现比较不等时,i 指针不回溯,利用已得到的”部分匹配”的结果,将模式串向右滑动尽可能远,继续匹配. 例如: 一般情况: 设主串’S1 S2… Sn’和模式串’P1 P2… Pm’ (m≤n) 当主串中第 i 个字符与模式串中第 j 个失配时,下 一趟匹配时,主串中第 i 个字符应与模式串中”哪个” (i 不回溯)字符对齐

文档评论(0)

1亿VIP精品文档

相关文档