本周总结(数据结构小学期)
一:做的事情:完成了数据结构小学期第一阶段实验和初步了解大数据技术
二:遇到的问题:7-1 jmu-ds-实现KMP和7-2 关键路径,数据结构的算法掌握的太差
三:下周准备开始编写数据结构小学期第二阶段
现在这里说一下我对大数据技术的基本认识:大数据技术是指大数据的应用技术,涵盖各类大数据平台、大数据指数体系等大数据应用技术。大数据是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合。是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
数据结构第一阶段不会的问题:
1.7-1 jmu-ds-实现KMP
(自己不太会写,去csdn找了好多资料)
#include<stdio.h> #include<string.h> void GetNext(char T[],int next[]);//定义函数 int KMP(char S[],char T[]);//定义kmp的函数 int main()//主函数 { int n,i;//定义变量 scanf("%d",&n);//输入数据个数 char S[n][80],T[n][80]; for(i=0;i<n;i++) { scanf("%s %s",S[i],T[i]);//输入字符串 } for(i=0;i<n;i++) { if(KMP(S[i],T[i])==0) printf("not find!\n") ;//没找到则输出 else printf("%d\n",KMP(S[i],T[i])); } } void GetNext(char T[],int next[]) { int i,j,len; next[0]=-1; for(j=1;T[j]!='\0';j++) { for(len=j-1;len>=1;len--) { for(i=0;i<len;i++) if(T[i]!=T[j-len+i]) break;//看看T是否是对称的字符串 if(i==len) { next[j]=len; break; } } if(len<1) next[j]=0; } } int KMP(char S[],char T[]) { int i=0,j=0; int next[80]; GetNext(T,next); while(S[i]!='\0'&&T[j]!='\0')//比较两个字符串里的字母是否相等 { if(S[i]==T[j]) { i++;j++; } else { j=next[j]; if(j==-1) { i++;j++; } } } if(T[j]=='\0') return(i-strlen(T));//输出位置 else return 0; }
2.7-2 关键路径
(请教了同学)
#include<iostream> #include<queue> #include<cmath> #include<cstring> using namespace std; #define maxx 200 #define INF 10000 int edges[maxx][maxx];//定义一个二维整型数组 int in[maxx] = { 0 };//初始化数组 int out[maxx] = { 0 }; int early[maxx] = { 0 }; int late[maxx];//定义一维数组 int max1[1]={0}; int s[maxx]={0}; int ne, nv; int l=0; int temp1=0; int earlytime()//定义函数 { int cnt = 0; queue<int>qu; for (int i = 1; i <= nv; i++) { if (in[i] == 0) qu.push(i);//找到入度为零的节点,就是起点 } while (!qu.empty())//非空 { int temp = qu.front(); cnt++; qu.pop(); for (int i = 1; i <= nv; i++) { if (edges[temp][i] != INF) { in[i]--; early[i] = max(early[i], early[temp] + edges[temp][i]);//取最大值 if (in[i] == 0)qu.push(i); } } } if (cnt != nv) return -1;//无法完成任务 else { int amount = -999; for (int i = 1; i <= nv; i++) { if (early[i] > amount) amount = early[i]; } return amount;//找出最后的最大值 } } void latetime(int count)//定义函数 { queue<int>qu; for (int i = 1; i <= nv; i++) { if (out[i] == 0) { qu.push(i); late[i] = count; } } while (!qu.empty()) { int temp = qu.front(); qu.pop(); for (int i = nv; i >=1; i--)//反着来 { if (edges[i][temp] != INF) { out[i]--; late[i] = min(late[i], late[temp] - edges[i][temp]);//取最小值 if (out[i] == 0) qu.push(i); } } } } int main() { int n, m; while(cin >> n >> m){ nv = n; ne = m; memset(in,0,sizeof in); memset(out,0,sizeof out); memset(early,0,sizeof early); memset(late,0,sizeof late); memset(s,0,sizeof s); for (int i = 0; i < maxx; i++) { late[i] = INF; for (int j = 0; j < maxx; j++) { edges[i][j] = INF; } } for (int i = 1; i <= ne; i++) { int a, b, c; cin >> a >> b >> c; edges[a][b] = c; in[b]++; out[a]++; } int count = earlytime(); if (count == -1) { cout << "unworkable project"<<endl; continue; } latetime(count); cout << count << endl; for (int i = 1; i <= nv; i++)//从小到大保证任务开始的交接点编号小者优先 { for (int j = nv; j >= 1; j--)//从大到小保证起点编号相同时,与输入时任务的顺序相反。 { if (edges[i][j] != INF&&late[j] - early[i]==edges[i][j]) { s[2*l]=i; s[2*l+1]=j; ++l; max1[0]++; } } } for(int k =0;k<max1[0];k++){ if(s[2*k]==s[2*k+2]){ if(s[2*k+1]>s[2*k+3]){ temp1=s[2*k+1]; s[2*k+1]=s[2*k+3]; s[2*k+3]=temp1; } } } for(int k=0;k<max1[0];k++){ cout<<s[2*k]<<"->"<<s[2*k+1]<<endl; } } }
个人体会:
经过本次数据结构实验,我对kmp算法,二叉树的构造,关键路径,狄杰斯特拉原理有了更深刻的理解,也充分意识到自己基础的不足和编程思维的薄弱。能完成这次实验很大一部分是参考csdn和博客园的资料,以及同学的指导。虽然我自己不太会写,但是在思考和借鉴别人的代码里,我理解了思路,并且写上了自己的注释,加了自己的东西进去。数据结构是一门比较复杂的课程,里面讲了很多经典的算法,这次的小学期让我明白,光是会复制粘贴是没有用的,代码需要自己的思路。在今后的学习里,我会多刷编程题,培养自己的算法思维,去更好地理解数组,二叉树,指针等。学好算法是学好编程的关键,感谢这次数据结构小学期,我收获良多。