KMP算法以及串给自己的一点回忆

单曲循环时间都去哪儿、、、

串这章相对栈感觉上要简单点儿,栈等到晚上再来写,先说说串和KMP算法。

串,字符串,计算机中除了数值数据还有串数据,当然串数据最后要反应到数值中,比如ASCLL表。

串,在ADT中一共定义了13种操作,构造,复制,比较(比较大小的,应该是按数值或者ASCLL表的顺序来的吧。),求串长度,清空串,连接串,求子串,求子串位置(第一个位置),替换子串(这个有点难和KMP相关),

插入串T,删除子串,销毁串。在数组中存储有点麻烦,在存储结构上。

存储,一种定长,搞不定了就直接截断。还有一种是用堆分配的,malloc,realloc等等,判定够不够,不够就分。

再就是线性结构的链表存储,结点的方式来表示,块链即一个结点存储多个数据。少了,内外存交换麻烦,多了操作麻烦。

模式匹配,把模式和主串匹配。

第一种是叫BF的野蛮方法,borst force。

就是一个一个比对,不对了再把主串第一个比较的字符往前走一个,字串也从头开始比较。

暴力,野蛮,总会找到了。

第二种就是所说的KMP算法。

比较失配了,主串里面正在比较的字符不用回溯,直接在模式中找一个K,这就方便多了,这个K比较特别。K前面的字符和主串中失配字符前面的K个字符相等。p1…p(k-1)=s(i-k+1)…s(i-1)

怎么找这个K呢?所谓求next(j).

j是当前和主串比较失配的字符,所以下一个就是next(J)=k

考虑j+1 失配,

如果p(j)=p(k),    那么  p1…pk=p(j-k+1)…p(j)   定义如此 本来就假设next[j]=k 再来求next[j+1],则next(j+1)=k+1,  next(j+1)=next(j)+1

如果p(J)!=p(k), 那么不能得出正上面的 ,那怎么办?继续匹配,应该将模式向右滑动到以模式中的第next(k)个字符和主串中的第j个字符相比较。(比较拗口?)主串怎么会出来J呢?这时候就是递推的角度了。模式中求模式。第K个不行,那就继续求回溯,看哪个匹配。(好像还是没讲清楚) 继续求next(k)。   不断去比较,直到p(j)和前面的某个字符相同,继续讲清楚、、刚

posted @ 2014-04-05 20:53  天景色  阅读(233)  评论(0编辑  收藏  举报