DS第4章学习小结

  1. 你对本章内容的小结
  2. 完成作业或实践时解决困难的经验分享
  3. 这段时间,你参考了哪些值得向大家分享的资料?每一项推荐都请说明推荐理由及列出相关链接(或书目名称,具体页码)
  4. 目前学习过程中存在的困难,待解决或待改进的问题
  5. 上次博客确定的目标达到了吗?如果没达到,请分析原因
  6. 接下来的目标

一、你对本章内容的小结

  第4章主要学习了数组

  主要学习了有关  模式匹配算法  的两种算法:T(n)=O(m*n)的BF算法  和  T(n)=O(m+n)的KMP算法

  KMP算法难在求出  模式的next数组。(即求next数组时的思想)

  

  数组主要学习了  怎么求具体下标的元素的地址  以及  如何用一维数组将一些特殊矩阵(如对称矩阵、三角矩阵、对角矩阵、稀疏矩阵等)进行压缩存储。

二、完成作业或实践时解决困难的经验分享

  先上修正前的代码:

 1 #include<iostream>
 2 using namespace std;
 3
 4
 5 void getnext(string t, int *next);
 6 int match(string S, string T, const int *next);
 7
 8
 9 int main()//7-1 串的模式匹配
10 {
11 //    freopen("input.txt","r",stdin);
12 //    freopen("output.txt","w",stdout);
13
14
15     string S;
16     string T;
17     cin>>S;
18     cin>>T;
19
20
21     int next[T.length()];
22     getnext(T,next);
23
24
25     cout<<match(S,T,next);
26
27
28 return 0;
29 }
30
31
32
33
34 void getnext(string t, int *next)
35 {
36     next[0]=-1;
37     for(int i=0,j=-1; i<t.length();)
38     {
39         if(j==-1||t[i]==t[j])
40         {
41             i++;j++;
42             next[i]=j;
43         }
44         else    j=next[j];
45     }
46 }
47
48
49 int match(string S, string T, const int *next)
50 {
51     int i=0,j=0;
52     for(;i<S.length()&&j<T.length();)
53     {
54         if(j==-1||S[i]==T[j])
55         {
56             i++;j++;
57         }
58         else
59         {
60             j=next[j];
61         }
62     }
63     if(j==T.length())    return    i-T.length()+1;
64     else    return 0;
65 }

  这是我最开始做PTA第4章作业的串的模式匹配的时候用KMP算法写的代码,

  这是个有点错的代码。

  修正后的代码:

 1 #include<iostream>
 2 using namespace std;
 3
 4
 5 void getnext(string t, int *next);
 6 int match(string S, string T, const int *next);
 7
 8
 9 int main()//7-1 串的模式匹配
