数据结构 第四章学习小结
- 4.1-4.3
- 4.1 串的定义
- 串或字符串是由零个或多个字符组成的有限序列(内容受限的线性表)
- 字符可以是字母、 数字或其他字符,串中字符的数目n称为串的长度。零个字符的串称为空串 , 其长度为零
- 子串在主串中的位置则以子串的第一个字符在主串中的位置(字符在序列中的序号)来表示
- 一个或多个空格组成的串" "称为空格串 , 其长度为串中空格字符的个数
- 串或字符串是由零个或多个字符组成的有限序列(内容受限的线性表)
- 4.2 案例引入
- 病毒感染检测
- 4.3 串的类型定义、 存储结构及其运算
- 串的抽象类型定义
-
-
ADT String{ 数据对象: D= { ai| ai E Char acterSet, i=l, 2, …, n, n;;;.QJ 数据关系: Rl= {< ai-1, ai> {ai-1, ai E D,i=2, …,n} 基本操作: StrAssign(&T, chars) 初始条件:chars是字符串常址。 操作结果:生成 一个其值等于chars的串T。 StrCopy(&T,S) 初始条件:串s存在。 操作结果:由串s复制得串T。 StrEmpty(S) 初始条件:串s存在。 操作结果:若s为空串,则返回 tr ue, 否则返回false。 StrCompar e(S,T) 初始条件:串 s和T存在。 操作结果:若S>T, 则返回值 >0; 若S=T, 则返回值= O; 若S<T, 则返回值 <0。 StrLength(S) 初始条件:串 s存在。 操作结果:返回s的元素个数,称为串的长度 。 ClearString(&S) 初始条件:串 s存在。 操作结果:将s清为空串。 Concat(&T,Sl,S2) 初始条件:串Sl和S2存在。 操作结果:用T 返回由Sl和S2联接而成的新串。 SubString(&Sub,S,pos,len) 初始条件:串s存在,1≤pos≤StrLength(S)且o≤1en≤StrLength(S) -pos+1。 操作结果:用Sub 返回串s的第pos个字符起长度为 len的子串。 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相等的不重叠的子串。 Strlnsert(&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 的子串。 DestroyString (&S) 初始条件:串s存在。 操作结果:串s被销毁。 }ADT String
-
-
- 串的存储结构
- 顺序存储 (多采用)
- 串的定长顺序存储结构:按照预定义的大小, 为每个定义的串变量分配一个固定长度的存储区(实例是书本4.3.3串的模式匹配算法 )
//----- 串的定长顺序存储结构- - --- #define MAXLEN 255 //串的最大长度 typedef struct { char ch[MAXLEN+l);//存储串的一维数组 int length; //串的当前长度 ) SString;
- 串的堆式顺序存储结构:在C语言中,"堆" (Heap)的自由存储区可以为每个新产生的串动态分配一块实际串长所需的存储空间, 若分配成功, 则返回一个指向起始地址的指针, 作为串的基址, 同时为了以后处理方便, 约定串长也作为存储结构的一部分
//----- 串的堆式顺序存储结构---- - typedef struct{ char *ch; //若是非空串, 则按串长分配存储区, 否则 ch 为 NULL int length; //串的当前长度 }HString;
- 两者的区别在于结构体定义是char ch[]数组还是char *ch
- 串的定长顺序存储结构:按照预定义的大小, 为每个定义的串变量分配一个固定长度的存储区(实例是书本4.3.3串的模式匹配算法 )
- 链式存储
- 块链结构:头指外, 尾指针,当前串的长度
- 串操作的实现和线性表在链表存储结构中的操作类似,参考线性表的链式存储结构
- 顺序存储 (多采用)
- 串的模式匹配算法
- BF算法
- 实现简单 ,但存在回溯,效率低,时间复杂度为O(m x n)
- KMP算法
- 对BF算法进行改进,消除回溯,提高了效率,时间复杂度为O(m + n)
- BF算法
- 串的抽象类型定义
- 4.1 串的定义
- 4.4-4.7
- 4.4 数组(随机存储结构)
- 数组的类型定义
- 数组的顺序存储
- 广义表的定义特殊矩阵的压缩存储
- 对称矩阵
- 三角矩阵
- 对角矩阵
- 4.5 广义表
- 广义表的定义
- 广义表的3个重要结论
- (1) 广义表的元素可以是子表,而子表的元素还可以是子表
- (2) 广义表可为 其他广义表所共享
- (3) 广义表可以是一个递归的表,即广义表也可以是 其本身的一个子表
- 广义表最重要的两个运算:取表头/取表尾
- 注意:广义表()和(())不同。前者为空表,长度n = O; 后者长度n = 1, 可分解得到其表头、 表尾均为空表()
- 广义表的存储结构 :链式存储结构
- 头尾链表的存储结构
- 扩展线性链表的存储结构
- 4.6 案例分析与实现
- 病毒感染检测
- 4.7 小结
- 4.4 数组(随机存储结构)
- 心得体会
- 这周学了第四章串、数组和广义表。重点在于串的BF算法和KMP算法。对于BF算法,理解和掌握都相对比较容易。但是对于KMP算法,理解容易,但是掌握算法比较难。特别是对next数组的理解。但还好慕课有资源以及网上可以搜索更多的资料进行分析理解。对于这章的数组,主要在于数组的压缩存储。个人觉得理解偏中等难度的,要结合图才比较容易理解。
- 因此, 我在理解的过程中除了看视频看书也在网上搜索。觉得看了比较容易理解的分享给大家。
- https://www.cnblogs.com/dusf/p/kmp.html 这是有关KMP算法的详细解释
- https://blog.csdn.net/baidu_36669549/article/details/85017010 这是关于数组压缩存储的图文结合理解
- 补充:
- 关于使用string、char数组、char指针问题以及关于string的相关内容,在spoc讨论里面zzh同学也发了相关的博文,初步了解 。后来hzy同学在群上询问老师,老师发的资料很详细也很全面,对于string知识也进行了补缺。
- 关于pta上作业和实践:作业题目跟书本的例题相差不大,但还是得思考好,关键还是next函数的编写。而实践是求集合交集,跟之前不一样的是测试的数据量变大运行时间有限,一开始我想到的算法是利用两个循环对数组重新进行排序(上网搜了一下这种方法叫冒泡排序法),运行起来的时间复杂度是O(n^2),但由于数据量较大时会出现运行超时不正确。所以上网搜索了一下对数组重新进行排序又可以降低时间复杂度的算法,于是就出现了algorithm的sort算法,在题目中使用后,时间复杂度降到O(n*logn)了,最后一个测试点也过了,所以还是得多考虑减少运行时间的问题。