深度&&广度优先算法

深度&&广度优先算法

1.爬虫系列 深度&广度优先搜索 介绍

1.DFS(Depth-First-Search)深度优先搜索,是计算机术语,是一种在开发爬虫早期使用较多的方法,
是搜索算法的一种。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。
深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到这个HTML文件,再继续选择该HTML文件中的其他超链。
当不再有其他超链可选择时,说明搜索已经结束。
深度优先搜索是一个递归的过程

2.深度优先和广度优先搜索模型
广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS
理解了深度优先搜索,也可以说是纵向,而广度优先搜索可以理解为横向同步搜索。初始点开始后以层次的方式,从第一层的邻接点开始,从第一层的1节点到2节点等。然后第二层的3节点到4节点5节点再三层的5节点到6节点7节点8节点等。

图:


# 深度优先:根左右 遍历
#广度优先: 层次遍历,即一层一层遍历

# 深度优先:根左右 遍历
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:
return
my_queue=[]
node = root
my_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) # 入队列

3.数据结构设计、遍历代码
3.1列表法
根据树形图来实现
# 简述:列表里包含三个元素:根结点、左结点、右结点
my_Tree = [
‘D‘, # 根结点
[‘B‘,
[‘F‘,[],[]],
[‘G‘,[‘E‘,[],[]],[]]
], # 左子树
[‘C‘,
[],
[‘A‘,[‘H‘,[],[]],[]]
] # 右子树
]

# 列表操作函数
#POP(0) 函数用于一处列表中的一个元素(默认最后一个元素),并且返回该元素的值。
#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)
执行结果:为纵向搜索
D
B
F
G
E
C
A
H

广度优先: 层次遍历,一层一层遍历(队列实现)
def level_queue(root):
if not root:
return
my_queue = []
node = root
my_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)

执行结果:结果为横向搜索
D
B
C
F
G
A
E
H

3.2 构建类节点法

# tree类,类变量root为根节点,为str类型
#类变量right/left 为左右节点,为tree型,默认为空
class Tree:
root = ‘‘
right = None
left = None
# 初始化类
def __init__(self,node):
self.root = node

def set_root(self,node):
self.root = node

def 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) # 传入根节点

执行结果:
D
B
F
G
E
C
A
H

读取顺序


#广度优先:层次遍历,一层一层遍历(队列实现)
def level_queue(root):
if root is None:
return
my_queue = []
node = root
my_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

读取顺序


做完深度优先和广度优先策略算法后,返回来讲,主要实现什么?
这两种策略是爬虫系统抓取url的抓取策略,他们决定了爬取的url以什么样的顺序队列进行排列,深度优先就是一条路走到黑,广度优先就是多条并发路线同时进行排列。

原文地址:http://blog.51cto.com/2367685/2349184

时间: 2024-08-01 23:44:40

深度&&广度优先算法的相关文章

深度优先和广度优先算法

1.深度优先算法 遍历规则:不断地沿着顶点的深度方向遍历.顶点的深度方向是指它的邻接点方向. 最后得出的结果为:ABDECFHG. Python代码实现的伪代码如下: 2.广度优先算法: 遍历规则: 1)先访问完当前顶点的所有邻接点.(应该看得出广度的意思) 2)先访问顶点的邻接点先于后访问顶点的邻接点被访问. 最后得出的结果为:ABCDEFGH. Python代码实现的伪代码如下: 3.总结 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二

BFS广度优先算法的思路

广度优先算法的思想是 对所有的Node进行遍历 然后将第一个Node入队列 设置其visited为真 然后 对第一个Node跟其它剩余的Node进行遍历对比 找出连通的Node 并将其visited属性赋值为真 然后将其入队列 接下来对队列里面的Node进行迭代处理 最终完全遍历所有节点

【算法日记】广度优先算法

广度优先算法是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止.广度优先搜索让你能够找出两样东西之间最短的距离.在学习这个算法之前我们要了解图的概念 1.什么是图 如上图所示.图是有节点和边组成的.一个节点可能和很多节点直接相连,这些相

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

算法:深度优先算法和广度优先算法(基于邻接矩阵) 1.写在前面 图的存储结构有两种:一种是基于二维数组的邻接矩阵表示法. 另一种是基于链表的的邻接表. 在邻接矩阵中,可以如下表示顶点和边连接关系: 说明: 将顶点对应为下标,根据横纵坐标将矩阵中的某一位置值设为1,表示两个顶点向联接. 图示表示的是无向图的邻接矩阵,从中我们可以发现它们的分布关于斜对角线对称. 我们在下面将要讨论的是下图的两种遍历方法(基于矩阵的): 我们已经说明了我们要用到的是邻接矩阵表示法,那么我首先要来构造图: 矩阵图的数据

"如何用70行Java代码实现深度神经网络算法" 的delphi版本

http://blog.csdn.net/hustjoyboy/article/details/50721535 "如何用70行Java代码实现深度神经网络算法" 的delphi版本 2016-02-23 10:58 225人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. =====ann.pas源程序=================================== { by 阿甘 2016.2.23 参考自此篇文档如何用70行Java代码实现

深度学习算法实践7---前向神经网络算法原理

总体上来讲,神经网络的算法是比较复杂的,后面有非常精妙的数学原理,而且对这些数学方法,还需要证明其具有收敛性,所以很多神经网络的书籍,绝大部分都是一些数学模型介绍.推导和证明,对于非数学专业的我们来说,感沉像看天书一样.其实神经网络的精髓是将现实中的问题进行抽象,建立适合神经网络表示的模型,然后应用神经网络进行处理,不断调整优化网络结构和参数,直到最终达到满意的效果.所以成功应用神经网络,不需要太过高深的数学基础.但是如果可以适当掌握神经网络背后的数学原理,对于我们理解参数的含义,选择合适的网络

树图 广度优先算法和深度优先算法

原文链接: ????????深度优先算法:http://blog.163.com/zhoumhan_0351/blog/static/3995422720098342257387/ ????????广度优先算法:http://blog.163.com/zhoumhan_0351/blog/static/3995422720098711040303/ 树图 广度优先算法和深度优先算法

深度优先与广度优先算法

图的遍历有深度优先和广度优先算法. 深度优先遍历可描述为一个递归算法.当到达顶点v时,具体操作是: ①访问(v); ②for(与v相邻的每个顶点w) 遍历(w): //深度优先算法 template<int max_size> void Diagraph<max_size>::depth_first(void(*visit)(Vertex &)) const { bool visited[max_size]; //引入数组防止无限循环 Vertex v; for (all

C语言之广度优先算法

广度优先算法又称宽度优先搜索,是一种简便的图的搜索算法之一.搜索方式大致是这样的: 直到搜索到目标节点(节点就是那些圆球球,其中有一个或者多个是目标节点)或者搜完了整个图都没找到目标节点就停止搜索. 实现这个要是想用像深度优先算法那样函数套函数那样是难以实现的(至少我实现不了). 像这样的: 求问从A到B的最短路径的节点数是多少? 这道题很简单嘛,肯定是A-C-B啊,答案是3啊.那怎样用C语言实现呢? 深搜的话:一条路一条路读取,取节点数最小的,也可以,但是问题来了,当节点数特别多,图非常“辽阔