zoukankan      html  css  js  c++  java
  • 【説明する】深度优先及宽度优先算法比较

    吃透算法,搞清原理,终有所得

    深度优先及宽度优先算法比较

    预备知识:

    人工智能问题广义地说,都可以看作是一个问题求解过程,因此问题求解是人工智能的核心问题,它通常是通过在某个可能的解答空间中寻找一个解来进行的。在问题求解过程中,人们所面临的大多数现实问题往往没有确定性的算法,通常需要用搜索算法来解决。目标和达到目标的一组方法称为问题,搜索就是研究这些方法能够做什么的过程。问题求解一般需要考虑两个基本问题:首先是使用合适的状态空间表示问题,其次是测试该状态空间中目标状态是否出现。

            搜索包括两个方面:

    --- 找到从初始事实到问题最终答案的一条推理路径

    --- 找到的这条路径在时间和空间上复杂度最小

            搜索包括两大类:

    一般的搜索算法采用无信息指导的搜索策略(盲目搜索),如深度优先搜索(DFS)和宽度优先搜索(BFS),还有一些搜索算法采用了启发式信息指导的搜索策略,如A*算法。

    深度优先算法:

    Procedure Depth First Search

      Begin

         1.把初始节点压入栈(后进先出),并设置栈顶指针;

         2.While 栈不空do

            Begin

             弹出栈顶元素;

             If 栈顶元素=goal,成功返回并结束;

                Else 以任意次序把栈顶元素的子女压入栈中;

         End While

     End

    宽度优先算法:

    Procedure Breath-first-search

      Begin

    1.把初始节点放入队列(先进先出);

    2.Repeat

       取得队列最前面的元素为current;

       If current=goal

         成功返回并结束;

       Else do

         Begin

           如果current有子女,把current的子女

           以任意次序添加到队列的尾部;

         End

       Until 队列为空

    End.

    例题.

    八数码难题:

    解决八数码问题的两种搜索策略:

    假设初始状态和目标状态分别是:

               

    深度优先搜索:

     

    可见,深度优先搜索,在设定深度界限为4层的前提下,要到达目标,最快需要14步。

    宽度优先搜索:

     

    可见,宽度优先搜索,要达到目标,最快需要16步。

    两种策略的比较:

    (一)复杂度

    深度优先搜索:

      时间复杂度O(bm): 如果 md大很多则比较严重

      空间复杂度O(bm), 线性空间

    宽度优先搜索:

      时间复杂度1+b+b2+b3+… +bd + b(bd-1) = O(bd+1)

      空间复杂度O(bd+1)

    空间是大问题(和时间相比)

    也就是说,宽度优先搜索的优势在于当问题有解时,一定能找到解,当问题为单位耗散值,且当问题有解时,一定能找到最优解。

    在进行宽度优先搜索时需要创建一个队列以保存所有的待扩展节点,而不是像深度优先搜索那样只需要保存当前状态即可,这样就使BFS比DFS需要占用更多的空间,常常是指数级增长的,但由于BFS是按层次遍历的,一般来说能比DFS更快地找到解,因为它找到的第一个可行解一般来说都是最优解,而无需像DFS那样为了找到最优解而进行回溯,尽管如此,宽度优先还是很容易扩展那些没有用的节点,因此很容易造成状态的指数增长,甚至“组合爆炸”。

    (二)优缺点

    深度优先搜索:

      缺点:

        如果目标节点不在搜索所进入的分支上,而该分支又是一个无穷分支,则就得不到解.因此该算法是不完备的。

      优点:

        如果目标节点不在搜索所进入的分支上,则可以较快地得到解。

    宽度优先搜索:

      缺点:

        当目标节点距离初始节点较远时会产生许多无用的节点,搜索效率低。

      优点:

        只要问题有解,则总可以得到解,而且是最短路径的解。

    orz http://zhiluoxuepiao.blog.163.com/blog/static/171866065201162010423600/

    End.

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    FastDFS搭建
    关于nginx性能优化CPU参数worker_cpu_affinity使用说明
    LNMP一键安装升级nginx及php常用设置 SFTP管理指南
    Nginx的防盗链
    Nginx+PHP 配置漏洞:静态文件都可以当作 PHP 解析
    Nginx技巧:灵活的server_name
    数据库分表时OR Mapping方法
    nginx配置多域名反向代理
    nginx server 实时监控
    转:SQL Server 2005数据库分表实例
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6814284.html
Copyright © 2011-2022 走看看