最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python數(shù)據(jù)結(jié)構(gòu)之圖深度優(yōu)先和廣度優(yōu)先實(shí)例詳解

 更新時(shí)間:2015年07月08日 12:29:53   作者:yupeng  
這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)之圖深度優(yōu)先和廣度優(yōu)先,較為詳細(xì)的分析了深度優(yōu)先和廣度優(yōu)先算法的概念與原理,并給出了完整實(shí)現(xiàn)算法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了python數(shù)據(jù)結(jié)構(gòu)之圖深度優(yōu)先和廣度優(yōu)先用法。分享給大家供大家參考。具體如下:

首先有一個(gè)概念:回溯

  回溯法(探索與回溯法)是一種選優(yōu)搜索法,按選優(yōu)條件向前搜索,以達(dá)到目標(biāo)。但當(dāng)探索到某一步時(shí),發(fā)現(xiàn)原先選擇并不優(yōu)或達(dá)不到目標(biāo),就退回一步重新選擇,這種走不通就退回再走的技術(shù)為回溯法,而滿足回溯條件的某個(gè)狀態(tài)的點(diǎn)稱為“回溯點(diǎn)”。

深度優(yōu)先算法:

(1)訪問初始頂點(diǎn)v并標(biāo)記頂點(diǎn)v已訪問。
(2)查找頂點(diǎn)v的第一個(gè)鄰接頂點(diǎn)w。
(3)若頂點(diǎn)v的鄰接頂點(diǎn)w存在,則繼續(xù)執(zhí)行;否則回溯到v,再找v的另外一個(gè)未訪問過的鄰接點(diǎn)。
(4)若頂點(diǎn)w尚未被訪問,則訪問頂點(diǎn)w并標(biāo)記頂點(diǎn)w為已訪問。
(5)繼續(xù)查找頂點(diǎn)w的下一個(gè)鄰接頂點(diǎn)wi,如果v取值wi轉(zhuǎn)到步驟(3)。直到連通圖中所有頂點(diǎn)全部訪問過為止。

廣度優(yōu)先算法:

(1)頂點(diǎn)v入隊(duì)列。
(2)當(dāng)隊(duì)列非空時(shí)則繼續(xù)執(zhí)行,否則算法結(jié)束。
(3)出隊(duì)列取得隊(duì)頭頂點(diǎn)v;訪問頂點(diǎn)v并標(biāo)記頂點(diǎn)v已被訪問。
(4)查找頂點(diǎn)v的第一個(gè)鄰接頂點(diǎn)col。
(5)若v的鄰接頂點(diǎn)col未被訪問過的,則col入隊(duì)列。
(6)繼續(xù)查找頂點(diǎn)v的另一個(gè)新的鄰接頂點(diǎn)col,轉(zhuǎn)到步驟(5)。直到頂點(diǎn)v的所有未被訪問過的鄰接點(diǎn)處理完。轉(zhuǎn)到步驟(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)

結(jié)果:

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

廣度優(yōu)先:
[1, 2, 3, 4, 5, 6, 7, 8]

深度優(yōu)先:

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

希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • python如何為list實(shí)現(xiàn)find方法

    python如何為list實(shí)現(xiàn)find方法

    這篇文章主要介紹了python如何為list實(shí)現(xiàn)find方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python實(shí)現(xiàn)APP自動(dòng)化發(fā)微信群消息的示例代碼

    Python實(shí)現(xiàn)APP自動(dòng)化發(fā)微信群消息的示例代碼

    本文主要介紹了Python實(shí)現(xiàn)APP自動(dòng)化發(fā)微信群消息的示例代,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下碼
    2022-01-01
  • 在Linux下調(diào)試Python代碼的各種方法

    在Linux下調(diào)試Python代碼的各種方法

    這篇文章主要介紹了在Linux下調(diào)試Python代碼的各種方法,用于編程后的debug工作,需要的朋友可以參考下
    2015-04-04
  • Matlab、Python為工具解析數(shù)據(jù)可視化之美

    Matlab、Python為工具解析數(shù)據(jù)可視化之美

    下面介紹一些數(shù)據(jù)可視化的作品(包含部分代碼),主要是地學(xué)領(lǐng)域,可遷移至其他學(xué)科,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • Python的內(nèi)存泄漏及gc模塊的使用分析

    Python的內(nèi)存泄漏及gc模塊的使用分析

    這篇文章主要介紹了Python的內(nèi)存泄漏及gc模塊的使用分析,有助于讀者進(jìn)一步了解Python的內(nèi)存分配及回收機(jī)制,增強(qiáng)代碼編寫的安全意識(shí),需要的朋友可以參考下
    2014-07-07
  • Pandas的數(shù)據(jù)過濾實(shí)現(xiàn)

    Pandas的數(shù)據(jù)過濾實(shí)現(xiàn)

    這篇文章主要介紹了Pandas的數(shù)據(jù)過濾實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • python多線程互斥鎖與死鎖問題詳解

    python多線程互斥鎖與死鎖問題詳解

    大家好,本篇文章主要講的是python多線程互斥鎖與死鎖問題詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Python微信企業(yè)號(hào)開發(fā)之回調(diào)模式接收微信端客戶端發(fā)送消息及被動(dòng)返回消息示例

    Python微信企業(yè)號(hào)開發(fā)之回調(diào)模式接收微信端客戶端發(fā)送消息及被動(dòng)返回消息示例

    這篇文章主要介紹了Python微信企業(yè)號(hào)開發(fā)之回調(diào)模式接收微信端客戶端發(fā)送消息及被動(dòng)返回消息的方法,涉及Python微信企業(yè)號(hào)回調(diào)模式消息響應(yīng)機(jī)制相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 分享10提高?Python?代碼的可讀性的技巧

    分享10提高?Python?代碼的可讀性的技巧

    這篇文章主要介紹了分享10提高?Python?代碼的可讀性的技巧,本文介紹20個(gè)常用的Python技巧來提高代碼的可讀性,并能幫助你節(jié)省大量時(shí)間,下面的技巧將在你的日常編碼練習(xí)中非常實(shí)用,需要的朋友可以參考一下
    2022-03-03
  • Python檢測生僻字的實(shí)現(xiàn)方法

    Python檢測生僻字的實(shí)現(xiàn)方法

    最近在工作中碰到一個(gè)需求,要求檢測字段是否包含生僻字以及一些非法字符如 ~!@#$%^&*。通過網(wǎng)上的查找資料解決了,現(xiàn)在將解決的過程和示例代碼分享給大家,有需要的可以參考借鑒。下面來一起看看吧。
    2016-10-10

最新評(píng)論

宁陵县| 渑池县| 芦溪县| 象州县| 呼和浩特市| 安平县| 太和县| 贵州省| 曲阳县| 灵石县| 亳州市| 惠州市| 资兴市| 珠海市| 山东省| 当涂县| 文水县| 吉木乃县| 桐乡市| 武宁县| 蚌埠市| 图们市| 海盐县| 柳河县| 双江| 冕宁县| 五大连池市| 柯坪县| 阳新县| 二连浩特市| 镇宁| 濮阳县| 苗栗县| 蒙城县| 九龙坡区| 五常市| 南丹县| 青海省| 嵊州市| 桑植县| 马龙县|