python-广度优先搜索

 广度优先搜索

下面我们来来BFS算法策略:

 

  比如:我们要从双子峰---->金门大桥,最短路径如何?

  我们利用广度优先搜索来一步步求解,注意广度优先搜索在于的关键在于“广”,也就是说以双子峰为起点,我们要尽可能的多比较与之相邻的周边路径,从其中选取一条最优路径。

  第一步:

  

我们沿着两个箭头方向路径探索到a点和b点后,发现并没有到达想要去的地方,于是我继续往下探索。

  

同样,我们发现还没有到达目的地,继续往下探索。

  

  到达这一步后,我们发现其中有一条路径已经到达金门大桥,而其他两条路径仅仅到达c点。因此,我们寻找到的最短路径为:双子峰->a->c->金门大桥。

  所以,由上我们可以知道,广度优先搜索其实就是用来探索最短路径的一种方式。

  根据上面实例,我们想要寻找一条到某地的最短路径,需要一下两个步骤:

    (1)使用图来建立问题模型。

    (2)使用广度优先搜索解决问题。

  利用广度优先搜索,我们可以回答两个问题:

    1.从节点A出发,有前往B节点的路径吗?

    2.从节点A出发,前往B节点哪条路径最短?

 首先,我们来看看如何构建一张图。

   这里我们要使用一种能够表示映射关系的数据结构---散列表。至于什么是散列表,这里就不再赘述。

  例如:

    

    graph = {}

    grapu[‘you‘] = [‘alice‘,‘bob‘,‘mar‘,‘rain‘,‘cat‘]

    这里的“you”被映射到一个数组。在‘you‘的这个数组里面,包含所有与你相邻的元素。

      有了以上方式,我们就可以构建一张更大图。

 算法实现策略:

    

    首先,创建一个双端队列,将需要查找的压入队列中。

   from collections import deque

   def person_is_seller(name):

      return name[-1] == ‘m‘  #如果这个名字是以M结尾,则是

   graph = {}

   grapu[‘you‘] = [‘alice‘,‘bob‘,‘mar‘,‘rain‘,‘cat‘]

   search_queue = deque()  #创建一个队列

     search_queue += graph[‘you‘] #将you压入队列

   while search_queue:  #只要队列不为空

      person = search_queue.popleft()  #取出左边第一个人

      if person_is_seller(person):  #检查这个人是否为芒果商

        print person += ‘ is a mango seller! ‘

        return True

      else:

        search_queue += graph[person]  #将这个人的朋友加入队列

      return False  #没有芒果商  

   但是,上面算法有一个明显的问题,如果你的朋友alice和bob都有这一个好友,那么在查找的过程中就会陷入循环状态。要解决这个问题,我们可以设置一个列表,来标记那些已经被查找过的人。因此,最终代码如下:

      def search(name):

        search_queue = deque()  #创建一个队列

          search_queue += graph[name] #将需要查找的压入队列

                 searcher = []  # 用于记录已经查找过的

        while search_queue:  #只要队列不为空

            person = search_queue.popleft()  #取出左边第一个人

            if not person in searched:   #当这个人不在searched中才继续往下查找

              if person_is_seller(person):  #检查这个人是否为芒果商

                print person += ‘ is a mango seller! ‘

                return True

              else:

                search_queue += graph[person]  #将这个人的朋友加入队列

                searched.append(person)

        return False  #没有芒果商 

 性能分析:

    首先沿着每条边进行查找,如果边数为n,查找效率为O(V)

    再次,我们在每次查找过程中需要对已经搜索的列表进行二次判断,判断所需时间为P(n)

    因此,广度优先搜索总的查找效率为O(V+n)

  

时间: 2024-12-18 19:06:02

python-广度优先搜索的相关文章

