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 }
在自己苦苦思考无果后,我决定发邮件向老师请教解决方法。在回复邮件中,老师写道“根据你自己写的双重循环,其时间复杂度为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 }
经过不断反复检查,终于想起来跨函数的传值调用问题,即使变量名相同,但在不同函数内不能直接调用相同的值,这是值得注意的地方。
另外,在做两道编程填空题的时候,都没有考虑到输出最后一个数的后面没有空格,两题都出现了格式错误,因此,以后做题时要注意输出的格式问题。