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和js交互一例-PHP教程,PHP应用
Jan 03 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
Sep 08 PHP
php生成xml简单实例代码
Dec 16 PHP
从手册去理解分析PHP session机制
Jul 17 PHP
PHP中static关键字原理的学习研究分析
Jul 18 PHP
php FLEA中二叉树数组的遍历输出
Sep 26 PHP
浅析PHP递归函数返回值使用方法
Feb 18 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
PHP框架Laravel插件Pagination实现自定义分页
Apr 22 PHP
php分页原理 分页代码 分页类制作教程
Sep 23 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
Oct 14 PHP
php的命名空间与自动加载实现方法
Aug 25 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 读取文件乱码问题
2010/02/20 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
2016/11/08 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
jquery对dom的操作常用方法整理
2013/06/25 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
python复制文件代码实现
2013/12/23 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
Python类的继承、多态及获取对象信息操作详解
2019/02/28 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
家长会演讲稿范文
2014/01/10 职场文书
大学军训感言1500字
2014/03/09 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
网页美工求职信范文
2014/04/17 职场文书
家长学校工作方案
2014/05/07 职场文书
厂区绿化方案
2014/05/08 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
远程教育学习心得体会
2016/01/23 职场文书