分享兩個常見的搜尋演算法 BFS和DFS

2022-09-27 12:36:08 字數 1944 閱讀 5264

摘要:本文為大家分享兩個常見的搜尋演算法:bfs和dfs。
本次分享兩個常見的搜尋演算法:

1.bfs 即廣度優先搜尋

2.dfs 即深度優先搜尋

給定乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。

示例 1:

11110

11010

11000

00000

輸出: 1

示例 2:

11000

11000

00100

00011

輸出: 3

其實我們還是比較容易想到初步解法的,即從二維網路某點出發,尋找其四周相鄰的陸地,直到所有包含的點都沒有相鄰的陸地為止,這裡可以認為已經找到了乙個島嶼,其餘島嶼同理可以找到。這裡的關鍵問題是遍歷島嶼的順序,其實不難看出有兩種順序

a.優先尋找某a節點的所有相鄰位置

然後拿出乙個相鄰位置比如說b尋找其所有相鄰位置

拿出a節點下乙個相鄰位置重複第2步直到a節點的相鄰位置都執行過該操作

拿出b,重複1,2,3步

b.優先尋找a節點的相鄰位置比如說b

尋找b的相鄰位置c

直到沒有相鄰位置後再返回到a的下乙個相鄰位置,重複1,2步

我們對第一種方法進行觀察:

越是接近根結點的結點將越早地遍歷

思考用什麼儲存結構來存放我們找到的位置:我們把root的相鄰位置儲存到x結構中,然後取出x的某個相鄰位置a,尋找其相鄰位置繼續存放到x中,再取出x中與root相鄰的下個位置b繼續尋找其相鄰位置放入x中。這裡我們發現我們儲存x的順序與我們處理x得到其他資料的順序一致:先進先出(fifo),不難得出我們可以採用佇列來儲存

需要一種方法避免對已經找到的位置重複訪問

現在可以嘗試寫出實際的程式

public

int numislands(char

grid)

queue

queue = new linkedlist<>();

int count =0

;

for(int y=0;y)

queue.poll();

}count++;

}//核心部分

} }

通過這個例項我們可以進一步抽象為圖論中的一種演算法–bfs

可以參考leetcode的**和演算法模板來加深印象

同樣來觀察第二中方法,我們發現

優先走完一條路徑直到結束

我們需要在某一路徑結束後,回溯到初始位置,即儲存節點位置的順序和處理的順序相反,即現進後出(filo)。這裡我們可以用遞迴或者棧來處理。

試著寫出實際的程式

public

int numislands(char

grid) }}

return

len;

}boolean dfs(integer cur, set

visited,char

grid)

}return

true

; }

boolean dfs3(integer cur, setvisited,char

grid)

}//如果當前節點沒有鄰居則去除棧頂節點

if(!hasnearnode)

}return

true

; }

通過這個例項我們可以進一步抽象為圖論中的一種演算法–dfs

參考leetcode的**和模板演算法(遞迴和棧)來加深印象

點選關注,第一時間了解華為雲新鮮技術~

搜尋演算法(DFS和BFS)

題目 有n件物品,每件物品的重量為w i 價值為c i 現在需要選出若干物品放入乙個容器為v的揹包中,使得在選入揹包的物品重量和不超過容量v的前提下,讓揹包中物品的價值之和最大,求最大價值。1 n 20 解題 如下 includeconst int maxn 30 int n,v,maxvalue ...

一文弄懂搜尋演算法中的DFS和BFS

有一位小夥伴問我,迷宮問題怎麼解決,我說dfs或者bfs,然後,ta說,哦哦,這我知道,就是圖裡面的演算法嘛,但,這是個迷宮,難道我要把這個二維矩陣變成圖嘛?我 當場去世。於是我開啟了我的長篇大論。希望大家有所收穫。首先,回答一下那位小夥伴的問題,這個演算法確實屬於圖裡面的演算法,但並不是說是專門針...

樹的直徑(兩個bfs)

樹的直徑 樹中的最長鏈 具體思路 隨便找乙個點bfs,然後找到最長的鏈,然後再以找到的點作為起點進行bfs,然後找到的最長的鏈就是樹的直徑。ac include include include include include include include include include inclu...