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入门教程
Apr 03 Python
python计算时间差的方法
May 20 Python
Linux 发邮件磁盘空间监控(python)
Apr 23 Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
Jan 05 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
Sep 04 Python
Python 窗体(tkinter)按钮 位置实例
Jun 13 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
Aug 05 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
Python Dataframe常见索引方式详解
May 27 Python
python通过函数名调用函数的几种场景
Sep 23 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 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
PHP is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
php设计模式 Factory(工厂模式)
2011/06/26 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
js图片向右一张张滚动效果实例代码
2013/11/23 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
使用python绘制人人网好友关系图示例
2014/04/01 Python
PyCharm 设置SciView工具窗口的方法
2019/01/15 Python
python中的colorlog库使用详解
2019/07/05 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
python如何实现word批量转HTML
2020/09/30 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
运动会广播稿200字
2014/01/15 职场文书
社区网格化管理实施方案
2014/03/21 职场文书
建筑安全责任书范本
2014/07/24 职场文书
商场收银员岗位职责
2015/04/07 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
2016年感恩教师节活动总结
2016/04/01 职场文书
导游词之苏州阳澄湖
2019/11/15 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
原生JS实现分页
2022/04/19 Javascript