广度优先遍历-BFS

广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点www3....wn,然后再依次访问www3....wn的所有未被访问的邻接顶点;再从这些访问过的顶点出发,再访问它们所有未被访问过的邻接顶点......依次类推,直到图中的所有点都被访问为止。类似的思想还将应用于Dijkstra单源最短路径算法和Prim最小生成树算法。

python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)中的树的层序遍历就用到了BFS的思想

深度优先遍历-DFS

与广度优先遍历不同,深度优先遍历类似于树的先序遍历,正如其名称中所暗含的意思一样,这种搜索算法所遵循的策略是尽可能“深”地搜索一下图。它的基本思想如下:首先访问图中某一点顶点v,然后从v出发,访问与v相邻的点w1,再从w1出发访问w1的邻接点w2....重复上述过程,直到不能继续访问时,依次退回到最近的访问点,若还有未访问的邻接点,从该节点出发,继续上面的访问过程。

下面以一个例题来展示BFS和DFS:

题目描述(2018春招-今日头条笔试题-第二题)

定义两个字符串变量:s和m,再定义两个操作:

第一种操作:m=s         s=s+s

第二种操作:s=s+m

假设s和m,初始如下:

s='a'         m=s

求最小步骤数,可以将s拼接到长度等于n

输入描述

一个整数n,表明我们需要得到s字符串长度,0<n<1000

输出描述

一个整数,表明总共操作次数

输入样例:

输入

6

输出

3

说明:

输入是6,表明我们需要得到s字符串长度为6,也就是s为最终为‘aaaaaa’,那么依次使用2次“第一种操作”和1次“第二种操作”就能达到目的,总共操作次数是3

输入

5

输出

4

说明:

输入是5,表明我们需要得到s字符串长度为5,也就是‘aaaaa’,那么直接使用4次“第二种操作”就能达到目的,总共操作次数是4

BFS

#-*- coding:utf-8 -*-
import datetime
class BFS(object): def __init__(self):
self.num = 0 def fun(self,s,m,n):
stack=[[s,m]]
stack_s =set()#用来存储字符串s的长度
while True:
if n in stack_s:
break
stack_temp=[]
while stack:
temp=stack.pop()
temp_1=[2*temp[0],temp[0]]
temp_2=[temp[0]+temp[1],temp[1]] stack_s.add(2 * temp[0])
stack_s.add(temp[0]+temp[1]) stack_temp.append(temp_1)
stack_temp.append(temp_2)
self.num+=1
stack=stack_temp if __name__=='__main__':
n = input()
i = datetime.datetime.now()
bfs = BFS()
bfs.fun(1, 1,n)
j = datetime.datetime.now()
print bfs.num
print j - i

输入:

10000

输出:

20
0:00:02.296000

DFS:

#-*- coding:utf-8 -*-
import datetime
class DFS(object):
'''
num:用于存储最后执行次数
n:用于存储最后达到的字符串的长度
flag:当达到输入字符串的长度时,flag置为1
'''
def __init__(self,n):
self.num=0
self.n=n
self.flag=0 def fun(self,s,m):
self.fun_1(s,m)
self.fun_2(s,m)
#当未达到字符串长度时,回溯
if self.flag==0:
self.num-=1 #fun_1:方法1
def fun_1(self,s,m):
#当达到字符串长度,直接返回
if self.flag == 0:
if self.n < s:
return
if self.n == s:
self.flag = 1
return
else:
m = s
s += s
self.num += 1
#没达到字符串长度,继续递归
self.fun(s, m)
else:
return # fun_2:方法2
def fun_2(self,s,m):
if self.flag == 0:
if self.n<s:
return
if self.n==s:
self.flag=1
return
else:
s=s+m
self.num+=1
# 没达到字符串长度,继续递归
self.fun(s,m)
else:
return
if __name__=='__main__':
n=input()
i=datetime.datetime.now()
dfs=DFS(n)
dfs.fun(1,1)
j = datetime.datetime.now()
print dfs.num
print j-i

输入:

10000

输出:

20
0:00:00.034000

