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 相关文章推荐
用session做客户验证时的注意事项
Oct 09 PHP
PHP生成静态页面详解
Nov 19 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
Feb 18 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
Jun 03 PHP
使用PHP实现Mysql读写分离
Jun 28 PHP
PHP中的output_buffering详细介绍
Sep 27 PHP
DOM基础及php读取xml内容操作的方法
Jan 23 PHP
再Docker中架设完整的WordPress站点全攻略
Jul 29 PHP
PHP程序中使用adodb连接不同数据库的代码实例
Dec 19 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
Jan 08 PHP
php实现通过soap调用.Net的WebService asmx文件
Feb 27 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 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
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
ArrayList类(增强版)
2007/04/04 Javascript
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
如何使用angularJs
2017/05/08 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
Python中itertools模块用法详解
2014/09/25 Python
python图像处理之镜像实现方法
2015/05/30 Python
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
python实现redis三种cas事务操作
2017/12/19 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
python多进程读图提取特征存npy
2019/05/21 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
司法建议书范文
2014/05/13 职场文书
关于读书的活动方案
2014/08/14 职场文书
2015年超市工作总结
2015/04/09 职场文书
2015年计生协会工作总结
2015/04/24 职场文书