什么是图?

我们先来考虑日常生活中的一个问题,我们在出行的时候一般会考虑使用地图软件搜下从一个地点到另外一个地点的路线。 这里把地点抽象成一个圈,路径抽象成线,于是乎就有了下面的图,其实还是非常好理解的。

简单地说就是有节点(node)和边(edge)组成的一种数据结构,相邻的节点称之为邻居。 注意图分为有向图和无向图, 比如有些路是单行道,有些是双行道,有向图我们用箭头指向,无向图就是一条直线连接。

图的表示

那我们怎么把一个图抽象成代码来表示呢?因为最终我们还是需要代码来实现的。通常有两种表示方法,邻接表法和邻接矩阵表示。

  • 邻接表法:对于每个图中的点,将它的邻居放到一个链表里
  • 邻接矩阵:对于 n 个点,构造一个 n * n 的矩阵,如果有从点 i 到点 j 的边,就将矩阵的位置 matrix[i][j] 置为 1.

不过我们可以看到,用矩阵存储图是非常耗费空间的,大部分情况下矩阵是稀疏的,所以我们后边选择使用邻接表。

图的遍历

遍历图最常用的有两种方式,就是你常听到的 BFS 和 DFS.

  • BFS: Breadth First Search,广度优先搜索
  • DFS: Depdth First Search,深度优先搜索

BFS

BFS 类似于树的层序遍历,从第一个节点开始,先访问离 A 最近的点,接着访问次近的点。我们先来构造一个图:

graph = {'A': ['B', 'F'],'B': ['C', 'I', 'G'],'C': ['B', 'I', 'D'],'D': ['C', 'I', 'G', 'H', 'E'],'E': ['D', 'H', 'F'],'F': ['A', 'G', 'E'],'G': ['B', 'F', 'H', 'D'],'H': ['G', 'D', 'E'],'I': ['B', 'C', 'D'],
}

如何『由近及远』地访问节点呢?我们先访问起点 A 的邻居,然后邻居访问完再访问邻居的邻居不就行了? 就是这个思想,不过我们需要一个队列辅助,队列之前说过是一种先进先出结构,我们只需要把起点的邻居先入队, 当邻居访问完了再去访问邻居的邻居就可以了,对于已经访问过的节点,我们用一个 set 记录它就好了。代码如下:

# -*- coding: utf-8 -*-from collections import dequeGRAPH = {'A': ['B', 'F'],'B': ['C', 'I', 'G'],'C': ['B', 'I', 'D'],'D': ['C', 'I', 'G', 'H', 'E'],'E': ['D', 'H', 'F'],'F': ['A', 'G', 'E'],'G': ['B', 'F', 'H', 'D'],'H': ['G', 'D', 'E'],'I': ['B', 'C', 'D'],
}class Queue(object):def __init__(self):self._deque = deque()def push(self, value):return self._deque.append(value)def pop(self):return self._deque.popleft()def __len__(self):return len(self._deque)def bfs(graph, start):search_queue = Queue()search_queue.push(start)searched = set()while search_queue:   # 队列不为空就继续cur_node = search_queue.pop()if cur_node not in searched:yield cur_nodesearched.add(cur_node)for node in graph[cur_node]:search_queue.push(node)print('bfs:')
bfs(GRAPH, 'A')
"""
bfs:
A
B
F
C
I
G
E
D
H
"""

DFS

深度优先搜索(DFS)是每遇到一个节点,如果没有被访问过,就直接去访问它的邻居节点,不断加深。代码其实很简单:

DFS_SEARCHED = set()def dfs(graph, start):if start not in DFS_SEARCHED:print(start)DFS_SEARCHED.add(start)for node in graph[start]:if node not in DFS_SEARCHED:dfs(graph, node)print('dfs:')
dfs(GRAPH, 'A')  # A B C I D G F E H

c++ set遍历_Python算法学习之图与图的遍历相关推荐

  1. 音频算法学习和应用谱图

    音频算法学习和应用谱图 做音频算法也7年了,非常庆幸在读研期间就确定了方向,尽早切入了这个行业.这些年主要工作集中在前处理方面,不少比较年轻的同志,或者是刚刚开始研究生生涯的同学,会问到我:" ...

  2. python 可视化饼图_Python可视化学习(饼状图,坐标系...)

    写在前面的话 01 今天资源君带大家学习一下Python的可视化,何谓可视化呢?我们常常听说Python的数据分析,数据分析中很重要的一个就是将数据展示出来,如何展示出来呢?这就得靠我们的Python ...

  3. python绘制折线图保存_Python系统学习 - 绘制简单折线图

    今天我们开始学习 "数据可视化"这一章,我们主要是使用matplotlib库,来实现将数据整理以图表等形式显示出来 数据可视化 1.mpl_squares.py: # coding ...

  4. python 深度优先遍历_Python算法-二叉树深度优先遍历

    二叉树 组成: 1.根节点BinaryTree:root 2.每一个节点,都有左子节点和右子节点(可以为空)TreeNode:value.left.right 二叉树的遍历: 遍历二叉树:深度优先遍历 ...

  5. python算法学习代码_python 算法学习部分代码记录篇章1

    #-*- coding: utf-8 -*-#@Date : 2017-08-19 20:19:56#@Author : lileilei '''那么算法和数据结构是什么呢,答曰兵法''' '''a+ ...

  6. python堆排序算法_Python算法学习之堆和堆排序

    什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种.最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property) ...

  7. python range倒序_Python算法学习之堆和堆排序

    什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种. 最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property ...

  8. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...

    图: 图结构区别于线性结构和树型结构,区别可见下图 逻辑上的图(graph)结构由顶点(vertex)和边(edge)组成. 一个图结构G包含顶点集合V和边集合E,任何两个顶点之间可以有一个边表示两者 ...

  9. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

最新文章

  1. gin框架长连接_gin框架教程一: go框架gin的基本使用
  2. 数据中心运维人的半衰期危机
  3. [Android] SQLite数据库之增删改查基础操作
  4. 2021,春节联欢会
  5. 您一直在寻找5+个简单的一线工具来提升Python可视化效果
  6. c#中关于delegate、委托、事件之间的联系、关系
  7. 大数据发展火爆,云计算平台主打安全至上
  8. vb中typename函数
  9. 一步一步学习Git(2)——Git基本操作
  10. Java使用自动化测试脚本selenium
  11. python读取像素值
  12. 数据库锁,事务特性,脏读,幻读,不可重复度,隔离级别,分布式事务,本地事务的介绍
  13. Rosalind Java| Mortal Fibonacci Rabbits
  14. sessionbean+entitybean 在 jbx+wl7中调试笔记。
  15. 浅析运输管理系统(TMS)
  16. redis 入门+掌握
  17. Rstudio与R的绑定和更新
  18. Java基础知识——IO流
  19. 2015年医学核心期刊目录(有效期自2014年)
  20. android内置sd卡挂载过程,Android获取机身存储、内置SD卡与外置TF卡路径

热门文章

  1. 多个服务器数据互通_3月21日部分服务器数据互通公告!
  2. python写表格_python写入表格
  3. gdb set写text/code段错误的解决办法
  4. Linux进程和计划任务管理
  5. tensorflow.GraphDef was modified concurrently during serialization
  6. termux pythonlxml安装_将安卓手机打造成你的python全栈开发利器
  7. linux 内核 sleep,linux内核是如何支持深度睡眠(deep sleep)方式的?
  8. 【pip install psycopg2安装报错】Error: pg_config executable not found.
  9. 【项目管理】PMO三大贡献支持价值交付-解读
  10. 【研发管理】华为十大架构与设计核心原则