第四章 串 数组 广义表
一.本章内容小结
(1)串(字符串)
1.线性表通常以“单个元素”为操作对象(查找,插入,删除等),而串通常以“串的整体”为操作对象(插入删除子串等)。
2.串分为顺序存储结构和链式存储结构,其中链式存储结构代码为:
#define CHUNKSIZE 80 //定义的块大小 typedef struct Chunk{ char ch[CHUNKSIZE]; struct CHUNK *next; }Chunk; typedef struct{ Chunk *head,*tail;//串的头尾指针 int length;//串的当前长度 }LString;
3.串的模式匹配算法——子串的定位运算(BF算法或KMP算法)
BF算法:最好最坏情况下平均时间复杂度均为O(n+m)
KMP算法:较BF算法为改良后的算法,模式匹配算法更易操作,其中常见模式匹配算法代码为:
int index_KMP(SString S,SString T,int pos) { i = pos;j = 1; while(i <= S.length && j <= S.length)//在串尾前比较好 { if(j == 0 || S[i] == T[j]){ ++i;++j;//继续比较后继字符 } else j = next[j];//模式串向右移动 } if(j > T[0]) return i - T[0];//匹配成功 else return 0;//匹配失败 }
(2)数组(下标访问元素)
定义:分为一维数组,二维数组,和多维数组。
(3)广义表
是一种递归的线性表结构。
二、作业心得体会
本次作业及实践——串的模式匹配和求两整数集合交集
在书本上学习到了next函数及其修正值的方法,刚开始只用主函数考虑,经常跑不了,有了这个函数就方便多了:
int* getnext(string T) //求模式串T的next函数值并放入next数组 { int* next = new int[T.length()]; //动态申请模式串T存储空间 int Tl = T.length(); int i = 0; // T的下标 int j = -1; //按下标比较,所以 j = -1,next[0] = -1; next[0] = -1; while(i<Tl)//T串未比较到串尾 { if(j==-1||T[i]==T[j])//若j==-1,或者字符匹配,则进行下一个字符比较,并求出T[i]字符对应的next值 { //T[i]是后缀,T[j]是前缀 ++i;++j; next[i]=j; } else j=next[j];//若字符不匹配,求出字符对应的next值 } return next;//因为是指针函数 ,所以返回next数组首地址 }
求交集那道编程题,可能是用熟悉的数组的原因,刚开始在判断交集元素的那个循环体中运行出现了问题,最后将二维的循环写成了同时满足的一条循环体就成功了。
三、推荐资料或书籍
具体查看上一条博文推荐,比较适合随时理解章节里常用的算法代码。
四、目标完成情况
上次提到的日常练习敲代码和课前预习都有在逐步实现,虽然暂时还没有做到足够的预习准备,代码也经常不能将以前敲过的一次都没有bug,也偶尔需要查阅课本才能写出算法。但相比以前,我在看题目时,脑子里会开始慢慢有了代码的思路,虽然也许逻辑会不够完整,但自己能感受到自己也有在进步,这一点让自己很开心也希望能坚持下去。
接下来的目标:对之前几章的作业实践题继续巩固练习敲几遍,课前预习,上课时积极参与讨论和回答问题环节,有问题及时解决并做好记录,方便以后出现同样问题时能及时处理好。