你知道吗?广度优先与深度优先只有这一个区别!
你好呀,我是阿德。
我最近在复习二叉树相关内容,看到二叉树的遍历算法,电光火石之间,我突然发现了广度优先与深度优先的本质区别,可以让你一分钟记住这两个算法。
广度优先搜索和深度优先搜索一样,都是可以对二叉树或图进行搜索的算法,都是从起点开始沿着边搜索,一直搜索直到找到指定节点(即终点)。
在此过程中每走到一个节点,就会判断一次它是否为终点。
两者的区别就是,广度优先搜索会根据离起点的距离,按照从近到远的顺序对各节点进行搜索。而深度优先搜索会沿着一条路径不断往下搜索直到不能再继续为止,然后再折返,开始搜索下一条路径。
-
贝尔曼-福特算法((Bellman-Ford) -
狄克斯特拉算法(Dijkstra) -
A* 算法(A-Star)
graph = {}
graph["A"] = ["B", "D", "F"]
graph["B"] = ["C", "E"]
graph["D"] = ["C"]
graph["F"] = ["G", "H"]
graph["C"] = []
graph["E"] = []
graph["G"] = []
graph["H"] = []
deque
来创建一个双端列表,可以实现在列表两端添加(append)和弹出(pop)元素。
from collections import deque
search_queue = deque() # 创建一个节点列表
search_queue += graph["A"] # 表示将"A"的相邻节点都添加到节点列表中
searched
数组来保存搜索过的节点,防止同一个节点被多次搜索。
from collections import deque
def search(start_node):
search_queue = deque()
search_queue += graph[start_node]
searched = [] # 这个数组用于记录检查过的节点
while search_queue: # 只要节点列表不为空
node = search_queue.popleft() # 取出节点列表中最左边的节点
print(node, end=' ') # 打印出当前节点
if not node in searched: # 如果这个节点没检查过
if node == 'G': # 检查这个节点是否为终点"G"
print("\nfind the destination!")
return True
else:
search_queue += graph[node] # 将此节点的相邻节点都添加到节点列表中
searched.append(node) # 将这个节点标记为检查过
# 如果节点列表为空仍没找到终点,则返回False
return False
print(search("A"))
B D F C E C G
find the destination!
True
node = search_queue.popleft() # 取出节点列表中最左边的节点
node = search_queue.pop() # 取出节点列表中最右边的节点
F H G D C B
find the destination!
True
阿德最新文章不错过
程序员阿德
985非科班程序员,自学转行计算机,专注于分享计算机基础知识,从底层提升你的码力。
Official Account