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制作静态网站的模板框架(三)
Oct 09 PHP
php结合表单实现一些简单功能的例子
Jun 04 PHP
PHP程序员基本要求和必备技能
May 09 PHP
网站防止被刷票的一些思路与方法
Jan 08 PHP
10个php函数实用却不常见
Oct 13 PHP
thinkPHP中验证码的简单使用方法
Dec 26 PHP
centos 7.2下搭建LNMP环境教程
Nov 20 PHP
php中的抽象方法和抽象类
Feb 14 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
Jul 10 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 PHP
laravel Validator ajax返回错误信息的方法
Sep 29 PHP
laravel admin实现分类树/模型树的示例代码
Jun 10 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 getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
php数组(array)输出的三种形式详解
2013/06/05 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
通过javascript设置css属性的代码
2009/12/28 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
MVVM框架下实现分页功能示例
2018/06/14 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
vue使用nprogress实现进度条
2019/12/09 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
提升Python程序运行效率的6个方法
2015/03/31 Python
遗传算法python版
2018/03/19 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
python函数不定长参数使用方法解析
2019/12/14 Python
使用Python操作ArangoDB的方法步骤
2020/02/02 Python
Python如何转换字符串大小写
2020/06/04 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
优秀毕业生推荐信
2013/11/02 职场文书
化妆品促销活动总结
2015/05/07 职场文书
教师继续教育反思周记
2015/06/25 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server