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笔试题
Aug 04 PHP
php 多线程上下文中安全写文件实现代码
Dec 28 PHP
thinkphp使用phpmailer发送邮件的方法
Nov 24 PHP
php猜单词游戏
Sep 29 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
Mar 17 PHP
ThinkPHP3.2.1图片验证码实现方法
Aug 19 PHP
PHP会员找回密码功能的简单实现
Sep 05 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
PHP编程实现脚本异步执行的方法
Aug 09 PHP
为何说PHP引用是个坑,要慎用
Apr 02 PHP
提高Laravel应用性能方法详解
Jun 24 PHP
php模式设计之观察者模式应用实例分析
Sep 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
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
解析PHP跨站刷票的实现代码
2013/06/18 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
javascript 对象比较实现代码
2009/04/27 Javascript
用JavaScript隐藏控件的方法
2009/09/21 Javascript
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
原生js实现半透明遮罩层效果具体代码
2013/06/06 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
JS实现水平移动与垂直移动动画
2019/12/19 Javascript
tensorflow输出权重值和偏差的方法
2018/02/10 Python
通过Pandas读取大文件的实例
2018/06/07 Python
Python 转换文本编码实现解析
2019/08/27 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
Probikekit欧盟:在线公路自行车专家
2019/07/12 全球购物
心得体会范文
2014/01/04 职场文书
高一物理教学反思
2014/01/24 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
销售团队激励口号
2014/06/06 职场文书
项目投资意向书范本
2015/05/09 职场文书
小学运动会通讯稿
2015/07/18 职场文书
导游词之长城八达岭
2019/09/24 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
javascript Number 与 Math对象的介绍
2021/11/17 Javascript