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读取javascript设置的cookies的代码
Apr 12 PHP
php 按指定元素值去除数组元素的实现方法
Nov 04 PHP
php解压文件代码实现php在线解压
Feb 13 PHP
VPS中使用LNMP安装WordPress教程
Dec 28 PHP
深入理解PHP中的Streams工具
Jul 03 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 PHP
简单的pgsql pdo php操作类实现代码
Aug 25 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
Jan 22 PHP
THINKPHP在添加数据的时候获取主键id的值方法
Apr 03 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
PHP 爬取网页的主要方法
Jul 13 PHP
PHP实现通过二维数组键值获取一维键名操作示例
Oct 11 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
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
PHP自动生成后台导航网址的最佳方法
2013/08/27 PHP
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
Vue仿今日头条实例详解
2018/02/06 Javascript
关于vue项目中搜索节流的实现代码
2019/09/17 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
用实例分析Python中method的参数传递过程
2015/04/02 Python
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
Django-Rest-Framework 权限管理源码浅析(小结)
2018/11/12 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
Pyqt5实现英文学习词典
2019/06/24 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
Europcar比利时:租车
2019/08/26 全球购物
班级德育工作实施方案
2014/02/21 职场文书
《故都的秋》教学反思
2014/04/15 职场文书