https://www.toutiao.com/a6669563251212157447/

图,特别是图的ADT(抽象数据类型)在计算机科学和数学领域是应用非常广泛的。

图基本认识

图模拟一组连接,假如你在A点,你到B点的路径,可以使用图来代表。

graph.png

图由图由顶点(vertex,node)和边(edge)组成。一个顶点(vertex)可以与多个顶点连接,通过一条线,这条线称为边(edge)。

图用于模拟一组数据是如何连接的

在Python中使用字典来实现这种连接关系。在之前的文章,我已經介绍了Python字典的实现原理。

广度优先搜索(breadth-first search, BFS)

首先,BFS可以解决两种问题

  1. 从节点A出发,能不能到节点X?
  2. 从节点A出发,到节点X的最短路径是哪条?

如何理解广度:

假如现在你需要在你的朋友的关系网中,找到一个卖芒果的,应该如何做?下图是你的朋友关系网的情况。

friends.jpg

广度优先,就是, 在你的关系网中,一度关系胜过二度关系。广度优先,就是先在一度关系中找到,再往外层的度找。

现在我们用BFS来解决第一个问题。

这里参考了《算法图解》的例子。

先把上图写为对应的Python代码:

graph = dict()
graph['your'] = ['alice', 'boob', 'claire']
graph['boob'] = ['anuj', 'peggy']
graph['alice'] = ['peggy']
graph['claire'] = ['thom', 'jonny']
graph['anuj'] = []
graph['peggy'] = []
graph['thom'] = []
graph['jonny'] = []

我们使用队列(FIFO)的思想,将关系网的人加入到队列,然后弹出一个元素,并且把该元素的关系网的朋友也加入到队列。下面是代码实现:

def person_is_seller(name):return name[-1] == 'm'
def search(graph, name):search_queue = deque()search_queue += graph[name]searched = []while search_queue:person = search_queue.popleft()if person not in search_queue:if person_is_seller(person):print(searched)print(person + ' is a mango seller')return Trueelse:search_queue += graph[person]searched.append(person)return False

这样的代码只是告诉了我们,在关系网中能够找到那个人(以m字母结尾),并且可以得到那个人的信息。

上面的代码还是比较简单的,现在我们来解决第二个问题,最短路径是哪个?也就是,如何把走过的路径保存起来?

def bfs2(graph, start):queue = [(start, [start])] # ['your', ['your']]while queue:(vertex, path) = queue.pop(0)for next_friend in graph[vertex]:if person_is_seller(next_friend):yield path + [next_friend]else:queue.append((next_friend, path + [next_friend]))

我们使用列表模拟队列也是一样的, 你也可以使用列表来代替yield。这里其实还有一个问题,就是可能会重复计算。因为并没有像之前那样,把查找过的路径进行判断。由于我们的graph的数据只是单指向的,所以也并不会有什么问题,并且,这样更容易理解一些。下面解释了上面的代码做了什么:

  • 在queue里面存储每一个人(在图论中称为顶点,vertex),以及它的路径,用一个元组包裹。
  • 循环这个queue,每次只弹出最先进去的元素,得到一个元组(顶点,路径)
  • 根据元组的顶点得到graph的数据(朋友的朋友),遍历这些朋友
  • 如果不是要找的芒果商,那么把该朋友也添加到队列里面去,同时把路径也保存。
  • 在if判断加===,在else加打印queue,再给jonny添加一位朋友
graph['jonny'] = ['abcem']
[('alice', ['your', 'alice'])]
[('alice', ['your', 'alice']), ('boob', ['your', 'boob'])]
[('alice', ['your', 'alice']), ('boob', ['your', 'boob']), ('claire', ['your', 'claire'])]
[('boob', ['your', 'boob']), ('claire', ['your', 'claire']), ('peggy', ['your', 'alice', 'peggy'])]
[('claire', ['your', 'claire']), ('peggy', ['your', 'alice', 'peggy']), ('anuj', ['your', 'boob', 'anuj'])]
[('claire', ['your', 'claire']), ('peggy', ['your', 'alice', 'peggy']), ('anuj', ['your', 'boob', 'anuj']), ('peggy', ['your', 'boob', 'peggy'])]
===
[('peggy', ['your', 'alice', 'peggy']), ('anuj', ['your', 'boob', 'anuj']), ('peggy', ['your', 'boob', 'peggy']), ('jonny', ['your', 'claire', 'jonny'])]
===
[['your', 'claire', 'thom'], ['your', 'claire', 'jonny', 'abcem']]

可以看到,最近一度的朋友总是会被先探测到。这就是广度优先查找。

到此,基本的广度优先查找算法已经实现。

深度优先查找

深度优先查找,只要把队列变成栈即可。

def dfs(graph, start):queue = [(start, [start])] # 1: ['A', ['A']]paths = []while queue:(vertex, path) = queue.pop()for next_friend in graph[vertex]:if person_is_seller(next_friend):print('===')paths.append(path + [next_friend])else:queue.append((next_friend, path + [next_friend]))print(queue)return paths
  • 第一次, 会把your三个朋友压入栈
  • 弹出后入栈的朋友,找到他的朋友,再添加入栈,以此类推,每次出栈都会是最新添加的

由于每次出栈的都是新的数据,所以会深入一条一条朋友网的线找下去。这就是深度优先。

