- 相關(guān)推薦
php算法學(xué)習之寬度優(yōu)先搜索
寬度優(yōu)先搜索又稱(chēng)廣度優(yōu)先搜索,簡(jiǎn)稱(chēng)bfs。下面小編為大家整理了php算法學(xué)習之寬度優(yōu)先搜索,希望能幫到大家!

搜索的方式是:從一個(gè)點(diǎn)開(kāi)始,逐層的遍歷訪(fǎng)問(wèn)周?chē)狞c(diǎn)。比如有一個(gè)5*5的矩陣,每次可以訪(fǎng)問(wèn)某個(gè)點(diǎn)周?chē)邪藗(gè)點(diǎn),則如果從中心點(diǎn)開(kāi)始寬度搜索,只需兩層即可遍歷完整個(gè)矩陣。
寬度搜索可用于對樹(shù)、圖、矩陣等進(jìn)行搜索,適合用于求最短路徑等問(wèn)題。
算法關(guān)鍵詞:隊列,利用隊列先進(jìn)先出的特點(diǎn)。隊列中存儲待遍歷的點(diǎn),如果隊列不空,就從隊列中取出第一個(gè)元素,將此元素標記為已訪(fǎng)問(wèn),再把與這個(gè)元素相鄰的未被標記的元素添加到隊列末尾,循環(huán)直到隊列變?yōu)榭。從某個(gè)點(diǎn)開(kāi)始搜索,只需要先把這個(gè)點(diǎn)添加到隊列中,然后開(kāi)始遍歷的操作。
個(gè)人覺(jué)得寬度優(yōu)先搜索還是很容易學(xué)的,因為它的思想容易理解,而且寫(xiě)的套路很固定。
實(shí)際應用:爬蟲(chóng)。爬蟲(chóng)一般是首先將幾個(gè)母站添加到爬蟲(chóng)隊列;然后從隊列中取出要爬的網(wǎng)站,分析網(wǎng)頁(yè)中包含的鏈接,將鏈接添加到爬蟲(chóng)隊列,再爬取網(wǎng)站內容;不斷往復這個(gè)操作,這和寬度搜索的執行方式幾乎是一樣的。
下面做幾道題來(lái)練習:
1、給一個(gè)01矩陣,求不同的島嶼的個(gè)數。0代表海,1代表島,如果兩個(gè)1相鄰,那么這兩個(gè)1屬于同一個(gè)島。我們只考慮上下左右為相鄰。
樣例
[
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]
]
上圖矩陣有3個(gè)島。
思路:遍歷圖,只要找到一個(gè)島,就對這個(gè)島進(jìn)行寬搜,把和它相鄰的所有島都找出來(lái)并且標記,這樣一個(gè)大島就找到了。當整個(gè)圖被遍歷后,也就找到了所有大島的個(gè)數。
2、給定一個(gè)矩陣,2代表墻,1代表僵尸,0代表人。僵尸每天可以將上下左右與之相鄰的人咬成僵尸,但是僵尸不能穿墻。求將所有的人變?yōu)榻┦枰獛滋,如果不能全部變(yōu)榻┦祷?1.
0 1 2 0 0
1 0 0 2 1
0 1 0 0 0
思路:首先我們應該統計出當前的人數,然后將圖中所有僵尸坐標加入隊列,對隊列中的點(diǎn)進(jìn)行搜索,每遍歷一層增加一天(很重要),搜索過(guò)程中遇到人就將人數-1。最后看人數如果歸零,證明全部變?yōu)榻┦,返回天數,否則返回-1.
【php算法學(xué)習之寬度優(yōu)先搜索】相關(guān)文章:
php算法學(xué)習之動(dòng)態(tài)規劃04-01
php學(xué)習之php配置07-15
php經(jīng)典算法介紹02-26
PHP經(jīng)典算法題03-19
PHP紅包算法04-06
PHP算法學(xué)習之分治法02-14
php學(xué)習之php預定義變量07-29
PHP的樹(shù)形結構算法07-06
PHP幾個(gè)經(jīng)典算法題02-12