大话数据结构——串

串(String):由零个或多个字符组成的有限序列。

串的抽象数据类型:

ADT 串(string)
Data   串中元素仅有一个字符组成,相邻元素具有前驱和后继关系。
Operation
	  StrAssign(T,*chars):生成一个其值等于字符串常量chars的串T。
	  StrCopy(T,S):串S存在,由串S复制得串T。
	  ClearString(S):串S存在,将串复制得串T。
	  StringEmpty(S):若串S为空,返回true,否则返回false。
	  StrLength(S):返回串S的元素个数,即串的长度。
	  StrCompare(S,T):若S>T,返回值>0,若S=T,返回0,若S

串的存储结构:

串的顺序存储结构:

用一组地址连续的存储单元来存储串中的字符序列,按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区,一般使用定长数组来定义。一般数组的第一个元素存储串的长度值。

存在的问题:两串的联接Conact,新串的插入StrInsert以及字符串的替换Replace都有可能使得串序列的长度超过数组的长度MAXSIZE,出现上溢。因此串值的存储空间可在程序执行过程中动态分配。如:利用计算机的自由存储区堆,堆可以利用分配函数malloc()和free()来管理。

串的链式存储结构:

一个结点可以存放一个字符,也可以存放多个字符,最后一个结点若是未被占满时,可以用#或其他非串值字符补全。一个结点存放了多少个字符,会直接影响着串处理的效率。

串的链式存储结构的优势:连接串和串时比较方便,缺点:不如顺序存储灵活,性能不如顺序存储结构好。

字符串匹配:

一般匹配字符串时,我们从目标字符串str(假设长度为n)的第一个下标选取和ptr长度(长度为m)一样的子字符串进行比较,如果一样,就返回开始处的下标值,不一样,选取str下一个下标,同样选取长度为n的字符串进行比较,直到str的末尾(实际比较时,下标移动到n-m)。这样的时间复杂度是O(n*m)

KMP算法:可以实现复杂度为O(m+n)

为何简化了时间复杂度:
充分利用了目标字符串ptr的性质(比如里面部分字符串的重复性,即使不存在重复字段,在比较时,实现最大的移动量)。

你可能感兴趣的:(数据结构与算法)