java圖搜索算法之DFS與BFS詳解
你好,我是小黃,一名獨(dú)角獸企業(yè)的Java開發(fā)工程師。
感謝茫茫人海中我們能夠相遇,
俗話說:當(dāng)你的才華和能力,不足以支撐你的夢想的時(shí)候,請靜下心來學(xué)習(xí),
希望優(yōu)秀的你可以和我一起學(xué)習(xí),一起努力,實(shí)現(xiàn)屬于自己的夢想。
一、前言
上一篇文章我們提到了關(guān)于圖的形象化描述方法,不知道大家還有沒有印象。沒有印象的話,可以去看一下上期的內(nèi)容
對于圖來說,搜索的方法無外乎兩種,深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)
兩種搜索算法也不太相同,今天我們就來看一下這兩個(gè)搜索算法
二、深度優(yōu)先搜索
我們一提到深度優(yōu)先搜索,腦子里第一時(shí)間想到的就是遞歸
沒錯(cuò),深搜就是依靠遞歸的方法來進(jìn)行的搜索,我們來看一個(gè)例題:

對于上圖來說,使用深度優(yōu)先搜索的路線為:0 -> 3 - > 2 -> 4 -> 5 -> 1
這里不懂深搜的小伙伴可以看下這篇:深度優(yōu)先搜索
遞歸版本:
/**
* 深度優(yōu)先搜索
*
* @param node
* @param set
*/
public void DFS(Node node, Set<Node> set) {
if (node == null) {
return;
}
if (!set.contains(node)) {
set.add(node);
System.out.print(node.value + " ");
for (Node node1 : node.nexts) {
DFS(node1, set);
}
}
}
迭代版本:
/**
* 深度優(yōu)先搜索
*
* @param node
*/
public void DFS(Node node) {
Stack<Node> stack = new Stack<>();
Set<Node> set = new HashSet<>();
stack.add(node);
set.add(node);
System.out.print(node.value + " ");
while (!stack.isEmpty()) {
Node cur = stack.pop();
for (Node next : cur.nexts) {
if (!set.contains(next)) {
stack.add(cur); // 用來做記憶化的
stack.add(next);
System.out.print(next.value + " ");
set.add(next);
break;
}
}
}
}
測試結(jié)果:
迭代版本:
0 3 2 4 5 1
遞歸版本:
0 3 2 4 5 1
三、廣度優(yōu)先搜索
對于廣度優(yōu)先搜索的話,簡單的來說,像走地圖一樣,一圈一圈的擴(kuò)展開來
我們來看一個(gè)例題:

對于上圖來說,使用深度優(yōu)先搜索的路線為:0 -> 3 -> 1 -> 2 -> 4 -> 5
這里不懂廣搜的小伙伴可以看下這篇:廣度優(yōu)先搜索
/**
* 廣度優(yōu)先搜索
*
* @param node
*/
public static void BFS(Node node) {
if (node == null) {
return;
}
Queue<Node> queue = new LinkedList<>();
// 代表是否被使用
Set<Node> set = new HashSet<>();
queue.add(node);
set.add(node);
while (!queue.isEmpty()) {
Node cur = queue.poll();
System.out.print(cur.value + " ");
for (Node next : cur.nexts) {
if (!set.contains(next)) {
queue.add(next);
set.add(next);
}
}
}
}
四、結(jié)語
這期的深度優(yōu)先搜索和廣度優(yōu)先搜索比較簡單
讓你對圖的搜索大概有個(gè)了解,下幾期將會(huì)講解一些真實(shí)的算法
在算法題中,題目不會(huì)單純的讓你求深搜和廣搜,經(jīng)常會(huì)和別的一起出現(xiàn),比如最小生成樹等
以上就是java數(shù)據(jù)結(jié)構(gòu)圖算法之DFS與BFS詳解的詳細(xì)內(nèi)容,更多關(guān)于java數(shù)據(jù)結(jié)構(gòu)圖算法DFS與BFS的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java線程池ForkJoinPool(工作竊取算法)的使用
Fork就是把一個(gè)大任務(wù)切分為若干個(gè)子任務(wù)并行地執(zhí)行,Join就是合并這些子任務(wù)的執(zhí)行結(jié)果,最后得到這個(gè)大任務(wù)的結(jié)果。Fork/Join?框架使用的是工作竊取算法。本文主要介紹了ForkJoinPool的使用,需要的可以參考一下2022-11-11
SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁示例
本文介紹了SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
springboot項(xiàng)目啟動(dòng)自動(dòng)跳轉(zhuǎn)到瀏覽器的操作代碼
這篇文章主要介紹了springboot項(xiàng)目啟動(dòng)自動(dòng)跳轉(zhuǎn)到瀏覽器的操作代碼,本文圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
spring redis 如何實(shí)現(xiàn)模糊查找key
這篇文章主要介紹了spring redis 如何實(shí)現(xiàn)模糊查找key的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring配置動(dòng)態(tài)數(shù)據(jù)源實(shí)現(xiàn)讀寫分離的方法
這篇文章主要介紹了利用Spring配置動(dòng)態(tài)數(shù)據(jù)源實(shí)現(xiàn)讀寫分離的方法,文中通過示例代碼介紹的很詳細(xì),相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,藕需要的朋友可以一起學(xué)習(xí)學(xué)習(xí)。2017-01-01
java Socket無法完全接收返回內(nèi)容的解決方案
這篇文章主要介紹了java Socket無法完全接收返回內(nèi)容的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
spring?boot項(xiàng)目使用@Async注解的坑
這篇文章主要為大家介紹了spring?boot項(xiàng)目中使用@Async注解遇到的坑示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07

