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的ob_start来生成静态页面的方法分析
Mar 09 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
PHP获取数组最后一个值的2种方法
Jan 21 PHP
PHP中大于2038年时间戳的问题处理方案
Mar 03 PHP
php计算title标题相似比的方法
Jul 29 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
php操作mongodb封装类与用法实例
Sep 01 PHP
PHP设计模式(观察者模式)
Jul 07 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 strtotime 函数UNIX时间戳
2009/01/14 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
pandas中去除指定字符的实例
2018/05/18 Python
Python基于百度云文字识别API
2018/12/13 Python
python添加菜单图文讲解
2019/06/04 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
python实现多线程端口扫描
2019/08/31 Python
python 异步async库的使用说明
2020/05/04 Python
教师求职推荐信范文
2013/11/20 职场文书
红旗团支部事迹材料
2014/01/27 职场文书
毕业留言寄语大全
2014/04/10 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
五好家庭申报材料
2014/12/20 职场文书
2016公司年会通知范文
2015/04/25 职场文书
常住证明范本
2015/06/23 职场文书
导游词之台湾安平古堡
2019/12/25 职场文书
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis
「天才王子的赤字国家重生术」妮妮姆·拉雷粘土人开订
2022/03/21 日漫
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers