python圖的深度優先和廣度優先演算法例項分析
阿新 • • 發佈:2020-01-09
本文例項講述了python圖的深度優先和廣度優先演算法。分享給大家供大家參考,具體如下:
首先有一個概念:回溯
回溯法(探索與回溯法)是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。
深度優先演算法:
(1)訪問初始頂點v並標記頂點v已訪問。
(2)查詢頂點v的第一個鄰接頂點w。
(3)若頂點v的鄰接頂點w存在,則繼續執行;否則回溯到v,再找v的另外一個未訪問過的鄰接點。
(4)若頂點w尚未被訪問,則訪問頂點w並標記頂點w為已訪問。
(5)繼續查詢頂點w的下一個鄰接頂點wi,如果v取值wi轉到步驟(3)。直到連通圖中所有頂點全部訪問過為止。
廣度優先演算法:
(1)頂點v入佇列。
(2)當佇列非空時則繼續執行,否則演算法結束。
(3)出佇列取得隊頭頂點v;訪問頂點v並標記頂點v已被訪問。
(4)查詢頂點v的第一個鄰接頂點col。
(5)若v的鄰接頂點col未被訪問過的,則col入佇列。
(6)繼續查詢頂點v的另一個新的鄰接頂點col,轉到步驟(5)。直到頂點v的所有未被訪問過的鄰接點處理完。轉到步驟(2)。
程式碼:
#!/usr/bin/python # -*- coding: utf-8 -*- class Graph(object): def __init__(self,*args,**kwargs): self.node_neighbors = {} self.visited = {} def add_nodes(self,nodelist): for node in nodelist: self.add_node(node) def add_node(self,node): if not node in self.nodes(): self.node_neighbors[node] = [] def add_edge(self,edge): u,v = edge if(v not in self.node_neighbors[u]) and ( u not in self.node_neighbors[v]): self.node_neighbors[u].append(v) if(u!=v): self.node_neighbors[v].append(u) def nodes(self): return self.node_neighbors.keys() def depth_first_search(self,root=None): order = [] def dfs(node): self.visited[node] = True order.append(node) for n in self.node_neighbors[node]: if not n in self.visited: dfs(n) if root: dfs(root) for node in self.nodes(): if not node in self.visited: dfs(node) print order return order def breadth_first_search(self,root=None): queue = [] order = [] def bfs(): while len(queue)> 0: node = queue.pop(0) self.visited[node] = True for n in self.node_neighbors[node]: if (not n in self.visited) and (not n in queue): queue.append(n) order.append(n) if root: queue.append(root) order.append(root) bfs() for node in self.nodes(): if not node in self.visited: queue.append(node) order.append(node) bfs() print order return order if __name__ == '__main__': g = Graph() g.add_nodes([i+1 for i in range(8)]) g.add_edge((1,2)) g.add_edge((1,3)) g.add_edge((2,4)) g.add_edge((2,5)) g.add_edge((4,8)) g.add_edge((5,8)) g.add_edge((3,6)) g.add_edge((3,7)) g.add_edge((6,7)) print "nodes:",g.nodes() order = g.breadth_first_search(1) order = g.depth_first_search(1)
結果:
nodes: [1,2,3,4,5,6,7,8]
廣度優先:
[1,8]深度優先:
[1,8,7]
更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python資料結構與演算法教程》、《Python加密解密演算法與技巧總結》、《Python編碼操作技巧總結》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》及《Python入門與進階經典教程》
希望本文所述對大家Python程式設計有所幫助。