广度优先搜索(BreadthFirstSearch)& 迪克斯特拉算法 (Dijkstra's algorithm)

BFS可回答两类问题: 1.从节点A出发,有前往节点B的路径吗? 2.从节点A出发,前往节点B的哪条路径经过的节点最少? BFS中会用到“队列”的概念.队列是一种先进先出(FIFO, first in first out)的数据结构,与栈不同,栈是后进先出(LIFO, last in first out)的数据结构. 还会用到“字典”的概念.字典在现在很多语言中都存在且广泛使用,字典中的元素是一组<键(key),值(value)>对,key的值是不可以重复的.关于字典的详细内容,网上有很多资料

无向图的深度优先与广度优先搜索代码实现

图采用了邻接表的形式储存. 带不带权都无所谓的 深度优先搜索 Depth First Search 道理和树的先序遍历差不多,把将要访问的点入栈,然后从栈里取点进行访问. 由于这只是类中的一个成员函数,有些被调用的函数的具体代码将会在文章最后补上 ,但是函数功能看注释就好了 1 //深度优先 2 void GraphAdjacencyListWeight::DFSAdvanced(int StartVertex) { 3 int *visited = new int[VertexNumber];

python模块搜索路径

1.电脑版 (1).python安装目录中\Lib\site-packages\下建立*.pth文件,写入模块路径 (2).添加环境变量:变量名:pythonpath;变量值:模块(文件夹)路径 ,若有多个,用半角分号";"隔开 2.手机版 在resource\site.py文件中添加代码段 import syssys.path.append("模块(文件夹)路径") 发现:第一个参数都是C:\\resource 我的理解: 程序安装盘下的site.py指定模块路径

SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

图算法系列-深度优先搜索与广度优先搜索

2.深度优先搜索 为了访问一个顶点,我们将它标记为已经访问过,然后递归的访问所有与子邻接的并且尚未标记的顶点,这就是深度优先搜索(DFS),DFS常用于解决路径问题. 比如下面的连通图,我们从顶点0开始对图进行探索 下面这个图显示了DFS处理时的递归调用树. DFS可以解决的问题:1)环检测:一个图中有环吗?该图是森林吗?2)简单路径:给定两个顶点,是否存在一条连接他们的路径3)简单连通性:无论何时使用DFS,都可以在线性时间内确定一个图是否连通4)顶点搜索:在给定顶点所在的同一个连通分量中有多

图的遍历(深度优先与广度优先搜索两种方案)

1.图的遍历--深度优先搜索 import java.util.Scanner ; public class Map{ static int n ; static int m ; static int[] book ; static int[][] e ; public static void mapDfs(int cur){ //深度优先搜索思想核心: System.out.print(cur + " ") ; for (int i=1;i<=n;i++) { if (e[cu

矩阵图中的广度优先搜索

经常会有类似的题目,如迷宫问题,在一个矩阵图中给定出发点和目标点,每次只能上下左右移动,求到目标点的最短走法,或者说是一共有多少种走法. 思路其实很简单,深搜.广搜.相对比较而言,广度优先搜索更加实用于求最短的走法(步数) 在矩阵图中的广搜需要注意一下几点. 1.确定每步的走法:不同题的走法可能不同,每次搜索时将走法保存在数组中. 2.确定初始状态 往往注意刚开始得起点(i,j)必须把MAP(i,j)改变为 -1(或者其他的),栈中第一个元素即为初始状态 3.保存状态.这点很重要.需要用数组或者

地牢逃脱(BFS(广度优先搜索))

题目描述 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上.地牢的出口可能在任意某个可以通行的位置上.牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢. 输入描述: 每个输入包含 1 个测试用例.每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 50),表示

图的广度优先搜索(BFS)

把以前写过的图的广度优先搜索分享给大家(C语言版) 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX_VERTEX_NUM 20 4 #define MAXQSIZE 100 5 #define OK 1 6 typedef char VertexType; 7 typedef int QElemType; 8 9 typedef struct ArcNode//边结点 10 { 11 int adjvex; 12 str