八数码深度优先搜索_深度优先搜索和广度优先搜索

深度优先搜索和广度优先搜索

关于搜索&遍历

对于搜索来说,我们绝大多数情况下处理的都是叫 “所谓的暴力搜索” ,或者是说比较简单朴素的搜索,也就是说你在搜索的时候没有任何所谓的智能的情况在里面考虑,很多情况下它做的一件事情就是把所有的结点全部遍历一次,然后找到你要的结果。

基于这样的一个数据结构,如果这个数据结构本身是没有任何特点的,也就是说是一个很普通的树或者很普通的图。那么我们要做的一件事情就是遍历所有的结点。同时保证每个点访问一次且仅访问一次,最后找到结果。

那么我们先把搜索整个先化简情况,我们就收缩到在树的这种情况下来进行搜索。6f0e2c84953d613e4e45398d1e5bde8d.png

如果我们要找到我们需要的一个值,在这个树里面我们要怎么做?那么毫无疑问就是从根这边开始先搜左子树,然后再往下一个一个一个一个点走过去,然后走完来之后再走右子树,直到找到我们的点,这就是我们所采用的方式。

再回到我们数据结构定义,它只有左子树和右子树。

a15461416257e64c1829c6fb948c4ae6.png

我们要实现这样一个遍历或者搜索的话,毫无疑问我们要保证的事情就是

  • 每个结点都要访问一次
  • 每个结点仅仅要访问一次
  • 对于结点访问的顺序不限
    • 深度优先:Depth First Search
    • 广度优先:Breadth First Search

仅访问一次的意思就是代表我们在搜索中,我们不想做过多无用的访问,不然的话我们的访问的效率会非常的慢。

当然的话还可以有其余的搜索,其余的搜索的话就不再是深度优先或者广度优先了,而是按照优先级优先 。当然你也可以随意定义,比如说从中间优先类似于其他的东西,但只不过的话你定义的话要有现实中的场景。所以你可以认为是一般来说就是深度优先、广度优先,另外的话就是优先级优先。按照优先级优先搜索的话,其实更加适用于现实中的很多业务场景,而这样的算法我们一般把它称为启发式搜索,更多应用在深度学习领域。而这种比如说优先级优先的话,在很多时候现在已经应用在各种推荐算法和高级的搜索算法,让你搜出你中间最感兴趣的内容,以及每天打开抖音、快手的话就给你推荐你最感兴趣的内容,其实就是这个原因。

深度优先搜索(DFS)

递归写法

递归的写法,一开始就是递归的终止条件,然后处理当前的层,然后再下转。

  • 那么处理当前层的话就是相当于访问了结点 node,然后把这个结点 node 加到已访问的结点里面去;
  • 那么终止条件的话,就是如果这个结点之前已经访问过了,那就不管了;
  • 那么下转的话,就是走到它的子结点,二叉树来说的话就是左孩子和右孩子,如果是图的话就是连同的相邻结点,如果是多叉树的话这里就是一个children,然后把所有的children的话遍历一次。
  1. 二叉树模版
def dfs(node):
if node in visited:
# already visited
return
visited.add(node)
# process current node
# ... # logic here
dfs(node.left)
dfs(node.right)
  1. 多叉树模版
visited = set()
def dfs(node, visited):
if node in visited: # terminator
# already visited
return
visited.add(node)
# process current node here.
...
for next_node in node.children():
if next_node not in visited:
dfs(next_node, visited)

非递归写法

def DFS(self, tree):
if tree.root is None:
return []
visited, stack = [], [tree.root]
while stack:
node = stack.pop()
visited.add(node)
process (node)
nodes = generate_related_nodes(node)
stack.push(nodes)
# other processing work
...

遍历顺序

我们看深度优先搜索或者深度优先遍历的话,它的整个遍历顺序毫无疑问根节点 1 永远最先开始的,接下来往那个分支走其实都一样的,我们简单起见就是从最左边开始走,那么它深度优先的话就会走到底。

012a1efbc366ff0a599c6ac667d0328a.png

参考多叉树模版我们可以在脑子里面或者画一个图把它递归起来的话,把递归的状态树画出来,就是这么一个结构。

  • 就比如说它开始刚进来的话,传的是  root 的话,root 就会先放到 visited 里面,表示 root 已经被 visit,被 visited之后就从 root.childern里面找 next_node,所有它的next_node都没有被访问过的,所以它就会先访问最左边的这个结点,这里注意当它最左边这个结点先拿出来了,判断没有在 visited里面,因为除了 root之外其他结点都没有被 visited过,那么没有的话它就直接调dfsnext_node 就是把最左边结点放进去,再把 visited也一起放进去。
  • 递归调用的一个特殊,它不会等这个循环跑完,它就直接会进到下一层了,也就是当前梦境的话这里写了一层循环,但是在第一层循环的时候,我就要开始下钻到新的一层梦境里面去了。所以在这里的话,

