第四章小结
第四章小结
本章主要学了串、数组和广义表
串的总结:
定义:
串(string或字符串)是由0个or多个字符有限序列
串的长度:串中字符的数目n
空串VS空格串:0个字符的串称为空串,一个或者多个空格组成的串“ ”称为空格串
主串:包含子串的串
模式(子串):串中任意个连续的字符组成的子序列
判断两串相等:当且仅当两串长度相等+各个对应位置的字符都相等
串的存储结构:链式和顺序
顺序存储,注意:C语言中,存在Heap(堆)的自由存储区域,可以为每一个新产生的串动态分配一块实际串长所需的存储空间,若分配成功,则返回一个指向起始地址的指针,作为串的基址---又称:串的堆式顺序存储结构
链式存储:依然是优越在插入与删除操作的方便性(在找到目的地址后比较)
串的模式匹配算法:
首先学的是BF算法和KMP算法
BF算法的原理:
口语化文字分析:就是从串的某一个字符与模式(子串)一个一个比较,一般都是从第一个字符开始,不过可以指定主串中的查找的起始位置pos
算法描述:
int Index_BF(SString S , SString T , int pos) {/* 模式T在主串S中第pos个字符开始第一次出现的位置。若不存在,
则返回值为0,其中T为非空,1<=pos && pos <= S.length */ i = pos; j = 1;//初始化 while(i <= S.length && j <= t.length)//两个串均为比较到串尾 { if(S.ch[i]==T.ch[i])//继续比较后续的字符 { ++i ; ++j;} else{ i=i-j+2 ; j=1; }//指针后退重新开始匹配 } if(j>T.length ) return i-T.length;//匹配成功 else return 0;//匹配失败 }
BF算法的优势在于匹配过程便于理解,且在一些场合利用较高(每一趟不成功的匹配都发生在模式串的第一个字符与主串中的相应的字符比较,时间复杂度为:O(m+n)),但是当匹配失败的时候,主串的指针 i 总是要回溯到 i-j+2 的位置,且其在另外一种场合则利用率低(每趟不成功都发生在模式串的最后一个字符与主串中的相应的字符比较,时间复杂度为:O(m*n))
KMP算法的原理:
时间复杂度是O(n+m)
这个真的是个大头,看着令人头大
注:为什么第一位要用-1:假若之前有一个地方不匹配,则应该跳next数组,跳到下标为0处,但是这样就变成死循环了,为防止死循环,我们应该退一步,将next数组的第0个赋值为-1 ——> 将整个next数组向后移——>就不会变成死循环了
所以我们要更改next函数
void xiuzhengnext(string pstring, int *next) {//设计一个函数next,来修正next的数值 next[0] = -1;//表示模式串的开头,为-1,否则会错位 int j = 0, k = -1; int plen = pstring.length();//模式串的长度 char *p = jg(pstring);//模式串的字符数组 while (j < plen) { if(k == -1 || p[j] == p[k]) { k++; j++; next[j] = k;/*next数组存放着已匹配的子串中最长的前后缀, next[j] 表示p[0]-p[j] 子串中最长的前后缀长度*/ } else{ k = next[k]; //k回溯到模式串的开头 } } }
所以就写了下面这个KMP的一个函数
int kmp( string s, string pstring) { int *next = new int [pstring.length()]; xiuzheng_next(pstring,next);//得到 next[]数组 char *c = jg(s); char *p = jg(pstring); //转换字符串为字符数组 int i=0,j=0; int pos = 0; while( i<=s.length()|| j<=pstring.length() ) { if(j ==-1 || c[i] == p[j]){ i++; j++; } else{ j = next[j];// } /* (1)有着最长前后缀的时候,主串与模式串在主串s[j]的位置(模式串最长后缀后一位) 不匹配的时候の 时候,s[j]将会与模式串的最长前后缀的后一位进行比较 (2)没有最长前后缀的时候,整个模式串后移一位 */ if(j == pstring.length()){//匹配成功 pos = i-j+1; break; } } return pos; }
然后我们学习了数组
当然,我们在数组的上面,给我的理解主要是运用在矩阵那一方面
定义:数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素,每个元素受n(n>=1)个线性关系约束。
数组一般不做插入或删除的工作,因此用顺序存储结构来表示数组比较合适
行序为主序:Basic Pascal Java 和C
列序为主序:FORTRAN
有关二维数组的任一元素的存储空间位置:LOC(I,J)=LOC(0,0)+(N*I+J)L;
推广到n维(我打不出来,于是就决定放照片!)
一个矩阵即一个三维数组,包括矩阵的行、列,非零元素的总个数。然后才是里面的具体数值。
特殊的矩阵压缩:对称+三角+对角+稀疏矩阵
广义表纯粹就是自己看了看,首先看了个图,就觉得跟树挺像的,其他的还要慢慢看
关于本周作业:
我居然看懂了KMP算法,当然问了好几个同学,然后是AI那道题,我也觉得挺喜欢的,因为更加贴近生活?
AI那道题就是先把大方向捋顺,先将题目的需求列出来,然后在主函数中将接口函数写出,最后再一点一点的将接口对应的函数补全
本周心得:
由于老师带着我们一起打了AI那道大题,让我对代码又有了兴趣和信心,想想还是要认真打打代码hhh,好好学习代码。
希望以后,老师能经常带着我们打一些题目,比如通过微信进行指导hhh,虽然可能很多同学不会在线hh,但是总之,本周感觉收获很多,心态也更加的好了,希望下周继续努力
周周有进步
关于作业的一些思考+解题过程我就先不放在这里了,因为这次要晚一点才能写完作业,我还是先总结再刷题hhh
-------------------------------------------------------------------------------------------------------------------------------------
关于作业总结出来了:https://www.cnblogs.com/JeffKing11/p/10666505.html
下周目标:
当然是跟着老师继续努力认真的学习hhh,然后保持着良好心态,并且经常看一些代码来熟练的找出规律来应对一些web题
参考材料:
https://www.cnblogs.com/yi2105/p/10665769.html
https://www.cnblogs.com/yewanting/p/10674340.html
(多谢以上两位大佬的指点,而且她们写的博客会更加系统一些(捂脸:
E5BCB1E9B8A1E4B88DE695A2E8AFB4E8AF9D))