PHP實現(xiàn)廣度優(yōu)先搜索算法(BFS,Broad First Search)詳解
本文實例講述了PHP實現(xiàn)廣度優(yōu)先搜索算法。分享給大家供大家參考,具體如下:
廣度優(yōu)先搜索的算法思想 Breadth-FirstTraversal
廣度優(yōu)先遍歷是連通圖的一種遍歷策略。因為它的思想是從一個頂點V0開始,輻射狀地優(yōu)先遍歷其周圍較廣的區(qū)域,故得名。
廣度優(yōu)先搜索遍歷類似于樹的按層次遍歷。對于無向連通圖,廣度優(yōu)先搜索是從圖的某個頂點v0出發(fā),在訪問v0之后,依次搜索訪問v0的各個未被訪問過的鄰接點w1,w2,…。然后順序搜索訪問w1的各未被訪問過的鄰接點,w2的各未被訪問過的鄰接點,…。即從v0開始,由近至遠,按層次依次訪問與v0有路徑相通且路徑長度分別為1,2,…的頂點,直至連通圖中所有頂點都被訪問一次。
只要按一定的次序訪問各層頂點,方便程序?qū)崿F(xiàn),廣度優(yōu)先搜索的整體層次順序一定,各層訪問順序不是唯一的。
具體描述如下:
設(shè)圖G的初態(tài)是所有頂點均未訪問,在G 中任選一頂點i作為初始點,則廣度優(yōu)先搜索的基本思想是:
(1)從圖中的某個頂點V出發(fā)訪問并記錄。
(2)依次訪問V的所有鄰接頂點;
(3)分別從這些鄰接點出發(fā),依次訪問它們的未被訪問過的鄰接點,直到圖中所有已被訪問過的頂點的鄰接點都被訪問到。
(4)第(3)步。
依此類推,直到圖中所有頂點都被訪問完為止 。
廣度優(yōu)先搜索在搜索訪問一層時,需要記住已被訪問的頂點,以便在訪問下層頂點時,從已被訪問的頂點出發(fā)搜索訪問其鄰接點。所以在廣度優(yōu)先搜索中需要設(shè)置一個隊列Queue,使已被訪問的頂點順序由隊尾進入隊列。在搜索訪問下層頂點時,先從隊首取出一個已被訪問的上層頂點,再從該頂點出發(fā)搜索訪問它的各個鄰接點。
SearchInterface.php:
<?php
abstract class SearchInterface
{
protected $G;//圖
protected $s;//圖的首節(jié)點
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();//結(jié)點u的父母存于變量
private $visit = array();//已訪問節(jié)點
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()
{
//訪問所有節(jié)點
$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();
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《PHP基本語法入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php字符串(string)用法總結(jié)》及《php查找技巧與方法總結(jié)》
希望本文所述對大家PHP程序設(shè)計有所幫助。
- php 大數(shù)據(jù)量及海量數(shù)據(jù)處理算法總結(jié)
- php中最簡單的字符串匹配算法
- PHP經(jīng)典算法集錦【經(jīng)典收藏】
- 關(guān)于PHP遞歸算法和應(yīng)用方法介紹
- PHP面試常用算法(推薦)
- php經(jīng)典算法集錦
- PHP常用算法和數(shù)據(jù)結(jié)構(gòu)示例(必看篇)
- php使用高斯算法實現(xiàn)圖片的模糊處理功能示例
- php實現(xiàn)的常見排序算法匯總
- PHP實現(xiàn)深度優(yōu)先搜索算法(DFS,Depth First Search)詳解
- 基于PHP實現(xiàn)的多元線性回歸模擬曲線算法
相關(guān)文章
PHP Global變量定義當(dāng)前頁面的全局變量實現(xiàn)探討
我們在這篇文章中就針對PHP Global變量出現(xiàn)的問題給出了一些具體的解決辦法,感興趣的朋友可以參考下哈2013-06-06
PHP 解決utf-8和gb2312編碼轉(zhuǎn)換問題
就一個很簡單的函數(shù)iconv();但是就是這個函數(shù)在網(wǎng)上找了很多例子,都無法成功轉(zhuǎn)換,這是為什么呢?2010-03-03
php實現(xiàn)替換手機號中間數(shù)字為*號及隱藏IP最后幾位的方法
這篇文章主要介紹了php實現(xiàn)替換手機號中間數(shù)字為*號及隱藏IP最后幾位的方法,涉及php字符串替換與正則操作的相關(guān)技巧,需要的朋友可以參考下2016-11-11
[企業(yè)公眾號]升級到[企業(yè)微信]之后發(fā)送消息失敗的解決方法
這篇文章主要介紹了[企業(yè)公眾號]升級到[企業(yè)微信]之后發(fā)送消息失敗的解決方法,涉及微信接口的修改相關(guān)操作,需要的朋友可以參考下2017-06-06