10 {
11 //    freopen("input.txt","r",stdin);
12 //    freopen("output.txt","w",stdout);
13
14
15     string S;
16     string T;
17     cin>>S;
18     cin>>T;
19
20
21     int next[T.length()];
22     getnext(T,next);
23
24
25     cout<<match(S,T,next);
26
27
28 return 0;
29 }
30
31
32
33
34 void getnext(string t, int *next)
35 {
36     next[0]=-1;
37     for(int i=0,j=-1; i<(int)t.length();)
38     {
39         if(j==-1||t[i]==t[j])
40         {
41             i++;j++;
42             next[i]=j;
43         }
44         else    j=next[j];
45     }
46 }
47
48
49 int match(string S, string T, const int *next)
50 {
51     int i=0,j=0;
52     for(;i<(int)S.length()&&j<(int)T.length();)
53     {
54         if(j==-1||S[i]==T[j])
55         {
56             i++;j++;
57         }
58         else
59         {
60             j=next[j];
61         }
62     }
63     if(j==(int)T.length())    return    i-T.length()+1;
64     else    return 0;
65 }

  这是我修改过后的代码,可以看到我只是在  字符串的长度  前加了(int)进行类型转换,简单来说,就是

  负数  不能与  字符数组的strlen(s)  以及  字符串的s.length  进行比较,

  或者说  有符号整型中的负数  不能与  无符号整型  进行比较。

  1 #include<iostream>
  2 #include<string.h>
  3 using namespace std;
  4
  5
  6 const int MAXSIZE=1002;
  7
  8
  9 void change2(char *ch);//空格
 10 void change3(char *ch);//大写变小写
 11 void change4_6(char *ch);//I和me变成you以及can you变成I can
 12 void change5(char *ch);//?变成!
 13 bool punctuation(char ch);//判断标点符号
 14
 15
 16 int main()//7-2 AI核心代码
 17 {
 18 //    freopen("input.txt","r",stdin);
 19 //    freopen("output.txt","w",stdout);
 20     int n=0;
 21     cin>>n;
 22     cin.ignore(10,‘\n‘);
 23
 24
 25     char a[n][4*MAXSIZE];
 26
 27
 28     for(int i=0; i<n; i++)
 29     {
 30         cin.getline(a[i],MAXSIZE);
 31     }
 32
 33
 34     for(int i=0; i<n; i++)
 35     {
 36         cout<<a[i]<<endl;
 37         cout<<"AI: ";
 38
 39
 40         change2(a[i]);
 41         change3(a[i]);
 42         change4_6(a[i]);
 43         change5(a[i]);
 44
 45
 46         cout<<a[i];
 47
 48
 49         if(i!=n-1)
 50         cout<<endl;
 51     }
 52
 53
 54 return 0;
 55 }
 56
 57
 58
 59
 60 void change2(char *ch)//空格
 61 {
 62     int k=0;
 63     for(int i=0; ch[i]!=‘\0‘; i++)//前空格
 64     {
 65         if(ch[i]==‘ ‘)
 66         k++;
 67         else    break;
 68     }
 69     for(int i=k,j=0; ch[i]!=‘\0‘; i++,j++)
 70     {
 71         ch[j]=ch[i];
 72     }
 73     ch[strlen(ch)-k]=‘\0‘;
 74
 75
 76     for(int i=0,j=0; ch[i]!=‘\0‘; i++)//中空格
 77     {
 78         if(ch[i]!=‘ ‘||ch[i-1]!=‘ ‘)
 79         {
 80             ch[j]=ch[i];
 81             j++;
 82             k=j;
 83         }
 84     }
 85     ch[k]=‘\0‘;
 86
 87
 88     for(int i=0,j=0; ch[i]!=‘\0‘; i++)//标点前的空格
 89     {
 90         if(!(ch[i]==‘ ‘&&punctuation(ch[i+1])))
 91         {
 92             ch[j]=ch[i];
 93             j++;
 94             k=j;
 95         }
 96     }
 97     ch[k]=‘\0‘;
 98
 99
100     if(ch[strlen(ch)-1]==‘ ‘)    ch[strlen(ch)-1]=‘\0‘;//后空格
101 }
102
103
104 void change3(char *ch)//大写变小写
105 {
106     for(int i=0; ch[i]!=‘\0‘; i++)
107     {
108         if(‘A‘<=ch[i]&&ch[i]<=‘Z‘&&ch[i]!=‘I‘)
109         ch[i]=ch[i]+32;
110     }
111 }
112
113
114 void change4_6(char *ch)//can you变成I can    以及    I和me变成you
115 {
116     char m[4*strlen(ch)];
117     int k=0;
118     for(int i=0,j=0; ch[i]!=‘\0‘;)
119     {
120         if((strlen(ch)-i)>=7&&(i==0||punctuation(ch[i-1]))&&ch[i]==‘c‘&&ch[i+1]==‘a‘&&ch[i+2]==‘n‘&&ch[i+3]==‘ ‘&&ch[i+4]==‘y‘&&ch[i+5]==‘o‘&&ch[i+6]==‘u‘&&punctuation(ch[i+7]))
121         {
122             m[j]=‘I‘;m[j+1]=‘ ‘;m[j+2]=‘c‘;m[j+3]=‘a‘;m[j+4]=‘n‘;
123             i=i+7;j=j+5;
124             k=j;
125         }
126         else if((i==0||punctuation(ch[i-1]))&&ch[i]==‘I‘&&punctuation(ch[i+1]))
127         {
128             m[j]=‘y‘;m[j+1]=‘o‘;m[j+2]=‘u‘;
129             i++;j=j+3;
130             k=j;
131         }
132         else if((i==0||punctuation(ch[i-1]))&&ch[i]==‘m‘&&ch[i+1]==‘e‘&&punctuation(ch[i+2]))
133         {
134             m[j]=‘y‘;m[j+1]=‘o‘;m[j+2]=‘u‘;
135             i=i+2;j=j+3;
136             k=j;
137         }
138         else
139         {
140             m[j]=ch[i];
141             i++;j++;
142             k=j;
143         }
144     }
145
146
147     for(int i=0; i<k; i++)
148     {
149         ch[i]=m[i];
150     }
151     ch[k]=‘\0‘;
152 }
153
154
155 void change5(char *ch)//?变成!
156 {
157     for(int i=0; ch[i]!=‘\0‘; i++)
158     {
159         if(ch[i]==‘?‘)    ch[i]=‘!‘;
160     }
161 }
162
163
164 bool punctuation(char ch)//判断标点符号
165 {
166     return (!(‘0‘<=ch&&ch<=‘9‘)&&!(‘A‘<=ch&&ch<=‘Z‘)&&!(‘a‘<=ch&&ch<=‘z‘));
167 }

  这是我做PTA第4章实践1的AI核心代码的时候写的代码,我的想法是一次性输入所有的对话,然后根据要求对输入的对话进行修改,再输出对话。

  需要注意的是,

  因为题目中  “把原文中所有独立的 I 和 me 换成 you;”  的这个要求会加长字符串的长度,所以要预先给对话的字符数组分配更大的空间。

  在实现  “把原文中所有独立的 can you 换成 I can;”  和  “把原文中所有独立的 I 和 me 换成 you;”  的时候,应先实现前者,再实现后者。

  然后,因为修改时对话的长度有可能会不停的变,所以要在合适的地方加上结束符‘\0‘  如ch[k]=‘\0‘;,

  其他的根据题目的要求去写代码就好。