广度优先遍历-BFS、深度优先遍历-DFS的更多相关文章

  1. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  2. 树的广度优先遍历和深度优先遍历(递归非递归、Java实现)

    在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程.现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1.广度优先遍历 英文缩写为BFS即B ...

  3. 数据结构5_java---二叉树,树的建立,树的先序、中序、后序遍历(递归和非递归算法),层次遍历(广度优先遍历),深度优先遍历,树的深度(递归算法)

    1.二叉树的建立 首先,定义数组存储树的data,然后使用list集合将所有的二叉树结点都包含进去,最后给每个父亲结点赋予左右孩子. 需要注意的是:最后一个父亲结点需要单独处理 public stat ...

  4. 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    参考网址:图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) - 51CTO.COM 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath ...

  5. 【图数据结构的遍历】java实现广度优先和深度优先遍历

    [图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...

  6. 深度优先遍历 and 广度优先遍历

    深度优先遍历 and 广度优先遍历 遍历在前端的应用场景不多,多数是处理DOM节点数或者 深拷贝.下面笔者以深拷贝为例,简单说明一些这两种遍历.

  7. c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)

    一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...

  8. C++ 二叉树深度优先遍历和广度优先遍历

    二叉树的创建代码==>C++ 创建和遍历二叉树 深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. //深度优先遍历二叉树void depthFirstSearch(Tree r ...

  9. 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]

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

  10. [PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现

    1.图的深度优先遍历类似前序遍历,图的广度优先类似树的层序遍历 2.将图进行变形,根据顶点和边的关系进行层次划分,使用队列来进行遍历 3.广度优先遍历的关键点是使用一个队列来把当前结点的所有下一级关联 ...

随机推荐

  1. JAVA技术路线2

    https://www.zhihu.com/question/56110328 1.JavaSE学习视频 http://pan.baidu.com/s/1bp3g6rd2.javaweb的学习视频 h ...

  2. 微信小程序之跨界面传参

    微信小程序在两个之间传参类似js传递url拼接参数,举个例子来说吧 input自己设置参数 //index.wxml <form bindsubmit="formSubmit" ...

  3. AngularJS监听数组变化

    我们在使用angualr的监听时候,业务的需要我们会去监听一个数组的某一个值得变化,再写逻辑代码.然而我们在使用$scope.$watch("",function(){ })时候会 ...

  4. spring boot和mybatis入门

    [size=x-large]昨天讲了一下spring boot的入门操作相信老手已经明白入门的操作,今天我来讲下我自己的心得,可能与官方有一定差异:希望对大家能有用 一:开门见山首先看工程结构 这里的 ...

  5. 2018-04-11 activity周期

    android相机开发 1.Android wifi热点连接过程 2.bindservice和AIDLhttps://blog.csdn.net/zhou_wenchong/article/detai ...

  6. Latex中图表位置的控制

    \begin{figure}[!htbp] 其中htbp是可选的,它们分别代表 !-忽略“美学”标准 h-here t-top b-bottom p-page-of-its-own

  7. 一个封存Id与状态对应键值的神器,BigInteger的setBit和testBit用法实例

    1,首先描述一下应用场景 比如,我们要对菜单做权限,控制不同角色菜单显示与不显示,角色为经理时,我们需要菜单id为 4,7,13,24的菜单显示,别的菜单不显示. 就是说,这时候我们要把4,7,13, ...

  8. (多线程dp)Matrix (hdu 2686)

    http://acm.hdu.edu.cn/showproblem.php?pid=2686     Problem Description Yifenfei very like play a num ...

  9. Beta阶段第一篇 Scrum 冲刺博客

    介绍小组新加入的成员,Ta担任的角色 新成员 担任角色 张晨晨 测试 理由:晨晨代码能力有待提高,但心思细腻有耐心,适合测试工作. 讨论是否需要更换团队的PM 通过团队讨论决定不更换团队PM,理由是在 ...

  10. POJ3273--Monthly Expense(Binary Search)

    Description Farmer John is an astounding accounting wizard and has realized he might run out of mone ...