zoukankan      html  css  js  c++  java
  • 数据结构:第四章学习小结

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

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

  • 相关阅读:
    UVALive 6909 Kevin's Problem 数学排列组合
    UVALive 6908 Electric Bike dp
    UVALive 6907 Body Building tarjan
    UVALive 6906 Cluster Analysis 并查集
    八月微博
    hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形
    hdu 5792 World is Exploding 树状数组
    hdu 5791 Two dp
    hdu 5787 K-wolf Number 数位dp
    hdu 5783 Divide the Sequence 贪心
  • 原文地址:https://www.cnblogs.com/heyi-777/p/12827334.html
Copyright © 2011-2022 走看看