数据结构第四章学习小结

第四章主要是串和数组的学习,之前对串和数组的应用仅限于对其单独处理,本章学习着重于对具体题目的实际操作,实践了串的模式匹配算法,对其有了更深入的了解,数组的应用拓展到了稀疏矩阵的存储的实现。

一.串

串的模式匹配

BF算法

首先未匹配到串尾时,将两个字符串一一匹配,可用C++自带的length()函数实现

while(i<=S.length()&&j<=T.length())

接下来就是匹配的过程

if(S[i]==T[j]){
        i++;j++;
        }//若匹配则继续比较下一位
else{
        pos++;
        i=pos;
        j=0;
        }//若不匹配则i回溯到之前比较的首位的下一位,j回溯到首位 

BF算法简单粗暴容易理解,但最坏情况下时间复杂度高,使用改进算法KMP算法j不必回溯,减少了时间复杂度。

二.数组:

数组是一种随机存取结构,使用数组存储的数据,可以通过其规律性,由下标计算其存储位置

C(i)= L(i=n)

C(i)=C(i+1)*b(i+1)

用二维数组可以表示一些特殊矩阵,如对称矩阵、三角矩阵、对角矩阵及稀疏矩阵,本章着重于实现用二维数组存储稀疏矩阵的方法。

稀疏矩阵

在稀疏矩阵中,我们要做的就是存储非0元素的信息,首先单独思考一个非0元素,我们要存储的是它的行号、列号、值,可以用一个三元组实现。

typedef struct{//定义一个三元组存放稀疏矩阵中非0元素的信息
    int i;
    int j;
    int value;
}node;

再将眼光放远到整个矩阵中,我们要存储的信息的是矩阵的行数、列数、非0元素的个数和信息,于是我们在矩阵的类中嵌套进三元组类。

typedef struct{//存放矩阵信息
    int m;//矩阵行数
    int n;//矩阵列数
    int N;//非0元素的个数
    node a[500];//非0元素信息
}Matrix;

接下来就是输入输出啦

三、AI核心代码

该题目的具体要求主要是:1.删除多余空格 2.大写转小写 3.I,me换成you  4.?换! 5.can you换I can,了解具体要求后,我们就可以先开始写主函数形成大体解题框架,再通过具体函数的编写实现程序。

解题过程中有几个比较重要的点:

1.     平时对字符扫描时一般用习惯for,但具体用for还是while还是要根据条件来判断,有规律逐个扫描用for,无规律用while。在该题中,我们需要有规律地逐个扫描字符,于是用for语句定位到第一个非空字符串。

for(i=0;s[i]!=‘\0‘&&s[i]==‘ ‘;i++); 

2.  在实现大写转小写时编写代码比较复杂,而像这样操作一般都会有函数可以直接调用,平时可以多积累一些函数需要用到时直接调用,如该题可以直接调用tolower函数程序会简洁许多

if(s[i]!=‘I‘){
      t[j]=tolower(s[i]);//大写转小写
      ++j,++i;
      continue;
          }
       else
       t[j++]=s[i++];

3.  题目中要求被转化的词是独立的,我们可以编写一个函数确保被转化的词的独立性,通过判断是否前后是否为分隔符来判断,而分隔符种类很多不能一一列举,于是我们可以往相反方向思考,除了字母和数字之外都是分隔符

bool independent(char ch){//判断是否为分隔符(除字母和数字)
    ch=tolower(ch);
    if(ch>=‘0‘&&ch<=‘9‘||ch>=‘a‘&&ch<=‘z‘)
    return false;
    else
    return true;
}

分隔符问题要考虑溢出,当字符前面没有分隔符即i=0时该字符头部也是独立的

j==0||independent(t[j-1])

该语句可以解决这个问题,当||前面条件成立时不判断后面条件是否成立,直接判断为字符前无分隔符,头部独立。

再做相似题目时,先写出大体框架,再一步步完善未考虑到的溢出及边界问题

四、总结

KMP算法还是没能研究出来怎么写,希望之后能一点点消化它的思想。虽然写出了AI核心代码的题目,但大部分还是在老师带领下写的,希望之后能自主写出这样一段神奇有趣的代码。

原文地址:https://www.cnblogs.com/Abigaillll/p/10706026.html

时间: 2024-10-11 09:00:06

数据结构第四章学习小结的相关文章

【数据结构】第四章学习小结

