python数据结构之图深度优先和广度优先实例详解


Posted in Python onJuly 08, 2015

本文实例讲述了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实现linux服务器批量修改密码并生成execl
Apr 22 Python
插入排序_Python与PHP的实现版(推荐)
May 11 Python
简单了解Django模板的使用
Dec 20 Python
Python输出各行命令详解
Feb 01 Python
python 2.7.14安装图文教程
Apr 08 Python
python保存网页图片到本地的方法
Jul 24 Python
python读取Excel表格文件的方法
Sep 02 Python
python sqlite的Row对象操作示例
Sep 11 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
Feb 13 Python
python多线程实现同时执行两个while循环的操作
May 02 Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 Python
python中偏函数partial用法实例分析
Jul 08 #Python
Python使用bs4获取58同城城市分类的方法
Jul 08 #Python
Python实现批量修改文件名实例
Jul 08 #Python
Python查询阿里巴巴关键字排名的方法
Jul 08 #Python
浅谈Python中的闭包
Jul 08 #Python
Python中atexit模块的基本使用示例
Jul 08 #Python
python登录豆瓣并发帖的方法
Jul 08 #Python
You might like
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
Bootstrap模块dropdown实现下拉框响应
2016/05/22 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Python实现常见的回文字符串算法
2018/11/14 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
python web框架中实现原生分页
2019/09/08 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
2021/01/29 Python
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
要账委托书范本
2014/09/15 职场文书
客服专员岗位职责
2015/02/10 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
pytorch中[..., 0]的用法说明
2021/05/20 Python
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python