dfs和bfs

来源:互联网 发布:华讯网络好吗 编辑:程序博客网 时间:2024/05/21 10:49



广搜和深搜的区别(转)

一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是"搜到就是最优解", 而深搜用于找多个解或者是"步数已知(好比3步就必需达到前提)"的标题,它的空间效率高,然则找到的不必定是最优解,必需记实并完成全数搜索,故一般情况下,深搜需要很是高效的剪枝(优化).

像搜索最短路径这些的很显著若是用广搜,因为广搜的特征就是一层一层往下搜的,保证当前搜到的都是最优解,当然,最短路径只是一方面的操作,像什么起码状态转换也是可以操作的。
深搜就是优先搜索一棵子树,然后是另一棵,它和广搜对比,有着内存需要相对较少的所长,八皇后标题就是典范楷模的操作,这类标题很显著是不能用广搜往解决的。或者像图论里面的找圈的算法,数的前序中序后序遍历等,都是深搜

深搜和广搜的分歧之处是在于搜索次序的分歧。

深搜的实现近似于栈,每次选择栈顶元素往扩年夜,

广搜则是操作了队列,先被扩年夜的的节点优先拿往扩年夜。

搜索树的形态:深搜层数良多,广搜则是很宽。

深搜合适找出所有方案,广搜则用来找出最佳方案

深搜和广搜的分歧:

深搜并不能保证第一次碰着方针点就是最短路径,是以要搜索所有可能的路径,是以要回溯,标识表记标帜做了之后还要打消失踪,是以统一个点可能被访谒良多良多次。而广搜因为它的由近及远的结点扩年夜次序,结点老是以最短路径被访谒。一个结点假如第二次被访谒,第二次的路径确定不会比第一次的短,是以就没有需要再从这个结点向周围扩年夜――第一次访谒这个结点的时辰已经扩年夜过了,第二次再扩年夜只会获得更差的解。是以做过的标识表记标帜不必往失踪。是以统一个点至多只可能被访谒一次。每访谒一个结点,与它相连的边就被搜检一次。是以最坏情况下,所有边都被搜检一次,是以时刻复杂度为O(E)


我的理解:

    一.深度优先搜索的特点是:

    1.深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设计比较好。

  2.不一定会得到最优解,这个时候需要修改原算法:把原输出过程的地方改为记录过程,即记录达到当前目标的路径和相应的路程值,并与前面已记录的值进行比较,保留其中最优的,等全部搜索完成后,才把保留的最优解输出。

 

   二.广度优先搜索法的显著特点是:

 1.在产生新的子结点时,深度越小的结点越先得到扩展,即先产生它的子结点。为使算法便于实现,存放结点的数据库一般用队列的结构。

 2.广度优先搜索算法,一般需要存储产生的所有结点,占的存储空间要比深度优先大得多,因此平时我们需要考虑溢出和节省内存空间得问题。


         DFS与BFS的PPT讲解:http://wenku.baidu.com/link?url=uuVluDfJP-gW6FiV0F8J4s4VuEOU__uqW1nFjuOO-id9ntGdqXLLvwDN0eR3akZMKP_iBmA0xPGAE-SOwdWyN21HJoXrHbd7cvSx2zRkZBa

 

dfs()
{
    if()   return;//判断条件  不满足时输出  一般的第一个为判断是否越界  后面的看题可以把剪枝那部分放在这里(其实就是提前判断,优化代码)
    else
    {
     a[i][j]=1;  dfs(x+1,y)......; ;a[i][j]=0;//把每次所在位置都标记为1,想其他方面遍历之后,所在位置就发生变化  所以把标记更新  //为什么标记 可以看看PPT 
    }
}

bfs一般应该是有时间,步数,或者其他的限制  一般使用队列,结构体数组也行  栈和队列在搜索中应用多一些  关于bfs可以看看《啊哈,算法》  里面是用的迷宫问题  

关于剪枝,主要的剪枝条件有:
1、剩余可走区域小于时间
2、奇偶性剪枝
3、超时等




0 0