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网页后退不再出现过期
Mar 08 PHP
解析如何屏蔽php中的phpinfo()函数
Jun 06 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
php+mysql实现数据库随机重排实例
Oct 17 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
phpcms的分类名称和类别名称的调用
Jan 05 PHP
PHP中overload与override的区别
Feb 13 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
php操作mongodb封装类与用法实例
Sep 01 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 PHP
php png失真的原因及解决办法
Nov 17 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
redis 队列操作的例子(php)
2012/04/12 PHP
php实现分页工具类分享
2014/01/09 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
Python中str.format()详解
2017/03/12 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
Python中如何添加自定义模块
2020/06/09 Python
深入理解Python变量的数据类型和存储
2021/02/01 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
台湾家适得:Homeget
2019/02/11 全球购物
九年级英语教学反思
2014/01/31 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
2014年设计师工作总结
2014/11/25 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
使用tensorflow 实现反向传播求导
2021/05/26 Python