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 相关文章推荐
构建简单的Webmail系统
Oct 09 PHP
PHP IF ELSE简化/三元一次式的使用
Aug 22 PHP
PHP基础之运算符的使用方法
Apr 28 PHP
3款值得推荐的微信开发开源框架
Oct 28 PHP
php文件缓存类汇总
Nov 21 PHP
PHP面向对象之后期静态绑定功能介绍
May 18 PHP
PHP查看当前变量类型的方法
Jul 31 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
php短信接口代码
May 13 PHP
php中array_column函数简单实现方法
Jul 11 PHP
PHP查询大量数据内存耗尽问题的解决方法
Oct 28 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
Oct 24 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 return语句的另一个作用
2014/07/30 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
Laravel5中contracts详解
2015/03/02 PHP
php封装的smarty类完整实例
2016/10/19 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
面向对象的javascript(笔记)
2009/10/06 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
详解javascript高级定时器
2015/12/31 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
JS实现分页导航效果
2020/02/19 Javascript
JS如何生成动态列表
2020/09/22 Javascript
python进程管理工具supervisor使用实例
2014/09/17 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
python和php哪个容易学
2020/06/19 Python
Joules官网:女士、男士和儿童服装和鞋类
2018/10/23 全球购物
晚会邀请函范文
2014/01/24 职场文书
《三袋麦子》教学反思
2014/03/02 职场文书
交通事故调解协议书
2014/04/16 职场文书
公司授权委托书范文
2014/08/02 职场文书
趣味运动会广播稿
2014/09/13 职场文书
还款承诺书范本
2015/01/20 职场文书
2015夏季作息时间调整通知
2015/04/24 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
护士岗前培训心得体会
2016/01/08 职场文书