DFS与BFS

来源:互联网 发布:网络映射如何做 编辑:程序博客网 时间:2024/05/01 12:35

从这几天通过啊哈算法,遇到的搜索中,大致总结出这几点规律:

对于DFS:可有第一个点先确定的,做一下标记,以第一个为基础进行搜索;也可有从第一个点就没确定的,先去找第一个点,如1,2,3的全排列

                   还有一个问题,有的深搜,不用把标记过的元素再取消标记,这样的大多适用于不是去穷尽所有路径,而是看看哪些点能到达的,如,再解炸弹人(实 
                   质为图的遍历),图的深度优先遍历
                   另外,BFS用队列实现很显然,其实DFS实现有时涉及栈的操作
对于BFS:都差不多,队列中先有一个元素,再进行搜索

深搜一般是定量分析,如,最短的具体路径,全排列的结果
广搜一般是定性分析,如,最短路径为多少,遍历能到达的点(深搜的做了标记不取消,一般是这个功能)


其实DFS与BFS分别起源于图的深度优先搜索与广度优先搜索



在图论中,图的广度优先搜索多用于所有边权值相同的情况




BFS与DFS的讨论:BFS:这是一种基于队列这种数据结构的搜索方式,它的特点是由每一个状态可以扩展出许多状态,然后再以此扩展,直到找到目标状态或者队列中头尾指


针相遇,即队列中所有状态都已处理完毕。
DFS:基于递归的搜索方式,它的特点是由一个状态拓展一个状态,然后不停拓展,直到找到目标或者无法继续拓展结束一个状态的递归。
         
优缺点:BFS:对于解决最短或最少问题特别有效,而且寻找深度小,但缺点是内存耗费量大(需要开大量的数组单元用来存储状态)。
        DFS:对于解决遍历和求所有问题有效,对于问题搜索深度小的时候处理速度迅速,然而在深度很大的情况下效率不高
        BFS与DFS的适用情况不绝对,由实际情况定
 
总结:不管是BFS还是DFS,它们虽然好用,但由于时间和空间的局限性,以至于它们只能解决数据量小的问题。
 
各种搜索题目归类:
 
坐标类型搜索 :这种类型的搜索题目通常来说简单的比较简单,复杂的通常在边界的处理和情况的讨论方面会比较复杂,分析这类问题,我们首先要抓住题目的意思,看具


体是怎么建立坐标系(特别重要),然后仔细分析到搜索的每一个阶段是如何通过条件转移到下一个阶段的。确定每一次递归(对于DFS)的回溯和深入条件,对于BFS,要


注意每一次入队的条件同时注意判重。要牢牢把握目标状态是一个什么状态,在什么时候结束搜索。还有,DFS过程的参数如何设定,是带参数还是不带参数,带的话各个参


数一定要保证能完全的表示一个状态,不会出现一个状态对应多个参数,而这一点对于BFS来说就稍简单些,只需要多设置些变量就可以了。
              经典题目:细胞(NDK1435)、Tyvj:乳草的入侵、武士风度的牛
 
数值类型搜索:(虽然我也不知道该怎么叫,就起这个名字吧),这种类型的搜索就需要仔细分析分析了,一般来说采用DFS,而且它的终止条件一般都是很明显的,难就难


在对于过程的把握,过程的把握类似于坐标类型的搜索(判重、深入、枚举),注意这种类型的搜索通常还要用到剪枝优化,对于那些明显不符合要求的特殊状态我们一定


要在之前就去掉它,否则它会像滚雪球一样越滚越大,浪费我们的时间。
              经典题目:Tyvj:派对;售货员的难题,以及各种有关题目

2 0