三、这段时间,你参考了哪些值得向大家分享的资料?每一项推荐都请说明推荐理由及列出相关链接(或书目名称,具体页码)

  https://www.cnblogs.com/chenxiwenruo/p/3546457.html

  这是一个有关KMP算法的博客,里面说到了,

  “理解next数组的含义:next[i]表示前面长度为i的子串中,前缀和后缀相等的最大长度”。

  若按此博客中的理解去想,则  next[i]既是下标、又是最大长度,

  而按书中的描述去想,则  next[i]为位置,也为前缀和后缀相等的最大长度+1,

  对我来说,前者更容易使人接受、理解。

四、目前学习过程中存在的困难,待解决或待改进的问题

  脑子还是太缺筋,将很多简单的问题复杂化了。

  还有就是我觉得我对i和j有执念,我觉得i和j的作用域一定要在循环里面/捂脸,导致如果要在循环外用到i或j结束时的值时,我会引入一个k在循环中记录i或j的值。

五、上次博客确定的目标达到了吗?如果没达到,请分析原因

  没达到,没有看老师给的高质量c++编程指南31~60页,因为自己做事的效率实在太低,整天都在空思考,重复思考。

六、接下来的目标

  看老师给的高质量c++编程指南31~90页。

  

原文地址:https://www.cnblogs.com/ymj19/p/10695826.html

时间: 2024-10-07 23:34:04

DS第4章学习小结的相关文章