图的遍历顺序

1c21e55c11ff93fd3b9ebffeffc43232.png

广度优先搜索(BFS)

广度优先遍历它就不再是用递归也不再是用栈了,而是用所谓的队列。你可以把它想象成一个水滴,滴到1这个位置,然后它的水波纹一层一层一层扩散出去就行了。

bb15d43cfc8715eab201cde3e0318f00.png

两者对比

0e05d3191c31e4daec19d409093a2bfc.png

BFS代码模版

# Python
def BFS(graph, start, end):
visited = set()
queue = []
queue.append([start])
while queue:
node = queue.pop()
visited.add(node)
process(node)
nodes = generate_related_nodes(node)
queue.push(nodes)
# other processing work
...
0680f2349200dbbf47e67f66d0e9b643.png
部分图片来源于网络,版权归原作者,侵删。

?点击阅读原文,查看往期内容!

快留言?和我互动吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JArchitect v2017发布!

我们很高兴地通知您, JArchitect v2017已发布 ,现在可以下载 ! JArchitect是一个分析工具,确实可以让您深入研究代码的结构和质量 。 使用JArchitect,可以使用 代码指标 ,使用可视化 图和树图 &#…

[C语言]程序练习(一)

你好,这里是争做图书馆扫地僧的小白。 个人主页:争做图书馆扫地僧的小白_-CSDN博客 目标:希望通过学习技术,期待着改变世界。 目录 前言 一、常量练习 (一)整型常量 (二)浮点型常…

如何在程序中不用加号实现加法_程序员那些事 | JavaScript基础(六)

Hello,程序员那些事又与大家见面了!JS简易日历先给大家看一下效果:大家可能会觉得,唉~好像跟上节课讲的选项卡差不多,就是十二个按钮,改变this的class,同时下面放十二个div,每次显示…

求立方根_「每日一学」数学七上:立方根的知识要点

哈喽,大家好!我们又见面了,欢迎继续关注【轩爸辅导】的【口袋数学】。日更【每日一学】【每日一练】,帮助孩子日积月累,考出好的成绩。配套辅导,哪里不会学哪里,哪里出错练哪里,帮助…

mongodb适用于_适用于MongoDB和Mongometer的SpiderMonkey至V8

mongodb适用于通过10gen将MongoDB 2.3 / 2.4的默认JavaScript引擎从SpiderMonkey切换到V8,我想我将借此机会使用mongometer比较这些发行版的相对性能。 作为安全专家,我真的应该首先研究“ 其他身份验证功能” ……嘿。 我将记录比较过程中所采取的步骤…

地面指示标志_详解消防应急照明和疏散指示系统的施工及安装方法消防施工

详解消防应急照明和疏散指示系统的施工及安装方法消防施工消防应急照明与疏散指示系统在生活中随处可见,相信您并不陌生,它是为人员疏散、消防作业提供照明和疏散指示的系统,由各类消防应急灯具及相关装置组成。自今年3月1日国家标准GB 51309…

管理任务执行-有效执行

背景 给任务排优先级是解决做什么的问题。有效执行解决的是怎么做的问题。 项目执行的要点。 清晰的目标 现象 1.明确项目的初衷,但是没有设定可以衡量的目标。 2.在你的眼中目标很清晰,但是负责项目实施的员工并不知道从哪下手去执行; 3.两周…

什么是实验室人员比对人员_CNAS实验室认可对人员、设备的要求

一、人员要求1、从事实验室活动的人员不得在其他同类型实验室从事同类的实验室活动。 2、从事检测或校准活动的人员应具备相关专业大专以上学历。如果学历或专业不满足要求,应有 10 年以上相关检测或校准经历。关键技术人员,如进行检测或校准结果复核、检…

anaconda base环境_如何在最新版的Anaconda下安装Tensorflow 1.9

去年10月Tensorflow刚刚开放了2.0,当然用2.0慢慢地会变成未来使用Tensorflow的趋势。但是,关于如何用2.0进行机器学习和深度学习研究的书籍市面上能买到的大多都还是英文原版,且很少,因为太新中文的参考书更是少的可怜。因此&…

降级安装_如何升级iOS13测试版,还有降级

我是果子,前几天苹果发布了iOS13第二个开发者预览版,并且放出了描述文件,可以直接在手机上通过安装描述文件OTA升级。升级iOS13预览版不过我发现还有很多小伙伴不会通过安装描述文件进行升级,所以今天我们再写个教程给还不知道的小…

贪心只能过样例 loj515

范围$100$ 题解 比较裸的式子 $f[i][j]$表示枚举到第$i$位有没有和为$j$方案 只有$0$或$1$ $f[i][j]f[i-1][j-val*val]$ 答案$\sum\limits f[n][i]$ 范围$1000000$$((1-100)^2 *100)$ 复杂度爆炸,可以滚动数组,得17分 考虑优化,$bitset$, $bitset$表示实际值是否可以凑出 $f[i]…

接口中定义的成员变量是( )。_抽象与接口

原文链接:抽象与接口抽象类抽象类的定义Java可以创建一种类专门用来当作父类,这种类称为“抽象类”。抽象类的作用有点类似“模板”,其目的是要设计者依据它的格式来修改并创建新的类。在Java中可以创建一种类专门用来当做父类,这…

配置phoenix连接hbase_Phoenix视图映射

点击关注上方“知了小巷”,设为“置顶或星标”,第一时间送达干货。Phoenix定位为OLTP和操作型分析(operational analytics),大多用于在线业务,稳定性要求第一位。Phoenix的功能很强大,也很灵活,Phoenix SQL…

python分析数据差异的方法_用Python的两种方法进行方差分析

在进行数据分析时,我们往往会遇到要对某个变量的影响因素进行分析的情况,而影响一事物的因素往往是很多的。比如在化工生产中,有温度、压力、剂量、反应时间等因素。每一因素的改变都有可能影响产品的数量和质量。我们往往要找出对产品质量有…

5 图片 渐变_AI教程!5分钟教你绘制超酷炫的字体效果

图一所示的图片就是我们今天要学的AI教程啦。为什么想起来要做这个呢?因为前两天有两个粉丝私信我问这种效果的字体怎么做。觉得大家应该对这类字体比较感兴趣的,所以今天就给大家出个教程啦。第一眼看上去是不是感觉很酷炫?其实步骤也不多&a…

6的变换_电源学报 | 2020年第3期:quot;高性能双向直流变换技术及其应用quot;专辑征稿启事...

往期精选:【电源学报•热点论文】贝尔福-蒙贝利亚技术大学(UTBM)高非教授-多物理域质子交换膜燃料电池建模仿真及实验测试专辑主编:张云 研究员(天津大学)吴红飞 教授(南京航空航天大学)专辑刊期: 2020年第3期(2020年5月)专辑介绍双向直流变换…

flash大作业一分钟源文件_「百树云课堂」一写作业就像被雷劈,是什么“病”?...

一写作业就闹心,大部分都是因为在培养习惯的时候基础没打好。比如:对时间不敏感、对效率不敏感、专注力低下等等!今天咱就系统说下“习惯培养”的重点。1大部分娃写不完作业,最主要的一点就是对时间不敏感。写一个字,喝…

bzoj5147bzoj2121loj6701 字符串游戏

做不出来杂题,到处找题做 看到$loj$上新出了一道题,觉得很神仙不错, 还记得Censoring吗(一个AC自动机的题) 这个题求最优解,数据范围$150$ 题解 数据范围非常小,首先贪心肯定不行,考虑AC自动机上$dp$? 好吧其实是区间$dp$ 一个直接的想法是维护$f[l][r]0/1$表示是否可以清空$l…

7个相同小球4个不同盒子_【计算启蒙】4个游戏陪娃玩懂“数拆分”,加减法都不用愁!...

前几天我们整理了能锻炼孩子“数-量匹配”知识的家庭生活小游戏:7个家庭数-量匹配小游戏,让孩子摆脱“机械数数”!​mp.weixin.qq.com所以今天,助教就来分享一些借助实物的“数拆分”小游戏吧!已经学会数量对应&#x…

python怎么使用预训练的模型_Keras使用ImageNet上预训练的模型方式

我就废话不多说了,大家还是直接看代码吧! import keras import numpy as np from keras.applications import vgg16, inception_v3, resnet50, mobilenet #Load the VGG model vgg_model vgg16.VGG16(weightsimagenet) #Load the Inception_V3 model in…