白线疝

首页 » 常识 » 常识 » 原创教程数据结构与算法5广度与深
TUhjnbcbe - 2020/12/7 23:29:00
一、广度优先搜索

广度优先搜索(BFS,BreadthFirstSearch)的一个常见应用是找出从根结点到目标结点的最短路径,其实现用到了队列。下面用一个例子来说明BFS的原理,在下图中,我们BFS来找出根结点A和目标结点G之间的最短路径。

图3:BFS例子

首先初始化一个队列Q,将根节点入队:A

A出队,将与A相邻的节点入队,此时队列为BCD

B出队,将与B相邻的节点入队,此时队列为CDE

C出队,将与C相邻的节点入队,此时队列为DEF(节点E已经被遍历过,不需要再入队)

D出队,将与D相邻的节点入队,此时队列为EFG

E出队,下面没有节点

F出队,下面是G,已遍历过,为目标值,遍历结束

BFS代码模板:

defBFS(graph,start,end):  queue=[]  queue.append([start])  visited.add(start)  #对于图来说,要标记节点已经被访问过,防止重复访问    whilequeue:    node=queue.pop()  #出队    visited.add(node)  #标记访问        process(node)  #对节点进行一些处理    nodes=generate_related_nodes(node)  #得到当前节点的后继节点,并且没有被访问过    queue.push(nodes)  #其他处理部分  ...二、深度优先搜索

与BFS类似,深度优先搜索(DFS,Depth-First-Search)也可用于查找从根结点到目标结点的路径。下面通过一个例子,用DFS找出从根结点A到目标结点G的路径。

图3:BFS例子

在上面的例子中,我们从根结点A开始。首先,我们选择结点B的路径,并进行回溯,直到我们到达结点E,我们无法更进一步深入。然后我们回溯到A并选择第二条路径到结点C。从C开始,我们尝试第一条路径到E但是E已被访问过。所以我们回到C并尝试从另一条路径到F。最后,我们找到了G。虽然我们成功找出了路径A-C-F-G,但这不是从A到G的最短路径。

DFS代码模板:

#递归写法visited=set()defDFS(node,visited):  visited.add(node)  #processcurrentnodehere  ...  fornext_nodeinnode.children():    ifnext_nodenotinvisited:      DFS(next_node,visited)三、例题(1)岛屿数量问题

此题为leetcode的第题(

1
查看完整版本: 原创教程数据结构与算法5广度与深