Python广度优先查找和深度优先查找(内附python教程分享)相关推荐

  1. python操作excel-python操作excel(内附python教程分享)

    今天学习了下xlwings这个库,目的是为了让计算机自动化操作excel表,当某天需要做一些很繁琐的事情,就可以派上用场啦. python操作excel(内附python教程分享) 基本对象 网上刮来 ...

  2. python全套学习方法_python学习方法总结(内附python全套学习资料)

    种一棵树最好的时间是十年前,第二好的时间是现在 (文末有资料获取方法) 先聊聊互联网转行那些事儿 很多人是小白,想从事或转行互联网,想以python为切入口,那么恭喜你,这可能是你离互联网工作最捷径的 ...

  3. mybatis代码自动生成器_最近很火的文章自动生成器,python源码公开了(内附python代码)

    学了python,但是又不知道可以用来干嘛.开发一个计算器?太low了.开发一个网站?感觉网站涉及太多知识点,一个人搞不定.不用慌,本文介绍一个最近很火的一个文章自动生成器,它是用python写的,能 ...

  4. python练手经典100例-非常适合Python菜鸟练手的趣味题(内附学习教程分享)

    Python虽然入门容易,但是涉及的知识点非常多,而且技巧性很强!这些技巧就像一串一串的珠子,需要一些题目的不断的练手才能熟练掌握串联起来,把知识点掌握牢固! 今天我就精选了3道趣味的Python题目 ...

  5. python小说自动生成器_最近很火的文章自动生成器,python源码公开了(内附python代码)...

    学了python,但是又不知道可以用来干嘛.开发一个计算器?太low了.开发一个网站?感觉网站涉及太多知识点,一个人搞不定.不用慌,本文介绍一个最近很火的一个文章自动生成器,它是用python写的,能 ...

  6. python全栈工程师薪水_不止 20K,Python 工程师薪资再飙升(内附转型指南)

    原标题:不止 20K,Python 工程师薪资再飙升(内附转型指南) Python 诞生之初就被誉为最容易上手的编程语言.进入火热的 AI 人工智能时代后,它也逐渐取代 Java,成为编程界的头牌语言 ...

  7. 双代号网络图基础算法_最新(免锁版)网络图横道图绘制软件,内附安装教程,制图做更快...

    最新(免锁版)网络图横道图绘制软件,内附安装教程,制图做更快 网络图横道图绘制可制作双代号网络计划.单代号网络图.横道图(及甘特图Gantt),是最常用的计划与控制手段之一,项目管理的必备工具,还可作 ...

  8. 单代号网络图计算例题_最新(免锁版)网络图横道图绘制软件,内附安装教程,制图做更快...

    最新(免锁版)网络图横道图绘制软件,内附安装教程,制图做更快 网络图横道图绘制可制作双代号网络计划.单代号网络图.横道图(及甘特图Gantt),是最常用的计划与控制手段之一,项目管理的必备工具,还可作 ...

  9. 2023最新小额现金贷系统源码+可打包成APP/内附安装教程

    正文: 内附安装教程,本源码只作学习使用,切勿违规经营. 1.将源码上传到根目录并且解压. 2.导入数据库文件"cash-loan.sql"到你的数据库 3.修改域名配置文件:&q ...

  10. 2023最新手机流量卡充值管理系统网站源码+内附搭建教程

    正文: 市面上很火的流量卡项目,可以用这套平台系统来管理,实现自定义套餐名以及流量卡运营,充值收款,即时返佣以及流量卡运营,内附搭建教程. 程序: wwxrhs.lanzoul.com/i3RRK0k ...

最新文章

  1. 云南实现手机自主补(换)领居民身份证
  2. 用 Python 爬了点你们喜欢的小电影
  3. linux 用户进程结束后 malloc申请的内存会自动释放吗,进程退出后malloc的内存是否会被释放?
  4. 计算机网络3-DNS域名解析系统
  5. ES6学习(新增字符串方法)
  6. Memcache监控工具 -- memkeys
  7. html js修改readonly,js控制html元素的readonly属性
  8. 笔画输入法6.8豪华版 破解版
  9. 网页分享至Facebook,Twitter,LinkedIn,WhatsApp,邮箱总结
  10. CentOS修改时间和时区
  11. 记录双十一微信群抢楼的脚本
  12. win10专业版和企业版的区别_Win10专业版和家庭版有什么区别?
  13. 程序员的算法趣题:Q09 落单的男女(Java版)
  14. Airport Simulation (数据结构与算法 – 队列 / Queue 的应用)
  15. html图片缩放作为背景,css怎么把背景图片缩小?
  16. 未来计算机的特点是什么,【简答题】未来计算机的发展将会呈现以下几个趋势:...
  17. 数据结构课程设计 - 城市链表
  18. 三万字加源码,教你从零开始学网页设计(HTML5+CSS)
  19. 标准库函数begin和end
  20. 【论文阅读】超分辨率——Towards Real-World Blind Face Restoration with Generative Facial Prior

热门文章

  1. Java Remote Debug(远程调试)
  2. Eclipse 如何安装,以及jdk如何设定环境变量
  3. eclipse 出现 an error has occured when activating this view
  4. 译者招募 | 这本“顶级”微积分教材,中文版要来了!
  5. 一本可能提升思考水平 10 倍的书
  6. 有一说一,AI 到底会不会伤害人类?
  7. 如何使用TensorFlow和VAE模型生成手写数字
  8. 一个c/c++分布式框架ZMQ或者ZeroMQ, 介绍和win下安装使用方法
  9. Spark算子汇总和理解(详细)
  10. 南极冰盖数据集不如火星?借助无人机和机器学习,斯坦福学者着力挖掘最有价值数据...