圖的廣度優先搜尋和深度優先搜尋Python實現
圖的廣度優先搜尋和深度優先搜尋Python實現
class Graph(object):
"""圖的廣度優先搜尋和深度優先搜尋"""
def __init__(self, nodes, sides):
"""
nodes 表示點,如:nodes = [i for i in range(8)]
sides 表示邊,如:sides = [(0, 1),(0, 3),(1, 2),(1, 4),(1, 0),(2, 1),(2, 5),(3, 0),(3, 4),(4, 1),(4, 3),(4, 5),(4, 6),(5, 2),(5, 4),(5, 7),(6, 4),(6, 7),(7, 6),(7, 5)]
"""
self.sequence = {} # self.sequence,key是點,value是與key相連線的點
self.side = [] # self.side是臨時變數,主要用於儲存與指定點相連線的點
for node in nodes:
for side in sides:
u, v = side
# 指定點與另一個點在同一個邊中,則說明這個點與指定點是相連線的點,則需要將這個點放到self.side中
if node == u and v not in self.side:
self.side.append(v)
elif node == v and u not in self.side:
self.side.append(u)
self.sequence[node] = self.side
self.side = []
print(self.sequence)
def bfs(self, s, t):
"""
廣度優先算髮
是指定節點 s 開始,沿著樹的寬度遍歷樹的節點。如果所有節點均被訪問,則演算法中止。
廣度優先搜尋的實現一般採用open-closed表。
s 表示開始節點,t 表示要找的節點
"""
queue, order = [], [] # queue本質上是堆疊,用來存放需要進行遍歷的資料, order裡面存放的是具體的訪問路徑
queue.append(s) # 首先將初始遍歷的節點放到queue中,表示將要從這個點開始遍歷
order.append(s) # 由於是廣度優先,也就是先訪問初始節點的所有的子節點
while queue:
# queue.pop(0)意味著是佇列的方式出元素,就是先進先出,而下面的for迴圈將節點v的所有子節點
# 放到queue中,所以queue.pop(0)就實現了每次訪問都是先將元素的子節點訪問完畢,而不是優先葉子節點
v = queue.pop(0)
for w in self.sequence[v]:
if w not in order and w not in queue:
# 這裡可以直接order.append(w) 因為廣度優先就是先訪問節點的所有下級子節點,所以可以
# 將self.sequence[v]的值直接全部先給到order
order.append(w)
queue.append(w)
if w == t:
print("Got it")
return order
return order
def dfs(self, s, t):
"""
深度優先演算法,是一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支。
當節點v的所在邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。
這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,
則選擇其中一個作為源節點並重復以上過程,整個程式反覆進行直到所有節點都被訪問為止。屬於盲目搜尋。
s 表示開始節點,t 表示要找的節點
"""
queue, order = [], [] # queue本質上是堆疊,用來存放需要進行遍歷的資料, order裡面存放的是具體的訪問路徑
queue.append(s) # 首先將初始遍歷的節點放到queue中,表示將要從這個點開始遍歷
while queue:
# 從queue中pop出點v,然後從v點開始遍歷了,所以可以將這個點pop出,然後將其放入order中
# 這裡才是最有用的地方,pop()表示彈出棧頂,由於下面的for迴圈不斷的訪問子節點,並將子節點壓入堆疊,
# 也就保證了每次的棧頂彈出的順序是下面的節點
v = queue.pop()
order.append(v)
# 這裡開始遍歷v的子節點
for w in self.sequence[v]:
# w既不屬於queue也不屬於order,意味著這個點沒被訪問過,所以講起放到queue中,然後後續進行訪問
if w not in order and w not in queue:
queue.append(w)
if w == t:
print("Got it")
order.append(w)
return order
return order
相關文章
- 圖的遍歷:深度優先搜尋與廣度優先搜尋
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- 基本演算法——深度優先搜尋(DFS)和廣度優先搜尋(BFS)演算法
- 深度和廣度優先搜尋演算法演算法
- bfs廣度優先搜尋
- ybtoj:廣度優先搜尋
- 深度優先搜尋
- c++ 廣度優先搜尋(寬搜)C++
- DFS(深度優先搜尋)
- ybtoj:深度優先搜尋
- 啟發式搜尋的方式(深度優先,廣度優先)和 搜尋方法(Dijkstra‘s演算法,代價一致搜尋,貪心搜尋 ,A星搜尋)演算法
- js版本的(廣、深)度優先搜尋JS
- 【程式碼隨想錄】廣度優先搜尋
- 演算法筆記(廣度優先搜尋)演算法筆記
- 【演算法】廣度/寬度優先搜尋(BFS)演算法
- 【演算法】深度優先搜尋(DFS)演算法
- leetcode 刷題之深度優先搜尋LeetCode
- 演算法競賽——BFS廣度優先搜尋演算法
- 「Golang成長之路」迷宮的廣度優先搜尋Golang
- Python 圖_系列之基於鄰接炬陣實現廣度、深度優先路徑搜尋演算法Python演算法
- 演算法(三):圖解廣度優先搜尋演算法演算法圖解
- 廣度優先搜尋(BFS)思路及演算法分析演算法
- golang學習筆記——迷宮的廣度優先搜尋Golang筆記
- 深度優先搜尋演算法(DFS)講解演算法
- 【知識點】深度優先搜尋 Depth First Search
- 深度優先搜尋演算法-dfs講解演算法
- 深度優先搜尋 (Depth First Search 簡稱:DFS)
- 從1到n的全排列(深度優先搜尋)
- POJ1915,雙向寬度優先搜尋
- 0基礎學演算法 搜尋篇第一講 深度優先搜尋演算法
- 小白的深度優先搜尋(Depth First Search)學習日記(Python)Python
- LeetCode演算法練習——深度優先搜尋 DFSLeetCode演算法
- 深度優先搜尋(DFS)思路及演算法分析演算法
- js實現深度優先遍歷和廣度優先遍歷JS
- 深度優先與廣度優先
- 十、深度優先 && 廣度優先
- 寫不出來的深度優先搜尋----leetcode113 路徑總和LeetCode
- python實現圖(基於圖的不同儲存方式)的深度優先(DFS)和廣度(BFS)優先遍歷Python