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 相关文章推荐
再次研究下cache_lite
Feb 14 PHP
PHP base64+gzinflate压缩编码和解码代码
Oct 03 PHP
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
Mar 13 PHP
php pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
Jun 21 PHP
PHP把小数转成整数3种方法
Jun 30 PHP
php在linux下检测mysql同步状态的方法
Jan 15 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
PHP常见过waf webshell以及最简单的检测方法
May 21 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 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作为Shell脚本语言使用
2006/10/09 PHP
腾讯QQ php程序员面试题目整理
2010/06/08 PHP
php 不使用js实现页面跳转
2014/02/11 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
js获取控件位置以及不同浏览器中的差别介绍
2013/08/08 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
详解Bootstrap各式各样的按钮(推荐)
2016/12/13 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
Python 私有函数的实例详解
2017/09/11 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
python实现海螺图片的方法示例
2019/05/12 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
2020/02/26 Python
通过实例解析Python return运行原理
2020/03/04 Python
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
祖国在我心中演讲稿
2014/01/15 职场文书
心得体会的写法
2014/09/05 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
大学生支教感言
2015/08/01 职场文书
PHP使用QR Code生成二维码实例
2021/07/07 PHP