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

