第五周总结——对搜索与sort的理解

21 篇文章 1 订阅

        这周听取了老师的建议,每天坚持看博客,截止到目前这周已阅读55篇博客,通过这个方法,感觉这一周收获不少。在这55篇博客中,有25篇关于思维的题解(主要是以Codeforces上题目为主),10篇有关STL运用的题目,15篇初涉搜索的题解,还有5篇关于广度优先搜索和深度优先搜索的理论知识。

首先,分三个方面来对这周进行总结:

1、广度优先搜索(BFS)

        BFS的基本思想在课上的PPT中已经展现的很清楚了,顾名思义就是广,先一层中进行搜索,在这一层都搜索完之后再进行下一层。学习了广度优先搜索后,广度优先搜索可以解决什么问题呢?

       类似于层级遍历,在广度优先遍历中,如果将每次“前进”或路过的(将被访问的)结点和边都记录下来,就得到一个子图,该子图为以出发点为根的树,称为广度优先生成树。针对BFS,这一周学习最多的问题就是最优解与最短路径问题,因为广度搜索遍历是一层一层的去搜索从入口到出口的遍历过程,所以在找到出口的时候,深度不一定是最深,但一定是当前最短路径(亦或是最优解),同样,走迷宫、最少操作等问题也可以用广度优先搜索解决。Set<Node> visited;

2、深度优先搜索(DFS)

      首先搜索顶点A;依次从A的未被搜索的邻点出发,对图进行深度优先遍历(沿一条路一直走到黑);直至图中和A有路径相通的顶点都被搜索;若此时图中尚有顶点未被搜索,则从一个未被搜索的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被搜索过为止。这个方式给我带来一种执着不服输的精神。

        对于深度优先搜索,可以解决迷宫问题、八数码/华容道问题、最远路径问题(不太常用)、传授问题等。因为深度优先搜索按照某种条件往前试探搜索,如果前进中遭到失败(正如遇到死胡同)则退回头另选通路继续搜索,直到找到满足条件的目标为止。

       无论是广度优先搜索还是深度优先搜索,对一个已经访问过的点如何做标记呢?学到了一个方法:可以设置一个数组,当你经过而且并不是最终结果时,把数组元素赋值为0,这样可以分辨出。或Set visited;避免走回头路。

3、sort函数

       在第三周学习STL的时候,对sort函数就有了一些了解,但在这一周参加CF的时候,发现对sort函数的运用根本不熟悉,使用sort()方法就可以只需要一条语句就可以实现排序,会缩短代码长度,更好的执行下面的语句,下面是我最初写的代码片段和最后用sort()的的代码:

最初的:

    int k;
	int max1;
	int max2;
	int q;
	int w;
	int c;
    for(k=0;k<n;k++)
{   max1=a[0];
    max2=a[0];
    for(q=0;q<n;q++)
    {if (a[q]>max1)
      max1=a[q];}
    for(w=0;w<n;w++)
    {if (a[w]<max1&&a[w]>max2)
      max2=a[w];}
    c=max1-max2;}
    if(c>=2&&n!=1)
        cout<<"NO"<<endl;
    if(c==1&&n!=1)
        cout<<"YES"<<endl;
    if(c==0&&n!=1)
        cout<<"YES"<<endl;
    if(c==0&&n==1)
    {
        if(max2==1)
        cout<<"YES"<<endl;
        if(max2!=1)
        cout<<"NO"<<endl;
    }
 
}

使用sort:解决了一长串代码的问题

 sort(a+1,a+1+n);
    c=a[n]-a[n-1];
    if(c>=2)
        cout<<"NO"<<endl;
    else cout<<"YES"<<endl;

最后总结:

        对于一些方法知识点,虽然有学习了解,但在实战中并不能熟练的应用,这说明储备的知识还不够全面,并不深刻,会出现大大小小的错误。初学深度与广度,自己写的代码还没有成功,所以这次总结没有列出,在下一周希望可以更多的练习自己写,而且是专项练习,这样在之后的综合运用中才可以得心应手。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值