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 相关文章推荐
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
php设计模式 Delegation(委托模式)
Jun 26 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
Apr 15 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
PHP 设计模式系列之 specification规格模式
Jan 10 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
Sep 09 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
laravel接管Dingo-api和默认的错误处理方式
Oct 25 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 PHP
基于php伪静态的实现方法解析
Jul 31 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
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
详解新手使用vue-router传参时注意事项
2019/06/06 Javascript
使用jQuery实现购物车
2020/10/29 jQuery
[00:18]天涯墨客三技能展示
2018/08/25 DOTA
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
基于Python和Scikit-Learn的机器学习探索
2017/10/16 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
一套带答案的C++笔试题
2014/01/10 面试题
"引用"与多态的关系
2013/02/01 面试题
离婚协议书范本样本
2014/08/19 职场文书
作风大整顿心得体会
2014/09/10 职场文书
员工家属慰问信
2015/03/24 职场文书
七年级作文之环保作文
2019/10/17 职场文书
python库sklearn常用操作
2021/08/23 Python
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang