Python广度优先查找和深度优先查找(内附python教程分享)
https://www.toutiao.com/a6669563251212157447/
图,特别是图的ADT(抽象数据类型)在计算机科学和数学领域是应用非常广泛的。
图基本认识
图模拟一组连接,假如你在A点,你到B点的路径,可以使用图来代表。
graph.png
图由图由顶点(vertex,node)和边(edge)组成。一个顶点(vertex)可以与多个顶点连接,通过一条线,这条线称为边(edge)。
图用于模拟一组数据是如何连接的。
在Python中使用字典来实现这种连接关系。在之前的文章,我已經介绍了Python字典的实现原理。
广度优先搜索(breadth-first search, BFS)
首先,BFS可以解决两种问题
- 从节点A出发,能不能到节点X?
- 从节点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教程分享)相关推荐
- python操作excel-python操作excel(内附python教程分享)
今天学习了下xlwings这个库,目的是为了让计算机自动化操作excel表,当某天需要做一些很繁琐的事情,就可以派上用场啦. python操作excel(内附python教程分享) 基本对象 网上刮来 ...
- python全套学习方法_python学习方法总结(内附python全套学习资料)
种一棵树最好的时间是十年前,第二好的时间是现在 (文末有资料获取方法) 先聊聊互联网转行那些事儿 很多人是小白,想从事或转行互联网,想以python为切入口,那么恭喜你,这可能是你离互联网工作最捷径的 ...
- mybatis代码自动生成器_最近很火的文章自动生成器,python源码公开了(内附python代码)
学了python,但是又不知道可以用来干嘛.开发一个计算器?太low了.开发一个网站?感觉网站涉及太多知识点,一个人搞不定.不用慌,本文介绍一个最近很火的一个文章自动生成器,它是用python写的,能 ...
- python练手经典100例-非常适合Python菜鸟练手的趣味题(内附学习教程分享)
Python虽然入门容易,但是涉及的知识点非常多,而且技巧性很强!这些技巧就像一串一串的珠子,需要一些题目的不断的练手才能熟练掌握串联起来,把知识点掌握牢固! 今天我就精选了3道趣味的Python题目 ...
- python小说自动生成器_最近很火的文章自动生成器,python源码公开了(内附python代码)...
学了python,但是又不知道可以用来干嘛.开发一个计算器?太low了.开发一个网站?感觉网站涉及太多知识点,一个人搞不定.不用慌,本文介绍一个最近很火的一个文章自动生成器,它是用python写的,能 ...
- python全栈工程师薪水_不止 20K,Python 工程师薪资再飙升(内附转型指南)
原标题:不止 20K,Python 工程师薪资再飙升(内附转型指南) Python 诞生之初就被誉为最容易上手的编程语言.进入火热的 AI 人工智能时代后,它也逐渐取代 Java,成为编程界的头牌语言 ...
- 双代号网络图基础算法_最新(免锁版)网络图横道图绘制软件,内附安装教程,制图做更快...
最新(免锁版)网络图横道图绘制软件,内附安装教程,制图做更快 网络图横道图绘制可制作双代号网络计划.单代号网络图.横道图(及甘特图Gantt),是最常用的计划与控制手段之一,项目管理的必备工具,还可作 ...
- 单代号网络图计算例题_最新(免锁版)网络图横道图绘制软件,内附安装教程,制图做更快...
最新(免锁版)网络图横道图绘制软件,内附安装教程,制图做更快 网络图横道图绘制可制作双代号网络计划.单代号网络图.横道图(及甘特图Gantt),是最常用的计划与控制手段之一,项目管理的必备工具,还可作 ...
- 2023最新小额现金贷系统源码+可打包成APP/内附安装教程
正文: 内附安装教程,本源码只作学习使用,切勿违规经营. 1.将源码上传到根目录并且解压. 2.导入数据库文件"cash-loan.sql"到你的数据库 3.修改域名配置文件:&q ...
- 2023最新手机流量卡充值管理系统网站源码+内附搭建教程
正文: 市面上很火的流量卡项目,可以用这套平台系统来管理,实现自定义套餐名以及流量卡运营,充值收款,即时返佣以及流量卡运营,内附搭建教程. 程序: wwxrhs.lanzoul.com/i3RRK0k ...
最新文章
- 云南实现手机自主补(换)领居民身份证
- 用 Python 爬了点你们喜欢的小电影
- linux 用户进程结束后 malloc申请的内存会自动释放吗,进程退出后malloc的内存是否会被释放?
- 计算机网络3-DNS域名解析系统
- ES6学习(新增字符串方法)
- Memcache监控工具 -- memkeys
- html js修改readonly,js控制html元素的readonly属性
- 笔画输入法6.8豪华版 破解版
- 网页分享至Facebook,Twitter,LinkedIn,WhatsApp,邮箱总结
- CentOS修改时间和时区
- 记录双十一微信群抢楼的脚本
- win10专业版和企业版的区别_Win10专业版和家庭版有什么区别?
- 程序员的算法趣题:Q09 落单的男女(Java版)
- Airport Simulation (数据结构与算法 – 队列 / Queue 的应用)
- html图片缩放作为背景,css怎么把背景图片缩小?
- 未来计算机的特点是什么,【简答题】未来计算机的发展将会呈现以下几个趋势:...
- 数据结构课程设计 - 城市链表
- 三万字加源码,教你从零开始学网页设计(HTML5+CSS)
- 标准库函数begin和end
- 【论文阅读】超分辨率——Towards Real-World Blind Face Restoration with Generative Facial Prior
热门文章
- Java Remote Debug(远程调试)
- Eclipse 如何安装,以及jdk如何设定环境变量
- eclipse 出现 an error has occured when activating this view
- 译者招募 | 这本“顶级”微积分教材,中文版要来了!
- 一本可能提升思考水平 10 倍的书
- 有一说一,AI 到底会不会伤害人类?
- 如何使用TensorFlow和VAE模型生成手写数字
- 一个c/c++分布式框架ZMQ或者ZeroMQ, 介绍和win下安装使用方法
- Spark算子汇总和理解(详细)
- 南极冰盖数据集不如火星?借助无人机和机器学习,斯坦福学者着力挖掘最有价值数据...