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 相关文章推荐
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
Mar 13 PHP
让PHP以ROOT权限执行系统命令的方法
Feb 10 PHP
PHP 生成N个不重复的随机数
Jan 21 PHP
php面向对象中static静态属性和静态方法的调用
Feb 08 PHP
php插入含有特殊符号数据的处理方法
Nov 24 PHP
PHP 信号管理知识整理汇总
Feb 19 PHP
ThinkPHP中调用PHPExcel的实现代码
Apr 08 PHP
PHP微信模板消息操作示例
Jun 29 PHP
针对PHP开发安全问题的相关总结
Mar 22 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
Yii 框架控制器创建使用及控制器响应操作示例
Oct 14 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 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中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
客户端静态页面玩分页
2006/06/26 Javascript
图片格式的JavaScript和CSS速查手册
2007/08/20 Javascript
prototype 学习笔记整理
2009/07/17 Javascript
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
python 以16进制打印输出的方法
2018/07/09 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
python zip,lambda,map函数代码实例
2020/04/04 Python
python中判断文件结束符的具体方法
2020/08/04 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
什么是Assembly(程序集)
2014/09/14 面试题
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
数控技术专业毕业自荐书范文
2014/02/05 职场文书
有关爱国演讲稿
2014/05/07 职场文书
学校春季防火方案
2014/06/08 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers