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

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

关于搜索&遍历

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

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

那么我们先把搜索整个先化简情况,我们就收缩到在树的这种情况下来进行搜索。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,一经查实,立即删除!

相关文章

element 日期控件 限制开始日期和结束日期

基于element ui中的时间日期控件的开始日期和结束日期的限制用picker-options属性&#xff0c; 当前日期时间器特有的选项。 代码如下&#xff1a; <el-form-itemlabel"开始日期"label-width"90px"prop"startDate"><el-date-pickerv-mo…

JArchitect v2017发布!

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

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

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

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

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

用友UI层获取机构的方法

U层&#xff1a; UFIDA.U9.UI.PDHelper.PDContext.Current.OrgIDPDContext.Current.OrgRef.CodeColumn 转载于:https://www.cnblogs.com/Xanthus/p/11556836.html

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

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

python声明编码格式_使用python将doc文件转为utf8编码格式的txt

最近花了点时间看了会doc的转换&#xff0c;果然官方文档最好用&#xff0c;代码如下&#xff1a; import os import sys import fnmatch import win32com.client PATH os.path.abspath(os.path.dirname(sys.argv[0])) doc_path PATH ‘/data/doc/’ txt_path PATH ‘/dat…

49反思

感谢自闭场 转载于:https://www.cnblogs.com/znsbc-13/p/11565800.html

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

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

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

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

python获取某文件路径_Python获取当前文件路径

一. Python 获取当前文件路径方法 2. sys.path[0] 获取文件当前工作目录路径&#xff08;绝对路径&#xff09; sys.argv[0]|获得模块所在的路径&#xff08;由系统决定是否是全名&#xff09; 若显示调用python指令&#xff0c;如python demo.py&#xff0c;会得到绝对路径; 若…

Java认证值得吗?

在任何行业中获得证书总是有其利弊&#xff0c;但似乎在技术世界中&#xff0c;情况更加动荡。 对熟练的技术人员的需求如此&#xff0c;进入该行业的途径很多&#xff0c;包括学术认证方法和更自学的基于投资组合的方法。 但是Java认证是否值得追求以促进您的职业发展&#xf…

管理任务执行-有效执行

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

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

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

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

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

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

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

贪心只能过样例 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]…

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

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

配置phoenix连接hbase_Phoenix视图映射

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

消防 直径性质

题目大意 先放直径性质(转自刀与玫瑰) 1.直径两端点一定是叶子节点。 2.距任意点最远点一定是直径的端点&#xff0c;据所有点最大值最小的点一定是直径的中点。 3.两棵树相连&#xff0c;新直径的两端点一定是原四个端点中的两个 4.两棵树相连&#xff0c;新直径长度最小为max…