数据结构:第四章学习小结

第四章 串 数组 广义表
一.本章内容小结
(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,也偶尔需要查阅课本才能写出算法。但相比以前,我在看题目时,脑子里会开始慢慢有了代码的思路,虽然也许逻辑会不够完整,但自己能感受到自己也有在进步,这一点让自己很开心也希望能坚持下去。

接下来的目标:对之前几章的作业实践题继续巩固练习敲几遍,课前预习,上课时积极参与讨论和回答问题环节,有问题及时解决并做好记录,方便以后出现同样问题时能及时处理好。

 

posted @ 2020-05-04 17:29  软件工程1902贺依  阅读(125)  评论(0编辑  收藏  举报