python深度優(yōu)先搜索算法怎么實(shí)現(xiàn)

小億
120
2023-10-14 08:41:14
欄目: 編程語言

深度優(yōu)先搜索(Depth First Search,DFS)是一種常用的圖遍歷算法,可以使用遞歸或者棧來實(shí)現(xiàn)。

遞歸實(shí)現(xiàn)深度優(yōu)先搜索算法可以按照以下步驟進(jìn)行:

  1. 定義一個(gè)DFS函數(shù),參數(shù)為當(dāng)前節(jié)點(diǎn)和訪問狀態(tài)的集合,初始狀態(tài)為未訪問。

  2. 將當(dāng)前節(jié)點(diǎn)標(biāo)記為已訪問。

  3. 遍歷當(dāng)前節(jié)點(diǎn)的鄰接節(jié)點(diǎn),如果鄰接節(jié)點(diǎn)未訪問,則遞歸調(diào)用DFS函數(shù)。

  4. 遞歸調(diào)用DFS函數(shù)后,回溯到上一個(gè)節(jié)點(diǎn),繼續(xù)遍歷下一個(gè)未訪問的鄰接節(jié)點(diǎn)。

以下是一個(gè)使用遞歸實(shí)現(xiàn)深度優(yōu)先搜索的例子:

def dfs(node, visited):
visited.add(node)  # 標(biāo)記當(dāng)前節(jié)點(diǎn)為已訪問
# 遍歷當(dāng)前節(jié)點(diǎn)的鄰接節(jié)點(diǎn)
for neighbor in node.neighbors:
if neighbor not in visited:  # 如果鄰接節(jié)點(diǎn)未訪問,則遞歸調(diào)用DFS函數(shù)
dfs(neighbor, visited)
# 使用示例
visited = set()  # 記錄訪問狀態(tài)的集合
dfs(start_node, visited)

如果不使用遞歸,可以使用棧來實(shí)現(xiàn)深度優(yōu)先搜索算法。棧的原理是先進(jìn)后出,可以用來保存待訪問的節(jié)點(diǎn)。具體步驟如下:

  1. 創(chuàng)建一個(gè)棧,并將起始節(jié)點(diǎn)入棧。

  2. 創(chuàng)建一個(gè)集合來記錄節(jié)點(diǎn)的訪問狀態(tài)。

  3. 進(jìn)入循環(huán),直到棧為空:

  • 彈出棧頂節(jié)點(diǎn),并將其標(biāo)記為已訪問。

  • 遍歷當(dāng)前節(jié)點(diǎn)的鄰接節(jié)點(diǎn),如果鄰接節(jié)點(diǎn)未訪問,則將其入棧。

以下是一個(gè)使用棧實(shí)現(xiàn)深度優(yōu)先搜索的例子:

def dfs(start_node):
stack = [start_node]  # 創(chuàng)建一個(gè)棧,并將起始節(jié)點(diǎn)入棧
visited = set()  # 記錄訪問狀態(tài)的集合
while stack:
node = stack.pop()  # 彈出棧頂節(jié)點(diǎn)
visited.add(node)  # 標(biāo)記當(dāng)前節(jié)點(diǎn)為已訪問
# 遍歷當(dāng)前節(jié)點(diǎn)的鄰接節(jié)點(diǎn)
for neighbor in node.neighbors:
if neighbor not in visited:  # 如果鄰接節(jié)點(diǎn)未訪問,則將其入棧
stack.append(neighbor)
# 使用示例
dfs(start_node)

以上是兩種常見的深度優(yōu)先搜索算法的實(shí)現(xiàn)方式,可以根據(jù)具體的需求選擇適合的方法來實(shí)現(xiàn)。

0