本周总结(数据结构小学期)

一:做的事情:完成了数据结构小学期第一阶段实验和初步了解大数据技术

二:遇到的问题: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和博客园的资料,以及同学的指导。虽然我自己不太会写,但是在思考和借鉴别人的代码里,我理解了思路,并且写上了自己的注释,加了自己的东西进去。数据结构是一门比较复杂的课程,里面讲了很多经典的算法,这次的小学期让我明白,光是会复制粘贴是没有用的,代码需要自己的思路。在今后的学习里,我会多刷编程题,培养自己的算法思维,去更好地理解数组,二叉树,指针等。学好算法是学好编程的关键,感谢这次数据结构小学期,我收获良多。

posted @ 2022-07-09 17:07  Lindseyyip  阅读(51)  评论(0编辑  收藏  举报