串.数组 在第四章中,我学到的主要是关于串与数组的内容,至于广义表,既然老师让我们课后有时间去看,那我这里就先不讲广义表了(其实只是粗略的看了一下,还没看懂) 在上学期的c++中我就已经学过有关串的一些知识,对于串还是可以很好的理解的,在数据结构中,串将被看作是一种特殊的线性表,跟线性表一样,串也有两种基本存储结构,个人觉得顺序存储结构对于串的运用比较方便,简单易懂,所以在作业题中会首先考虑使用顺序串. 串有许多很重要的应用,例如搜索引擎,数据压缩等,这些应用都离不开串的模式匹配算法(子串的定位

DS第四章学习小结

本章最令人印象深刻的题就是AI核心代码这题了.如下 说实话,刚看到这题真的懵了,虽然只是一道题,但总给人6题的感觉.尽管困难重重,但还是在陈晓梅老师的指导下,大致完成了此题. 逻辑分析 先定义数据结构,自然是字符数组/字符串最初考虑主函数逻辑,主要是读取输入语句,并调用接口处理输入语句并输出.基本流程是,读入一句,对其进行扫描.判断.操作,再存到新的字符串,最后输出新的字符串. 一开始输入部分就卡住了,因为不知道怎么处理回车后还能输入数据,进度就陷入了停滞,不过课上根据老师所说getchar()

第四章学习小结 串的模式匹配 解题心得体会

串的模式匹配 解题心得体会 关于串,模式匹配是其一个很重要的问题.针对这个问题,书上讲了两种模式匹配的算法,即BF算法和KMP算法,下面针对这两种算法的实现谈谈我的心得. 一.BF算法的探索 [错误代码1] #include<iostream> #include<string.h> using namespace std; typedef struct{ char ch[1000002]; int length; }SString; void Index_BF(SString S,

第四章学习小结

这两周上课学的较多且比较有印象的是串的模式匹配算法那道题 同时可以用BF或者KMP算法进行解决. 一开始学BF算法时就在想如何改进可以使匹配更加简便 后来KMP的学习让我对串的学习有了更深入的了解 同时BF和KMP算法之间的联系也是一个算法改进的很好学习范例 7-1 串的模式匹配 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置. 输入格式: 输入有两行: 第一行是主串S: 第二行是模

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

心得体会:经过一周的学习,初步理解顺序表.单链表的概念及初步应用,像顺序表,存储空间一定是连续的,而链表则可以通过指针指向下一个结点的地址,从而使链表的存储空间不连续,真的是很神奇的概念目前存在的困难:不能完全靠自己独立地写出ADT的定义和一些具体的操作,对我现在来说还是有点难度的.不过我相信熟能生巧. 分享的资料:<CLRS 算法导论>——百度直接搜索即可,其他同学有提到过,是一本算法的百科全书.下一阶段的目标:完全理解及独立地完成和完成一些代码的操作,不依靠课本的一些案例,也希望自己能够更

第四章 学习小结

我想谈谈我写模式匹配题时的心得体会: 如果是用BF算法我觉得的这道题真的非常简单,我是用的BF算法, 一开始我把string和书上的sstring搞混淆了 就像下图的代码所示: S.[i]==T.[j] S.length 但是string是头文件<cstring>包含的所以应该打成这样 S[i]==T[j] S.length() 老师上课时讲过这个,但我当时没有认真记下来,课后翻书,就直接按书上的打了,所以就出现错误.后来查阅了相关资料才修改过来了 因为用的是string所以我的BF算法函数如

数据结构第四章总结

数据结构第四章学习的是串,数组和广义表(广义表课程中没讲,问题不大) 串的定义其实在c++学习中就有所接触,所以这里不详说,  重点说的是两个串模式匹配算法 1.BF算法 BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符: 若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果.BF算法是一种蛮力算法. 2.KMP算法 KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达

数据结构 第一章学习小结

数据结构   第一章学习小结 1.数据结构第1章的心得体会: 这周学习了数据结构的绪论及第一章.初步了解了数据结构与算法的相关概念,一开始看书看视频时觉得还挺抽象的,不能够完全理解.但是反复多看了几遍之后,结合例题,自己去操作去跑代码,慢慢觉得容易理解接受起来了.由于现在以网课形式进行教学,老师上课的同时基本还是靠自己去理解学习.当然老师也发挥很大的作用,比如让我们更深入的了解递归的空间复杂度为什么与问题规模有关,又怎样去找到该函数的临界值等等.既锻炼了我们深入思考的能力,也让我们更加清楚了解不

第三章学习小结—-转

[学习目标] 01掌握一维数组的声明和使用方法(OK) 02掌握二维数组的声明和使用方法(OK) 03掌握字符串的声明.赋值.比较和连接方法(连接很少用) 04熟悉字符的ASCII码和ctype.h中的字符函数 05正确认识++.+=等能修改变量的运算符(OK) 06学会用编译选项-Wall获得更多的警告信息(OK) 07了解不同操作系统中换行符的表示方法(嗯) 08掌握fgetc和getchar的使用方法(fgetc基本没用过) 09掌握预处理和迭代开发的技巧(嗯) 程序3-1 逆序输出 输入