DS第七章学习小结

第七章小结 先列出一些基本的概念: ①关键字:数据元素(记录)中某个数据项的值,用它可以表示一个数据元素. ②动态查找表/静态查找表:若在查找的过程中进行修改操作(插入或删除),则相应的表为动态查找表,否则为静态查找表. ③平均查找长度:为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值称为查找算法在查找成功时的平均查找长度.公式如下:ASL=∑PiCi (i=1,2,3,…,n),可以简单以数学上的期望来这么理解.其中:Pi 为查找表中第i个数据元素的概率,Ci为找到第i个数据

DS第四章学习小结

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

第三章学习小结—-转

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

数据结构 第一章学习小结

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

数据结构第四章学习小结

第四章主要是串和数组的学习,之前对串和数组的应用仅限于对其单独处理,本章学习着重于对具体题目的实际操作,实践了串的模式匹配算法,对其有了更深入的了解,数组的应用拓展到了稀疏矩阵的存储的实现. 一.串 串的模式匹配 BF算法 首先未匹配到串尾时,将两个字符串一一匹配,可用C++自带的length()函数实现 while(i<=S.length()&&j<=T.length()) 接下来就是匹配的过程 if(S[i]==T[j]){ i++;j++; }//若匹配则继续比较下一位

第6章学习小结

一  学习小结 图的基本知识 1. 图分为无向图和有向图.若无向图有 n(n-1)/2 条边,则称之为无向完全图,若有向图有 n(n-1) 条弧,则称之为有向完全图 2. 带权图通常称为网 3. 度:顶点v的度指和v相关联的边的数目,记为TD(v)   入度:以v为头的弧的数目   出度:以v为尾的弧的数目 4. 路径长度是一条路径上经过的边或弧的数目 5. 强连通图:在有向图G中,对于每一对vi,vj∈V,从vi到vj都存在路径 6. 连通生成树:一个极小连通子图,它含有图中全部顶点,但只有足

第七章学习小结

第七章主要学习了很多种查找方式,从最简单的线性表查找到树表的查找到散列表查找,不同的查找方式有不同的优点,下面根据练习来实际应用这些知识. 这个问题的任务很简单:将一个不同的正整数序列插入哈希表,并输出输入数字的位置.散列函数定义为h(key)=key%tsize,其中tsize是散列表的最大大小.二次探测(只有正增量)用于解决碰撞.请注意,表的大小最好是素数.如果用户给定的最大大小不是质数,则必须将表大小重新定义为大于用户给定大小的最小质数.输入规格:每个输入文件包含一个测试用例.对于每种情况

数据结构第一章学习小结

第一章学习了一些基本概念以及它们之间的联系,对数据结构这门课程有了初步的了解.刚开始看书的时候,有很多地方不是很明白,对一些名词的解释也不懂,后来结合视频讲解才比较透彻.一开始不清楚ADT的作用,直到自己去写了一遍才有体会.当自己不懂或者不会的时候,一定要自己上手去写去打代码,才能明白困扰自己的那个点在哪里,通过查资料.看视频等等方式解决这个问题.数据结构和算法是相辅相成的,理解透彻基本的概念,才能为之后的学习铺路.这学期要肯花功夫,本来基础就不是很好,更应该笨鸟先飞.对概念的理解不透彻,或言之

第5章学习小结

第五章主要学习了树的知识,以前一直很好奇,为什么电脑能存储像树一样的数据结构,学完才发现,ADT加数组或者ADT加链表真的可以衍生出多种多样的数据类型,以下做出本章小结: 1.利用ASCII码实现不同类型的数据的转换,如:int = char - ‘0’. 2.学会了利用bool类型标记找出所需数据类型,如找根节点,先将bool型数组初始化成false,输入过的节点标记为true,那么为false的即为根节点. 3.树的四种遍历方式:利用递归实现三种遍历方式 先序: void PreOrderT