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程序--记数器
Oct 09 PHP
PHP实现MySQL更新记录的代码
Jun 07 PHP
PHP 模拟$_PUT实现代码
Mar 15 PHP
10个可以简化php开发过程的MySQL工具
Apr 11 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
Aug 31 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
php简单统计字符串单词数量的方法
Jun 19 PHP
PHP获取二维数组中某一列的值集合
Dec 25 PHP
PHP实现添加购物车功能
Mar 06 PHP
php通过pecl方式安装扩展的实例讲解
Feb 02 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
Dec 12 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
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
jquery.validate的使用说明介绍
2013/11/12 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
2015/12/26 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
微信小程序点击生成朋友圈分享图(遇到的坑)
2020/06/17 Javascript
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
Python中有几个关键字
2020/06/04 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
python中字符串的编码与解码详析
2020/12/03 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
彪马英国官网:PUMA英国
2019/02/11 全球购物
应用服务器有那些
2012/01/19 面试题
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
英语教师岗位职责
2014/03/16 职场文书
生物科学专业自荐书
2014/06/20 职场文书
工作作风承诺书
2014/08/30 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
晚会开幕词
2015/01/28 职场文书
光荣之路观后感
2015/06/12 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书