在Java的面試中,深度優(yōu)先搜索(DFS)是常見(jiàn)的算法思想之一。DFS用于解決圖遍歷、路徑搜索和組合問(wèn)題等。本文將介紹一道經(jīng)典的Java面試題——深度優(yōu)先搜索,并提供詳細(xì)的解析和解題思路。
題目
給定一個(gè)無(wú)向圖,以及一個(gè)起始節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn),請(qǐng)編寫(xiě)一個(gè)函數(shù)來(lái)判斷是否存在從起始節(jié)點(diǎn)到目標(biāo)節(jié)點(diǎn)的路徑。
示例
假設(shè)給定以下無(wú)向圖和起始節(jié)點(diǎn)1和目標(biāo)節(jié)點(diǎn)5:
1 -- 2
/ \
3 - 4
\
5
解析與解題思路
深度優(yōu)先搜索(DFS)是一種遍歷圖的算法,通過(guò)遞歸或棧的方式實(shí)現(xiàn)。下面是使用DFS解決該問(wèn)題的具體步驟:
- 創(chuàng)建一個(gè)HashSet來(lái)記錄已訪問(wèn)的節(jié)點(diǎn),以避免重復(fù)訪問(wèn)。
- 定義一個(gè)輔助函數(shù)dfs,參數(shù)包括當(dāng)前節(jié)點(diǎn)、目標(biāo)節(jié)點(diǎn)和已訪問(wèn)節(jié)點(diǎn)的HashSet。
- 在dfs函數(shù)中,首先檢查當(dāng)前節(jié)點(diǎn)是否為目標(biāo)節(jié)點(diǎn),如果是,則返回true。
- 將當(dāng)前節(jié)點(diǎn)添加到已訪問(wèn)的節(jié)點(diǎn)HashSet中。
- 遍歷當(dāng)前節(jié)點(diǎn)的所有相鄰節(jié)點(diǎn),對(duì)于每個(gè)相鄰節(jié)點(diǎn),如果它沒(méi)有被訪問(wèn)過(guò),則遞歸調(diào)用dfs函數(shù)。
- 如果在任何遞歸調(diào)用中找到目標(biāo)節(jié)點(diǎn),則返回true。
- 如果所有的遞歸調(diào)用都未找到目標(biāo)節(jié)點(diǎn),則返回false。
下面是使用DFS解決該問(wèn)題的Java代碼示例:
import java.util.*;
public class GraphDFS {
private Map<Integer, List<Integer>> graph;
public GraphDFS() {
graph = new HashMap<>();
}
public void addEdge(int u, int v) {
graph.computeIfAbsent(u, ArrayList::new).add(v);
graph.computeIfAbsent(v, ArrayList::new).add(u);
}
public boolean hasPath(int start, int target) {
Set<Integer> visited = new HashSet<>();
return dfs(start, target, visited);
}
private boolean dfs(int curr, int target, Set<Integer> visited) {
if (curr == target) {
return true;
}
visited.add(curr);
List<Integer> neighbors = graph.getOrDefault(curr, new ArrayList<>());
for (int neighbor : neighbors) {
if (!visited.contains(neighbor)) {
if (dfs(neighbor, target, visited)) {
return true;
}
}
}
return false;
}
public static void main(String[] args) {
GraphDFS graph = new GraphDFS();
graph.addEdge(1, 2);
graph.addEdge(1, 3);
graph.addEdge(2, 4);
graph.addEdge(4, 5);
int start = 1;
int target = 5;
boolean hasPath = graph.hasPath(start, target);
System.out.println("Path exists from " + start + " to " + target + ": " + hasPath);
}
}
在上述代碼中,我們通過(guò)DFS算法遍歷無(wú)向圖,判斷是否存在從起始節(jié)點(diǎn)到目標(biāo)節(jié)點(diǎn)的路徑。
結(jié)論
通過(guò)使用深度優(yōu)先搜索(DFS),我們可以遍歷圖并判斷是否存在從起始節(jié)點(diǎn)到目標(biāo)節(jié)點(diǎn)的路徑。這道經(jīng)典的Java面試題考察了面試者對(duì)DFS算法思想、圖遍歷和遞歸的理解。掌握DFS的基本原理和實(shí)現(xiàn)方式對(duì)于解決與圖相關(guān)的問(wèn)題具有重要意義。在面試中,清晰地解釋算法思路和實(shí)現(xiàn)過(guò)程,展現(xiàn)出自己的編程能力和問(wèn)題解決能力,將為面試成功奠定基礎(chǔ)。
學(xué)java,就到java編程獅!