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 相关文章推荐
留言板翻页的实现详解
Oct 09 PHP
PHP企业级应用之常见缓存技术篇
Jan 27 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
Feb 21 PHP
PHP之短标签开启设置
Jun 17 PHP
php无限遍历目录示例
Feb 21 PHP
codeigniter中测试通过的分页类示例
Apr 17 PHP
thinkphp缓存技术详解
Dec 09 PHP
php模拟登陆的实现方法分析
Jan 09 PHP
php判断输入是否是纯数字,英文,汉字的方法
Mar 05 PHP
JSON字符串传到后台PHP处理问题的解决方法
Jun 05 PHP
php fseek函数读取大文件两种方法
Oct 12 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
Oct 30 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实现paypal 授权登录
2015/05/28 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
PHP实现倒计时功能
2020/11/16 PHP
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
JS实现设置ff与ie元素绝对位置的方法
2016/03/08 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
Python映射拆分操作符用法实例
2015/05/19 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
学校门卫岗位职责范本
2014/06/30 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
windows server2008 开启端口的实现方法
2022/06/25 Servers