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 相关文章推荐
xml+php动态载入与分页
Oct 09 PHP
PHP4与PHP5的时间格式问题
Feb 17 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
Array of country list in PHP with Zend Framework
Oct 17 PHP
php实现邮件发送并带有附件
Jan 24 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 PHP
图解找出PHP配置文件php.ini的路径的方法
Aug 20 PHP
2款PHP无限级分类实例代码
Nov 11 PHP
PHP简单的MVC框架实现方法
Dec 01 PHP
Yii2表单事件之Ajax提交实现方法
May 04 PHP
php微信公众号开发之关键词回复
Oct 20 PHP
PHP7 标准库修改
Mar 09 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
php删除页面记录 同时刷新页面 删除条件用GET方式获得
2012/01/10 PHP
关于尾递归的使用详解
2013/05/02 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
浅谈javascript的原型继承
2012/07/25 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
Move.js入门
2017/02/08 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
python使用cookie库操保存cookie详解
2014/03/03 Python
Python中的urllib模块使用详解
2015/07/07 Python
Python根据区号生成手机号码的方法
2015/07/08 Python
python字典键值对的添加和遍历方法
2016/09/11 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
python读取文件名称生成list的方法
2018/04/27 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
Django重设Admin密码过程解析
2020/02/10 Python
python能做哪方面的工作
2020/06/15 Python
实习生求职自荐信
2014/02/07 职场文书
物理专业大学生职业生涯规划书
2014/02/07 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
移风易俗倡议书
2014/04/15 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle