python圖的深度優先和廣度優先算法實例分析

 更新時間:2019年10月26日 11:08:49   作者:yupeng   我要評論
這篇文章主要介紹了python圖的深度優先和廣度優先算法,結合實例形式分析了圖的深度優先算法與廣度優先算法相關概念、原理、實現技巧與操作注意事項,需要的朋友可以參考下

本文實例講述了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, 2, 3, 4, 5, 6, 7, 8]

深度優先:

[1, 2, 4, 8, 5, 3, 6, 7]

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python數據結構與算法教程》、《Python加密解密算法與技巧總結》、《Python編碼操作技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程

希望本文所述對大家Python程序設計有所幫助。

相關文章

  • Python進行數據提取的方法總結

    Python進行數據提取的方法總結

    數據提取是分析師日常工作中經常遇到的需求。如某個用戶的貸款金額,某個月或季度的利息總收入,某個特定時間段的貸款金額和筆數,大于5000元的貸款數量等等。本篇文章介紹如何通過python按特定的維度或條件對數據進行提取,完成數據提取需求。
    2016-08-08
  • python多線程socket編程之多客戶端接入

    python多線程socket編程之多客戶端接入

    這篇文章主要為大家詳細介紹了python多線程socket編程之多客戶端接入,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 用Python PIL實現幾個簡單的圖片特效

    用Python PIL實現幾個簡單的圖片特效

    這篇文章主要介紹了用Python PIL實現幾個簡單的圖片特效,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • python自定義函數實現最大值的輸出方法

    python自定義函數實現最大值的輸出方法

    今天小編就為大家分享一篇python自定義函數實現最大值的輸出方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python while、for、生成器、列表推導等語句的執行效率測試

    Python while、for、生成器、列表推導等語句的執行效率測試

    這篇文章主要介紹了Python while、for、生成器、列表推導等語句的執行效率測試,本文分別用兩段程序測算出了各語句的執行效率,然后總結了什么情況下使用什么語句優先使用的語句等,需要的朋友可以參考下
    2015-06-06
  • python3監控CentOS磁盤空間腳本

    python3監控CentOS磁盤空間腳本

    這篇文章主要為大家詳細介紹了Python3監控CentOS磁盤空間腳本,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 詳解 Python中LEGB和閉包及裝飾器

    詳解 Python中LEGB和閉包及裝飾器

    這篇文章主要介紹了詳解 Python中LEGB和閉包及裝飾器的相關資料,主要介紹了函數作用域和閉包的理解和使用方法及Python中的裝飾器,需要的朋友可以參考下
    2017-08-08
  • Python格式化字符串f-string概覽(小結)

    Python格式化字符串f-string概覽(小結)

    這篇文章主要介紹了Python格式化字符串f-string概覽(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • Python基于whois模塊簡單識別網站域名及所有者的方法

    Python基于whois模塊簡單識別網站域名及所有者的方法

    這篇文章主要介紹了Python基于whois模塊簡單識別網站域名及所有者的方法,簡單分析了Python whois模塊的安裝及使用相關操作技巧,需要的朋友可以參考下
    2018-04-04
  • python實現從文件中讀取數據并繪制成 x y 軸圖形的方法

    python實現從文件中讀取數據并繪制成 x y 軸圖形的方法

    今天小編就為大家分享一篇python實現從文件中讀取數據并繪制成 x y 軸圖形的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10

最新評論

福建体育彩票时时彩11