首页 > 编程知识 正文

python图的深度优先遍历,深度优先和广度优先算法

时间:2023-05-06 18:49:29 阅读:16296 作者:3552

Python的广度优先和深度优先(以下是个人学习后的理解。 作为参考,如果有错误的地方的话,欢迎大人物的指出) )。

宽度优先搜索和深度优先搜索是图表扫描两种算法,宽度和深度的不同在于对节点的扫描顺序不同。

(因为个人情节水平有限,所以带来了别人的图) )。

首先是广度优先搜索(BFS)

宽度优先最有用的性质是生成从可扫描的中心节点到扫描的节点的最短路径,其在确定无权图的最短路径时是非常有用的(因为该图没有权重,所以不考虑)。

看看刚才的图吧。 以a为起点,我们要找的是另一个节点,比如g。 那么,在宽度优先搜索的情况下,下一次扫描的是b、c、d。 (遍历顺序可以是随机的,候选顶点由先进先出(FIFO )管理,python有队列,可以直接操作)如果找不到遍历,则下一步将遍历并找到e、f、g、h、I、j

值得注意的是,宽度优先搜索的特征是从起点到近到远进行广泛的搜索。 因此,目标顶点离起点越近,搜索的结束速度就越快。 就像for循环的列表。 名单上有一万个。 但是,我们只要找到500这个数量就结束了。 也就是说,如果找到500,则在整个循环结束之前不继续循环,而是直接断开以结束循环。

附上基于python的广度优先的代码:

导入队列#在本例中,我们使用python的队列模块defbfs(adj,start ) : visited=set ) #创建了一个记录遍历元素的集合。 然后,如果遇到相同的元素,则跳过遍历q=queue.queue(#创建队列q.put ) start。 入队while not q.empty ) ) : # )确定是否为空,如果为空,退出循环u=q.get ) #,将print(u出队, #其中adj.get[u] 在这种情况下,for循环遍历空列表if v not in visited: #,同时visited.add(v ) q.put(v ) v ) graph={ 13: [ 4,2 ],2:

深度优先搜索和广度优先搜索一样,是搜索图的算法,以从起点开始搜索到达指定的顶点(终点)为目的。 深度优先搜索继续搜索直到沿着一个路径不再继续,然后折回,开始搜索下一候选路径。

看看刚才的图吧。 以a为起点,我们要找的是另一个节点,如g,下一个要找的节点是b、c、d中的一个节点。 如果扫描的是b的话,接下来要找的是e、k; 的总体搜索顺序为a、b、e、k、f、c和h。

深度优先搜索的特点是沿着一条路径不断下降,进行深度搜索。 宽度优先搜索和深度优先搜索在搜索顺序上有很大差异,但在操作步骤中,只选择哪个候补顶点作为下一个顶点的基准不同。

宽度优先搜索最早选择成为候补的顶点,由于顶点离起点越近越早成为候补,所以从距离起点近的地方开始依次搜索; 另一方面,深度优先搜索选择了新候选的顶点,所以向下,沿着新发现的路径继续深入搜索。

附加python深度优先的代码:

defDFS(adj,start ) : visited=set ) )创建一个记录遍历元素的集合,然后如果遇到相同元素,则跳过遍历stack=[[start,0]# next_child_idx(=stack[-1]if ) vnotinadj ) or (next _ child _ idx=len ) adj[v] )路径不存在,或指向下一个子节点[1]=1判断是否通过了if next _ childinvisited 3360 #,下一个循环continueprint(next_child ) visited.add (next _ child ) start _ stad 0] )跳graph={ 1333333 } 43360 [5] } DFS (graph,1 )正文可参考此博客查看以下原文: https://www.cn blogs.com/checher

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。