PHP实现广度优先搜索算法(BFS,Broad First Search)详解


Posted in PHP onSeptember 16, 2017

本文实例讲述了PHP实现广度优先搜索算法。分享给大家供大家参考,具体如下:

广度优先搜索的算法思想 Breadth-FirstTraversal

广度优先遍历是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名。

广度优先搜索遍历类似于树的按层次遍历。对于无向连通图,广度优先搜索是从图的某个顶点v0出发,在访问v0之后,依次搜索访问v0的各个未被访问过的邻接点w1,w2,…。然后顺序搜索访问w1的各未被访问过的邻接点,w2的各未被访问过的邻接点,…。即从v0开始,由近至远,按层次依次访问与v0有路径相通且路径长度分别为1,2,…的顶点,直至连通图中所有顶点都被访问一次。

只要按一定的次序访问各层顶点,方便程序实现,广度优先搜索的整体层次顺序一定,各层访问顺序不是唯一的。

具体描述如下:

设图G的初态是所有顶点均未访问,在G 中任选一顶点i作为初始点,则广度优先搜索的基本思想是:

(1)从图中的某个顶点V出发访问并记录。
(2)依次访问V的所有邻接顶点;
(3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到。
(4)第(3)步。

依此类推,直到图中所有顶点都被访问完为止 。

广度优先搜索在搜索访问一层时,需要记住已被访问的顶点,以便在访问下层顶点时,从已被访问的顶点出发搜索访问其邻接点。所以在广度优先搜索中需要设置一个队列Queue,使已被访问的顶点顺序由队尾进入队列。在搜索访问下层顶点时,先从队首取出一个已被访问的上层顶点,再从该顶点出发搜索访问它的各个邻接点。

SearchInterface.php:

<?php
abstract class SearchInterface
{
  protected $G;//图
  protected $s;//图的首节点
  function __construct($_G,$_s){$this->G = $_G;$this->s = $_s;}
  public abstract function search();
}
?>

bfs.php:

<?php
include_once('SearchInterface.php');
class bfs extends SearchInterface
{
  private $d = array();//源点s和顶点u之间的距离
  private $tt = array();//结点u的父母存于变量
  private $visit = array();//已访问节点
  function __construct($_G,$_s)
  {
    parent::__construct($_G,$_s);
    //初始化$d/$tt,初始值为无穷大/NULL
    for($i=0;$i<9;$i++)
    {
      $this->d[$i] = 20000;
      $this->tt[$i] = NULL;
      $this->visit[$i] = 0;
    }
  }
  public function search()
  {
    //访问所有节点
    $queue = array();
    for($i=0;$i<9;$i++)
    {
      if($this->visit[$i]==0)
      {
        array_push($queue,$i);
        while(!empty($queue))
        {
          $_s = array_shift($queue);
          $this->visit[$_s] = 1;
          echo ($_s+1).'<br>';
          $link_s = $this->G->get_links($_s);
          //获取和s直接相连的顶点u
          foreach($link_s as $j => $u)
          {
            if($this->visit[$u]==0)
            {
              array_push($queue,$u);
              $this->visit[$u] = 2;
            }
          }
        }
      }
    }
  }
}
?>

使用方法:

$G = new Graphic;
$search = new bfs($G,1);
$search->search();

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 中关于ord($str)&amp;gt;0x80的详细说明
Sep 23 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 PHP
PHP浮点数精度问题汇总
May 13 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
Nov 23 PHP
PHP与服务器文件系统的简单交互
Oct 21 PHP
php注册和登录界面的实现案例(推荐)
Oct 24 PHP
php注册审核重点解析(数据访问)
May 23 PHP
PHP让数组中有相同值的组成新的数组实例
Dec 31 PHP
PHP7下协程的实现方法详解
Dec 17 PHP
PHP以json或xml格式返回请求数据的方法
May 31 PHP
php+mysql开发中的经验与常识小结
Mar 25 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 #PHP
PHP环形链表实现方法示例
Sep 15 #PHP
PHP实现的链式队列结构示例
Sep 15 #PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 #PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 #PHP
visual studio code 调试php方法(图文详解)
Sep 15 #PHP
PHP简单实现模拟登陆功能示例
Sep 15 #PHP
You might like
说明的比较细的php 正则学习实例
2008/07/30 PHP
ThinkPHP采用模块和操作分析
2011/04/18 PHP
关于php mvc开发模式的感想
2011/06/28 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
详解PHP swoole process的使用方法
2017/08/26 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
2016/12/18 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
Python实现对特定列表进行从小到大排序操作示例
2019/02/11 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
临床医学大学生求职信
2013/09/28 职场文书
会计岗位职责
2013/11/08 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
服装店营销方案
2014/03/10 职场文书
教师年度考核个人总结
2015/02/12 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
计划生育工作总结2015
2015/04/03 职场文书
2015年化验员工作总结
2015/04/10 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
新年晚会开场白
2015/05/29 职场文书
网吧员工管理制度
2015/08/05 职场文书