回溯法

回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。

但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,

这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

1.深度优先搜索(DepthFirstSearch)

  深度优先搜索的主要特征就是,假设一个顶点有不少相邻顶点,当我们搜索到该顶点,我们对于它的相邻顶点并不是现在就对所有都进行搜索,

  而是对一个顶点继续往后搜索,直到某个顶点,他周围的相邻顶点都已经被访问过了,这时他就可以返回,对它来的那个顶点的其余顶点进行搜索。

  深度优先搜索的实现可以利用递归很简单地实现。

2.广度优先搜索(BreadthFirstSearch)

  广度优先搜索相对于深度优先搜索侧重点不一样,

  深度优先好比是一个人走迷宫,一次只能选定一条路走下去,

  而广度优先搜索好比是一次能够有任意多个人,一次就走到和一个顶点相连的所有未访问过的顶点,然后再从这些顶点出发,继续这个过程。

具体实现的时候我们使用先进先出队列来实现这个过程:

  1. 首先将起点加入队列,然后将其出队,把和起点相连的顶点加入队列,

  2. 将队首元素v出队并标记他

  3. 将和v相连的未标记的元素加入队列,然后继续执行步骤2直到队列为空

  广度优先搜索的一个重要作用就是它能够找出最短路径,这个很好理解,因为广度优先搜索相当于每次从一个起点开始向所有可能的方向走一步,那么第一次到达目的地的这个路径一定是最短的,而到达了之后由于这个点已经被访问过而不会再被访问,这个路径就不会被更改了。

广度优先遍历是爬虫中使用最广泛的一种爬虫策略,之所以使用广度优先搜索策略,主要原因有三点:

  • 重要的网页往往离种子比较近,例如我们打开新闻网站的时候往往是最热门的新闻,随着不断的深入冲浪,所看到的网页的重要性越来越低。
  • 万维网的实际深度最多能达到17层,但到达某个网页总存在一条很短的路径。而广度优先遍历会以最快的速度到达这个网页。
  • 广度优先有利于多爬虫的合作抓取,多爬虫合作通常先抓取站内链接,抓取的封闭性很强。

遍历二叉树图形

  

# 深度优先: 根左右 遍历
# 广度优先: 层次遍历,一层一层遍历# 深度优先: 根左右 遍历 (递归实现)
def depth_tree(tree_node):if tree_node is not None:print(tree_node._data)if tree_node._left is not None:return depth_tree(tree_node._left)  # 递归遍历if tree_node._right is not None:return depth_tree(tree_node._right)  # 递归遍历# 广度优先: 层次遍历,一层一层遍历(队列实现)
def level_queue(root):if root is None:returnmy_queue = []node = rootmy_queue.append(node)  # 根结点入队列while my_queue:node = my_queue.pop(0) # 出队列print(node.elem)   # 访问结点if node.lchild is not None:my_queue.append(node.lchild)    # 入队列if node.rchild is not None:my_queue.append(node.rchild)    # 入队列

数据结构设计:

列表法:

# 树的数据结构设计
# 1.列表法
# 简述:列表里包含三个元素:根结点、左结点、右结点my_Tree = ['D', # 根结点['B',['F',[],[]],['G',['E',[],[]],[]]],  # 左子树['C',[],['A',['H',[],[]],[]]]   # 右子树
]# 列表操作函数
# pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
# insert() 函数用于将指定对象插入列表的指定位置,没有返回值。# 深度优先: 根左右 遍历 (递归实现)
def depth_tree(tree_node):if tree_node:print(tree_node[0])# 访问左子树if tree_node[1]:depth_tree(tree_node[1])  # 递归遍历# 访问右子树if tree_node[2]:depth_tree(tree_node[2])  # 递归遍历
depth_tree(my_Tree)
# result:
#            D B F G E C A H# 广度优先: 层次遍历,一层一层遍历(队列实现)
def level_queue(root):if not root:returnmy_queue = []node = rootmy_queue.append(node)  # 根结点入队列while my_queue:node = my_queue.pop(0) # 出队列print(node[0])   # 访问结点if node[1]:my_queue.append(node[1])    # 入队列if node[2]:my_queue.append(node[2])    # 入队列
level_queue(my_Tree)
# result :
#           D B C F G A E H

方法二:构造类节点法

#2.构造类
# Tree类,类变量root 为根结点,为str类型
# 类变量right/left 为左右节点,为Tree型,默认为空class Tree:root = ''right = Noneleft = None# 初始化类def __init__(self,node):self.root = nodedef set_root(self,node):self.root = nodedef get_root(self):return self.root# 初始化树
# 设置所有根结点
a = Tree('A')
b = Tree('B')
c = Tree('C')
d = Tree('D')
e = Tree('E')
f = Tree('F')
g = Tree('G')
h = Tree('H')
# 设置节点之间联系,生成树
a.left = h
b.left = f
b.right = g
c.right = a
d.left = b
d.right = c
g.left = e# 深度优先: 根左右 遍历 (递归实现)
def depth_tree(tree_node):if tree_node is not None:print(tree_node.root)if tree_node.left is not None:depth_tree(tree_node.left)  # 递归遍历if tree_node.right is not None:depth_tree(tree_node.right)  # 递归遍历
depth_tree(d)  # 传入根节点
# result:
#            D B F G E C A H# 广度优先: 层次遍历,一层一层遍历(队列实现)
def level_queue(root):if root is None:returnmy_queue = []node = rootmy_queue.append(node)  # 根结点入队列while my_queue:node = my_queue.pop(0) # 出队列print(node.root)   # 访问结点if node.left is not None:my_queue.append(node.left)    # 入队列if node.right is not None:my_queue.append(node.right)    # 入队列
level_queue(d)
# result :
#           D B C F G A E H

本文摘抄自公众号:简说python,本人一直跟着学习的一个公众号.

转载于:https://www.cnblogs.com/jjb1997/p/11403967.html

广度优先和深度优先算法相关推荐

  1. 利用广度优先和深度优先算法解决迷宫问题【算法设计与分析】<图搜索问题>

    实验问题: 给定一个n*n的迷宫,要求利用广度优先和深度优先算法解决迷宫问题 问题分析: 对于此问题首先要明确搜索顺序 可以分为两种方法求解问题:1.广度优先算法2.深度优先算法 (1)对于深度优先算 ...

  2. python爬虫算法深度优先遍历_爬虫的广度优先和深度优先算法

    广度优先算法介绍 整个的广度优先爬虫过程就是从一系列的种子节点开始,把这些网页中的"子节点"(也就是超链接)提取出来,放入队列中依次进行抓取.被处理过的链接需要放 入一张表(通常称 ...

  3. (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)

    链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构   队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...

  4. BFS广度优先算法, DFS深度优先算法,Python,队列实现,栈实现

    来源:https://www.bilibili.com/video/BV1Ks411575U/?spm_id_from=333.788.videocard.0 BFS广度优先算法 graph = {& ...

  5. 应对笔试手写代码,如何准备深度优先算法 广度优先算法?

    应对笔试手写代码,如何准备深度优先算法 & 广度优先算法? 1. 什么是深度优先算法?什么又是广度优先算法? 2. 广度优先算法使用场景 3. 广度优先算法模板 4. 深度优先算法使用场景 5 ...

  6. ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)(三)

    本文为:ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)第三篇 深度优先算法(DFS)和广度优先算法(BFS):DFS 和 BFS 在 ES 中的应用(一) 深度优先算法(DF ...

  7. 深度优先算法和广度优先算法

    深度优先算法和广度优先算法 介绍 图的定义 邻接表 邻接矩阵 广度优先算法 广度优先算法的实现 广度优先算法的应用 深度优先算法 深度优先算法的实现 后续 介绍 在数据结构中,树和图可以说是不可或缺的 ...

  8. 浅谈网络爬虫中广度优先算法和深度优先算法

    前言 做爬虫的,最怕业务简单粗暴的来一句"爬一下XXXX网".比如,"爬一下央广网"(示例链接:http://www.cnr.cn),看着密密麻麻的各种子分类, ...

  9. 深度优先算法和广度优先算法(python)

    深度优先算法:深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条 ...

最新文章

  1. ChinaDNS 结合DNSMasq防dns挟持
  2. 四、Delphi 2009 泛型容器单元(Generics.Collections)[3]: TStackT
  3. zeros什么意思_ma=zeros(n);是什么意思'
  4. PHP 序列化(serialize)格式详解
  5. c# union结构体_P/Invoke各种总结(八、在C#中使用Union联合体)
  6. 中国计量学院全国计算机二级报名,中国计量大学教务管理系统入口https://jwc.cjlu.edu.cn/...
  7. mysql数据库什么情况下会锁表_mysql数据库锁的产生原因及解决办法
  8. 光流(一)--综述概览
  9. jQuery对表格的操作
  10. matplotlin 入门
  11. 计算机软件it是什么职业,it行业是什么工作做什么的?属于信息技术产业(工资可观)...
  12. Spark 高难度对话 SQL Server - 续篇
  13. 心灵捕手~ 鸡汤悄悄话
  14. ics服务启动失败的一种解决方法
  15. 内蒙古对口升学2018年计算机,2018年届对口升学考试计算机专业月考三试题.doc
  16. Unsupervised Domain Adaption of Object Detectors : A Survey
  17. 微信支付 postman_微信刷脸支付补贴政策有哪些?
  18. OpenMV学习(0):环境搭配
  19. 二级java pdf_全国计算机等级考试二级Java语言程序设计.PDF
  20. 前端工作越来越难找,是不是已经饱和了?

热门文章

  1. Android 无法mkdir()创建文件夹
  2. Android Studio 安卓sqlite数据库查询
  3. 恭贺CDGA认证学员91%顺利通过5月21日DAMA考试!
  4. Unity基础——光源类型
  5. java jb_java+JBroFuzz对restful api进行fuzz测试
  6. ubuntu中卸载没有安装完全的软件包
  7. Python好用的VSCode插件
  8. manifest文件的常用配置项
  9. 迁移学习:《SHARPNESS-AWARE MINIMIZATION FOR EFFICIENTLY IMPROVING GENERALIZATION》
  10. 神经网络 - RBF神经网络与BP网络优缺点比较 - 机器学习基础知识