数据结构----串

今天一天看了茫茫多的数据结构,感觉有些东西写出来会更加的利于理解

先从比较简单的串开始。

串的定义串是由零个或多个字符构成的有限序列

串的抽象数据类型:

ADT String{

  数据对象:D={ai|ai(-CharacterSet,i=1,2,...,n,n>=0}

  数据关系:R1={<ai-1,ai>|ai-1,ai(-D,i=2,...,n}

  基本操作:

  StrAssign(&T,chars)

  chars是字符常量。生成一个其值等于chars的串T。

  StrCopy(&T,S)

  串S存在则由串S复制得串T

  StrEmpty(S)

  串S存在则若S为空串,返回真否则返回假

  StrCompare(S,T)

  串S和T存在,若S>T,则返回值大于0,若S=T,则返回值=0,若S<T,则返回值<0

  StrLength(S)

  串S存在返回S的元素个数称为串的长度.

  ClearString(&S)

  串S存在将S清为空串

  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

  Index(S,T,pos)

  串S和T存在,T是非空,1<=pos<=StrLength(S),若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置,否则函数值为0

  Replace(&S,T,V)

  串S,T和V存在,T是非空串,用V替换主串S中出现的所有与T相等的不重叠的子串

  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从串中删除第pos个字符起长度为len的子串

  DestroyString(&S)

  串S存在,则串S被销毁

  }ADT String

个人感觉对于串这个数据结构,没有什么特别需要理解的地方。主要把一些常用的关于的串的方法掌握了即可


KMP串匹配:这个算法降低的匹配的时间复杂度,降低的原因就是将一些重复的步骤跳过了,下面我们来看实现。

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息

在暴力字符串匹配过程中,我们会从T[0] 跟 W[0] 匹配,如果相等则匹配下一个字符,直到出现不相等的情况,此时我们会简单的丢弃前面的匹配信息,然后从T[1] 跟 W[0]匹配,循环进行,直到主串结束,或者出现匹配的情况。这种简单的丢弃前面的匹配信息,造成了极大的浪费和低下的匹配效率然而,在KMP算法中,对于每一个模式串我们会事先计算出模式串的内部匹配信息,在匹配失败时最大的移动模式串,以减少匹配次数。比如,在简单的一次匹配失败后,我们会想将模式串尽量的右移和主串进行匹配。右移的距离在KMP算法中是如此计算的:在已经匹配的模式串子串中,找出最长的相同的前缀后缀,然后移动使它们重叠。


这篇博文有图解KMP,感觉还不错。有了一定的定义的了解,现在去看图解的话,应该会很轻松

http://blog.csdn.net/joylnwang/article/details/6778316

posted @ 2016-03-13 16:03  JeffC80  阅读(267)  评论(0编辑  收藏  举报