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 相关文章推荐
Email+URL的判断和自动转换函数
Oct 09 PHP
php生成SessionID和图片校验码的思路和实现代码
Mar 10 PHP
一步一步学习PHP(8) php 数组
Mar 05 PHP
php jquery 多文件上传简单实例
Dec 23 PHP
php计算当前程序执行时间示例
Apr 24 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 PHP
如何正确配置Nginx + PHP
Jul 15 PHP
php redis实现对200w用户的即时推送
Mar 04 PHP
PHP回调函数与匿名函数实例详解
Aug 16 PHP
PHP递归算法的简单实例
Feb 28 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 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
Zend引擎的发展 [15]
2006/10/09 PHP
杏林同学录(二)
2006/10/09 PHP
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
微信、QQ、微博、Safari中使用js唤起App
2018/01/24 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
Python with的用法
2014/08/22 Python
Python使用django搭建web开发环境
2017/06/09 Python
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
python多线程抽象编程模型详解
2019/03/20 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
python实现简单成绩录入系统
2019/09/19 Python
Tensorflow 多线程设置方式
2020/02/06 Python
美国围栏公司:Walpole Outdoors
2019/11/19 全球购物
Linden Leaves官网:新西兰纯净护肤品
2020/12/20 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
大学生社会实践自我鉴定
2014/03/24 职场文书
大学生学年个人总结
2015/02/15 职场文书
微信小程序调用python模型
2022/04/21 Python
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android
SQL Server删除表中的重复数据
2022/05/25 SQL Server