代码改变世界

大一二学期 1-2 周 笔记 _____专题 搜索

2012-03-11 22:14  java环境变量  阅读(229)  评论(0)    收藏  举报
 

                   大一二学期 1-2 周 笔记
     这两周ACM专题是搜索。还是有点收获的,理解了队列和栈,对于DFS和BFS也理解了些。 一共14道题,完成了10道。 小张 全部做完了 ,确实还是很厉害的。以后一个队伍,不能给队伍拖后腿,下个专题 hash 和 二分查找,计划花多一点时间和精力到这上面。 彪哥说其实区域赛拿个奖也不是很难,从现在开始 坚持到大二,或者大三。既然下定了决心 ,就必须出成绩! 因为ACM将花掉我大学两到三年的绝大部分空闲时间,投入是很大的.
     这两周有一个问题,就是玩游戏的时间过多, 那样很浪费时间。  公共课程不能落下了。 现在的社会现实就是这样: 一个人的发展潜力还是取决于综合能力。 抱怨企业用学历卡人也没用。换个角度想想:如果自己是老板,前面一群研究生,985 211 在那,为什么要来先看你!     以前想的就是把专业学牛一点,其他课程随便。自己了解的东西多一点了,也就放弃了那种想法。   自己想想 ,逃了的课,都用于专业的学习了吗? 很多时候还不是玩游戏,睡觉。    现在的想法是 公共课程必须跟上,考研相关的课程学好。其他时间花在ACM上。    不要以没有太多时间搞专业来当借口,想想被自己因为其他原因浪费掉的时间。
     英语是现在最大的问题,英语对于以后的发展很重要! 但现在自己坚持每天学英语却好像这么难。  总是忘记学习英语,根本就没得学英语的习惯!  英语没办法逃避,必须跨过这道坎。
     唉,现在回想小时候老妈和老师们反复强调的学习习惯,小时候以为养成一个好的学习习惯就是期末考能考好点。。。现在发现,小小的学习习惯四个字,很大程度影响了一个人一生的发展。

                     search 学习报告
     search 的两种基本算法, DFS 和BFS                                DFS (深搜)  主要是通过函数的递归调用,一步一步深入搜索。  DFS优先深入搜索。学到了回溯的思想,回溯就是边搜索边判断,如果判断失败,即没有必要继续深入搜索,那就不深入这条路径搜索。 关键就是每到一个节点 都判断。  DFS 如果不剪枝,效率是很低的,所以进一步的学习就是剪枝。
     BFS (宽搜)  宽搜的基础就是队列,宽搜是通过队列实现的,我是到第一周末才终于知道队列和栈是个什么东西 - - 。 寒假就开始接触队列和栈,基本特征也都懂,但就是不明白怎么实现队列和栈。 后来通过一道宽搜的题终于明白了队列,队列和栈就是一种数据结构,队列先进先出,栈后进先出。 队列和栈可以通过一个数组来实现。也可以直接利用 C++ STL
中的 queue 和 stack  实现。 下面写点队列的关键语句为例。
对列: int queue[20];  
       int front=0 ,rear=0,num;
       while(front<rear)  //队列非空
       queue[rear++]=1;   //进队
       num=queue[front++];  //先入的先出队
如果是用c++的STL  更简单:
       #include<queue>  //队列头文件
       queue<int > q;  //定义队列
       num=q.front();   //前面的元素出队
       q.pop();        //删除前面的元素
       q.push(1);      //数字1 入队
       while(!q.empty())   // 队列非空
栈同样可以通过一个数组或c++的STL实现。
     宽搜就是层次遍历。是一层一层的搜索,从起点开始扩展。每深入下一层,都需要记住 父节点,如果需要打印路径 则记录来的方向。 最后搜索到终点后,只要一步一步通过父节点就可以回到起点,这个过程就可以统计步数和打印路径。   
      举个例子。
            1
           / \
          2   3
         / \ / \
        4   5   6
          ......
如果是从1开始搜索,终点是5 
 DFS的搜索路径是 1 2 4 2 5
  BFS的路线是     1 2 3 4 5     同时 记下 2的父节点是1,4和5的父节点是2  。
    当然,要搞懂学深只能是靠题。