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 增加了对 .ZIP 文件的读取功能
Oct 09 PHP
简单的页面缓冲技术
Oct 09 PHP
来自phpguru得Php Cache类源码
Apr 15 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
May 15 PHP
关于php循环跳出的问题
Jul 01 PHP
浅析php与数据库代码开发规范
Aug 08 PHP
Smarty使用自定义资源的方法
Aug 08 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
Jul 31 PHP
laravel框架中间件简单使用方法示例
Jan 25 PHP
PHP判断是否是json字符串
Apr 01 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和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
Javascript 面向对象 重载
2010/05/13 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
小程序实现图片预览裁剪插件
2019/11/22 Javascript
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
详解python3中的真值测试
2018/08/13 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
Python 使用office365邮箱的示例
2020/10/29 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
html5定制表单_动力节点Java学院整理
2017/07/11 HTML / CSS
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
Android面试宝典
2013/08/06 面试题
delegate与普通函数的区别
2014/01/22 面试题
党员的自我评价范文
2014/01/02 职场文书
大学拉赞助协议书范文
2014/09/26 职场文书
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android
Golang流模式之grpc的四种数据流
2022/04/13 Golang