DS|数据结构||第二章小结

       本章主要学习了线性表的相关知识,包括顺序表和各种类型链表的定义和基本常用操作。一开始上课听讲的时候,感觉很迷糊、很抽象,又加上C++的指针部分知识基础不扎实,导致不是很理解上课的内容,提起来比较吃力。还好后来自己回去认真研究了书本,才弄清楚了相应的知识。其实刚学数据结构,不知道时间复杂度、空间复杂度等概念有什么具体用处,直到后来做了PTA上的作业……

       做实践题的时候,我一开始没有用到书本,而是凭借自己仅有的C++知识写了初步的程序,输入样例后发现输出的和题目一样,很兴奋,就复制到PTA上提交,然而,只有部分正确,100000数据的时候显示运行超时,一开始我没太在意这个题目要求,没想到就是因为这个导致没有通过。

 1 #include <iostream>
 2 using namespace std;
 3 void bubble_sort(long A[], long n)
 4 {
 5     long d,e,f;
 6     for(d=0;d<n-1;d++){
 7         for(e=0;e<n-1-d;e++){
 8             if(A[e]>A[e+1]){    
 9             f=A[e];
10             A[e]=A[e+1];
11             A[e+1]=f;
12             }
13         }
14         }
15 }
16 
17 int main(){
18     long n,m,i,j,k,P=0,N=0;
19     cin>>n>>m;
20     long a[n],b[m];
21     for(i=0;i<n;i++){
22         cin>>a[i];
23     }
24     for(i=0;i<m;i++){
25         cin>>b[i];
26     } 
27     for(j=0;j<n;j++){
28         for(k=0;k<m;k++){
29             if(a[j]==b[k])
30             N++;
31         }
32     }
33     cout<<N<<endl;
34     long c[N]={0};
35     for(j=0;j<n;j++){
36         for(k=0;k<m;k++){
37             if(a[j]==b[k]){
38                 c[P]=a[j];
39                 P++;
40             }
41         }
42     }
43     bubble_sort(c,N);
44     for(i=0; i<N; i++){
45         cout<<c[i];
46         if(i<N-1)
47         cout<<" ";
48     }
49 }
第二章实践1

        在自己苦苦思考无果后,我决定发邮件向老师请教解决方法。在回复邮件中,老师写道“根据你自己写的双重循环,其时间复杂度为O(m*n)。在10万数据量时,运行估计还是超时”,我才意识到时间复杂度的重要性,于是,我根据老师的建议“先对两个数组扫描得出交集个数,然后又重新扫描得出具体的交集元素,这样效率太低,完全可以合并完成”,重新优化算法,先排序再比较,最后顺利提交通过。    

        因此,以后做题的时候要特别留意题目的要求,比如数据量、内存限制、时间限制等,任何一个小要求都会对算法有不同的要求,应该根据不同的要求选择最适合的算法,在提交之前也要运用所学的知识对自己的算法进行初步的评估。

 

        做作业的编程填空题时,同样由于上学期C++的知识并不扎实,导致出现了问题。

 1 /* 
 2 填空:顺序表的建立与遍历程序。注意:有三处注释部分需补充完整! 
 3 */
 4 
 5 #include<iostream>
 6 using namespace std;
 7 
 8 #define MAXSIZE 100
 9 
10 typedef int ElemType;//将整型int关键字重新命名为 Elemtype,即int 和 Elemtype 代表的类型一样
11 
12 typedef struct{
13     ElemType elem[MAXSIZE];
14     int length;
15 }SqList;
16 
17 void CreateList( SqList& , int ); //函数声明 
18 void DisplayList( SqList ); //函数声明 
19 
20 int main()
21 {
22     SqList L;//将L定义为SqList类型的变量
23     int n;
24     cin >> n;
25     if ( n > MAXSIZE ) return 0; //n值超出范围,程序退出 
26     CreateList( L, n );//创建变量L顺序表,传入输入的n值确定表长
27     DisplayList( L );
28     return 0;
29 }
30 
31 void CreateList( SqList &L, int n )
32 {
33     for ( int i = 0; i < n; i++ )
34         cin >> L.elem[i];
35         
36     L.length = n;
37 }
38 
39 void DisplayList( SqList L )
40 {
41     for ( int i = 0; i < L.length; i++ )
42         cout << L.elem[i] << " ";
43 }
第二章作业1编程题顺序表的建立与遍历程序

经过不断反复检查,终于想起来跨函数的传值调用问题,即使变量名相同,但在不同函数内不能直接调用相同的值,这是值得注意的地方。

       另外,在做两道编程填空题的时候,都没有考虑到输出最后一个数的后面没有空格,两题都出现了格式错误,因此,以后做题时要注意输出的格式问题。

       学习完本章,希望自己能逐渐熟练掌握顺序表和链表的基本操作算法的书写,遇到实际问题时,能从时间和空间复杂度的角度比较两种存储结构的不同特点及适用场景,从而选择最优的算法结构。

posted @ 2019-03-17 17:24  .Daylight  阅读(272)  评论(1编辑  收藏  举报