广度优先搜索(BFS)与深度优先搜索(DFS)

一.广度优先搜索(BFS)

1.二叉树代码

# 实现一个二叉树
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneself.nexts = []root_node = TreeNode(1)
node_2 = TreeNode(2)
node_3 = TreeNode(3)
node_4 = TreeNode(4)
node_5 = TreeNode(5)
node_6 = TreeNode(6)
node_7 = TreeNode(7)
node_8 = TreeNode(8)
node_9 = TreeNode(9)
node_10 = TreeNode(10)def littleTree(root, left, right):root.left = leftroot.right = rightif root.left:root.nexts.append(root.left)if root.right:root.nexts.append(root.right)# print(root.left)# print(root.right)# print(root.nexts)littleTree(root_node, node_2, node_3)
littleTree(node_2, node_4, node_5)
littleTree(node_5, node_10, None)
print('===root_node:', root_node.left)
print('===root_node:', root_node.right)
print('===root_node:', root_node.nexts)
print('===root_node.left.left:', root_node.left.left)
print('===root_node.left.right:', root_node.left.right)
print('===root_node.left.nexts:', root_node.left.nexts)

其是一层一层来,结果不唯一

2.字典实现bfs 

graph ={'A':['B', 'C'],'B':['C', 'D'],'C':['B','E'],'D':['B','E','F'],'E':['C','D'],'F':['D']}def BFS(graph,node):quene = []quene.append(node)seen = set()seen.add(node)res = []while len(quene):verix = quene.pop(0)nodes = graph[verix]for node_ in nodes:if node_ not in seen:quene.append(node_)seen.add(node_)# print('==verix:', verix)res.append(verix)return resres = BFS(graph, node='A')
print('===res:', res)

3.延展:求节点和节点之间的最短路径, 通过构建节点的前一个节点 成对,
求A到E的最短路径,通过从A开始构建节点对,在从E逆序找就OK

graph ={'A':['B', 'C'],'B':['C', 'D'],'C':['B','E'],'D':['B','E','F'],'E':['C','D'],'F':['D']}#延展求节点和节点之间的最短路径, 通过构建节点的前一个节点 成对,
#求A到E的最短路径,通过从A开始构建节点对,在从E逆序找就OK
def BFS(graph,node):quene = []quene.append(node)seen = set()seen.add(node)parent={}parent[node] = Noneres = []while len(quene):verix = quene.pop(0)nodes = graph[verix]for node_ in nodes:if node_ not in seen:quene.append(node_)seen.add(node_)parent[node_] = verix# print('==verix:', verix)res.append(verix)return res,parentres, parent = BFS(graph, node='A')
print('===res:', res)
print('===parent', parent)#求A到E的最短路径
v = 'E'
while v is not None:print('v:', v)v = parent[v]

 

4.BFS代码二叉树实现

# 实现一个二叉树
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneself.nexts = []root_node = TreeNode(1)
node_2 = TreeNode(2)
node_3 = TreeNode(3)
node_4 = TreeNode(4)
node_5 = TreeNode(5)
node_6 = TreeNode(6)
node_7 = TreeNode(7)
node_8 = TreeNode(8)
node_9 = TreeNode(9)
node_10 = TreeNode(10)def littleTree(root, left, right):root.left = leftroot.right = rightif root.left:root.nexts.append(root.left)if root.right:root.nexts.append(root.right)# print(root.left)# print(root.right)# print(root.nexts)littleTree(root_node, node_2, node_3)
littleTree(node_2, node_4, node_5)
littleTree(node_5, node_10, None)
print('===root_node:', root_node.left)
print('===root_node:', root_node.right)
print('===root_node:', root_node.nexts)
print('===root_node.left.left:', root_node.left.left)
print('===root_node.left.right:', root_node.left.right)
print('===root_node.left.nexts:', root_node.left.nexts)def bfs(node):if node is None:returnqueue = []#nodeSet = set()queue.insert(0, node)#nodeSet.add(node)print('==queue:', queue)while queue:cur = queue.pop()            # 弹出元素print('==cur.val:', cur.val)# 打印元素值for next in cur.nexts:    # 遍历元素的邻接节点queue.insert(0, next)bfs(root_node)

构建的二叉树  bfs遍历为:1-2-3-4-5-10

 

二.深度优先搜索(DFS)

其是一条路走到黑,结果不唯一

graph ={'A':['B', 'C'],'B':['C', 'D'],'C':['B','E'],'D':['B','E','F'],'E':['C','D'],'F':['D']}def DFS(graph,node):stack = []stack.append(node)seen = set()seen.add(node)res = []while len(stack):verix = stack.pop()nodes = graph[verix]for node_ in nodes:if node_ not in seen:stack.append(node_)seen.add(node_)# print('==verix:', verix)res.append(verix)return resres = DFS(graph, node='A')
print('===res:', res)

1.dfs递归写法

# 实现一个二叉树
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneself.nexts = []root_node = TreeNode(1)
node_2 = TreeNode(2)
node_3 = TreeNode(3)
node_4 = TreeNode(4)
node_5 = TreeNode(5)
node_6 = TreeNode(6)
node_7 = TreeNode(7)
node_8 = TreeNode(8)
node_9 = TreeNode(9)
node_10 = TreeNode(10)def littleTree(root, left, right):root.left = leftroot.right = rightif root.left:root.nexts.append(root.left)if root.right:root.nexts.append(root.right)# print(root.left)# print(root.right)# print(root.nexts)littleTree(root_node, node_2, node_3)
littleTree(node_2, node_4, node_5)
littleTree(node_5, node_10, None)
print('===root_node:', root_node.left)
print('===root_node:', root_node.right)
print('===root_node:', root_node.nexts)
print('===root_node.left.left:', root_node.left.left)
print('===root_node.left.right:', root_node.left.right)
print('===root_node.left.nexts:', root_node.left.nexts)#递归实现dfs
def dfs1(node):if node is None:return Noneprint('==node.val:', node.val)for next in node.nexts:dfs1(next)dfs1(root_node)

 

2.dfs压栈写法 

# 实现一个二叉树
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneself.nexts = []root_node = TreeNode(1)
node_2 = TreeNode(2)
node_3 = TreeNode(3)
node_4 = TreeNode(4)
node_5 = TreeNode(5)
node_6 = TreeNode(6)
node_7 = TreeNode(7)
node_8 = TreeNode(8)
node_9 = TreeNode(9)
node_10 = TreeNode(10)def littleTree(root, left, right):root.left = leftroot.right = rightif root.left:root.nexts.append(root.left)if root.right:root.nexts.append(root.right)# print(root.left)# print(root.right)# print(root.nexts)littleTree(root_node, node_2, node_3)
littleTree(node_2, node_4, node_5)
littleTree(node_5, node_10, None)
print('===root_node:', root_node.left)
print('===root_node:', root_node.right)
print('===root_node:', root_node.nexts)
print('===root_node.left.left:', root_node.left.left)
print('===root_node.left.right:', root_node.left.right)
print('===root_node.left.nexts:', root_node.left.nexts)def dfs2(node):if node is None:return# nodeSet = set()stack = []print('===node.val:', node.val)# nodeSet.add(node)stack.append(node)while len(stack):cur = stack.pop()               # 弹出最近入栈的节点print('==cur.val:', cur.val)  # 打印元素值for next in cur.nexts:         # 遍历该节点的邻接节点# if next not in nodeSet:    # 如果邻接节点不重复# stack.append(cur)       # 把节点压入stack.append(next)      # 把邻接节点压入# nodeSet.add(next)  # 登记节点dfs2(root_node)

dfs压栈写法过程

 

上述两种算法在搜索引擎中的应用

3.延展 递归求图中的起始点到终止点所有路径以及最短路径

# 找到所有从start到end的路径
def findAllPath(graph, start, end, path=[]):path = path + [start]if start == end:return [path]paths = []for node in graph[start]:if node not in path:newpaths = findAllPath(graph, node, end, path)for newpath in newpaths:paths.append(newpath)return paths
# # 查找最短路径
def findShortestPath(graph, start, end, path=[]):path = path + [start]if start == end:return pathshortest_path = []for node in graph[start]:if node not in path:new_path = findShortestPath(graph, node, end, path)if len(new_path):if not len(shortest_path) or len(new_path)<len(shortest_path):shortest_path = new_pathreturn shortest_pathgraph ={'A': ['B', 'C'],'B': ['A', 'C', 'D'],'C': ['A', 'B', 'D', 'E'],'D': ['B', 'C', 'E', 'F'],'E': ['C', 'D'],'F': ['D']}allpath = findAllPath(graph, 'A', 'F')
print('\n所有路径:', allpath)shortpath = findShortestPath(graph, 'A', 'F')
print('\n最短路径:', shortpath)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

骁龙855在AI性能上真的秒杀麒麟980?噱头而已

来源&#xff1a;网易智能摘要&#xff1a;前段时间的高通发布会上&#xff0c;有关骁龙855 AI性能达到友商竞品两倍的言论可谓是赚足了眼球。高通指出&#xff0c;骁龙855针对CPU、GPU、DSP都进行了AI计算优化&#xff0c;结合第四代AI引擎可以实现每秒超过7万亿次运算&#x…

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 转载

http://heylinux.com/archives/1004.html MySQL主从复制&#xff08;Master-Slave&#xff09;与读写分离&#xff08;MySQL-Proxy&#xff09;实践 Mysql作为目前世界上使用最广泛的免费数据库&#xff0c;相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中&am…

深度解析AIoT背后的发展逻辑

来源&#xff1a;iotworld摘要&#xff1a;AI与IoT融合领域近年来一片火热&#xff0c;不论是资本市场&#xff0c;还是大众创业&#xff0c;无不对其表现出极大的热情。AIoT领域中人机交互的市场机会自2017年开始&#xff0c;“AIoT”一词便开始频频刷屏&#xff0c;成为物联网…

ubuntu安装Redis+安装mysql(配置远程登录)+安装jdk+安转nginx+安转teamviewer+安装terminator+安装sublime

一&#xff0e;Ubuntu 安装 Redis sudo apt-get update sudo apt-get install redis-server redis-server 启动 修改redis配置 远程访问: sudo vim /etc/redis/redis.conf 注释掉本机ip: 有坑的地方 #bind 127.0.0.1  service redis-server restart redis-cli ping …

深入理解SQL注入绕过WAF与过滤机制

知己知彼&#xff0c;百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 本文小结 0x6 参考资料 0x0 前言 促使本文产生最初的动机是前些天在做测试时一些攻击向量被WAF挡掉了&#xff0c;…

预测|麦肯锡预测2030年:1亿中国人面临职业转换,全球8亿人被机器人取代

来源&#xff1a;先进制造业摘要&#xff1a;纵观人类技术的发展历程&#xff0c;往往遵循一个固定的规律&#xff0c;即先是概念萌芽&#xff0c;然后经历市场炒作&#xff0c;资本蜂拥&#xff0c;结果潮水退去&#xff0c;泡沫破灭。而繁华落尽后&#xff0c;才会经历技术成…

计算polygon面积和判断顺逆时针方向的方法

一&#xff0e;利用shapely求polygon面积 import shapelyfrom shapely.geometry import Polygon, MultiPoint # 多边形# box1 [2, 0, 4, 2, 2, 4, 0, 2, 0, 0]box1 [2, 0, 4, 2, 2, 4, 0, 2, 2, 2]poly_box1 Polygon(np.array(box1).reshape(-1,2))print(poly_box1)print(p…

亚洲与非洲:中国支付巨头的海外进击

来源&#xff1a;资本实验室摘要&#xff1a;当下&#xff0c;对国人消费影响最大的两家互联网公司莫过于阿里巴巴和腾讯。这两大公司将大量消费级应用整合在自身的平台上&#xff0c;已经彻底改变了许多人的餐饮、购物、出行、旅游等生活方式&#xff0c;而移动支付是其中最基…

利用已有的标注文字信息制作fake数据

from PIL import Image, ImageDraw, ImageFont, ImageFilter import random import glob import numpy as np import os import cv2 from nespaper_semantics import seg_str 1. 从文字库随机选择10个字符 2. 生成图片 3. 随机使用函数# 从字库中随机选择n个字符 def sto_choic…

汽车芯片:半导体芯片巨头加速成长

来源&#xff1a;乐晴智库精选伴随汽车智能化提速&#xff0c;汽车半导体加速成长。2017年全球汽车销量9680万辆(3%);汽车半导体市场规模288亿美元(26%)&#xff0c;增速远超整车。汽车半导体按种类可分为功能芯片MCU(MicrocontrollerUnit)、功率半导体(IGBT、MOSFET等)、传感器…

将MSRA-TD500标签转换成逆时针输出标签+labeleme json格式转四个点的txt

一&#xff0e;MSRA-TD500 : http://www.iapr-tc11.org/mediawiki/index.php/MSRA_Text_Detection_500_Database_%28MSRA-TD500%29 #coding:utf-8 """ fzh created on 2019/12/6 将MSRA-TD500数据标签转换成按逆时针输出 也即  index,difficulty label,x,y,w…

一文看尽2018全年AI技术大突破

来源&#xff1a;量子位摘要&#xff1a;2018&#xff0c;仍是AI领域激动人心的一年。这一年成为NLP研究的分水岭&#xff0c;各种突破接连不断&#xff1b;CV领域同样精彩纷呈&#xff0c;与四年前相比GAN生成的假脸逼真到让人不敢相信&#xff1b;新工具、新框架的出现&#…

pyecharts地图使用

1.首先安装包 pip install pyecharts0.5.1 2.安装地图包 依次是全球地图、中国省级地图、中国市级地图、中国区县级地图、中国区域地图 pip install echarts-countries-pypkg pip install echarts-china-provinces-pypkg pip install echarts-china-cities-pypkg …

《科学》:基因编辑婴儿入选年度“科学崩坏”事件

来源&#xff1a;知识分子摘要&#xff1a;《科学》杂志每年会评出在即将过去的一年里最为重要的十大科学突破&#xff08;Science Breakthrough&#xff09;。今年&#xff0c;夺得年度突破桂冠的是“单细胞水平细胞谱系追踪技术”&#xff0c;帮助破获多起悬案的法医系谱技术…

利用scipy包计算表格线的峰值,还原表格得到表格结构

1. 利用scipy包计算表格线的峰值 import cv2 import numpy as np from scipy.signal import find_peaks, peak_widthsdef get_lines_from_image(img_bin, axis, kernel_len_div 20, kernel_len None, iters 3):""":param img_bin: opencv img:param axis: 0…

原子智库 | 刘伟:人工智能快追上人类思维?答案可能让你失望

来源&#xff1a;原子智库摘要&#xff1a;2018年12月15日&#xff0c;原子智库主办的“改革的规则与创新——2018光华腾讯经济年会暨风云演讲”在北京大学举办北京邮电大学人机交互与认知工程实验室主任刘伟发表演讲。演讲的话题是未来工业化发展、智能化发展。刘伟在演讲中指…

利用xlwt写excel并进行单元格的合并

1.写入行列值 import xlwt # 创建一个workbook 设置编码 workbook xlwt.Workbook(encodingutf-8) # 创建一个worksheet worksheet workbook.add_sheet(My Worksheet)# 写入excel # 参数对应 行, 列, 值 worksheet.write(1, 0, label this is test)# 保存 workbook.save(Exc…

为了边缘计算,亚马逊、谷歌、微软已正面交锋!

来源&#xff1a;全球物联网观察摘要&#xff1a;so&#xff0c;你真的了解边缘计算吗&#xff1f;边缘计算的前世今生云计算自2005年提出之后&#xff0c;就开始逐步地改变我们的生活、学习、工作的方式。云计算使得公司能够在自己的物理硬件之外&#xff0c;通过远程服务器网…

每日一小练——二项式系数加法解

上得厅堂&#xff0c;下得厨房&#xff0c;写得代码&#xff0c;翻得围墙&#xff0c;欢迎来到睿不可挡的每日一小练&#xff01; 题目&#xff1a;二项式系数加法解 内容&#xff1a;请编写一个程序&#xff0c;仅仅用加法&#xff0c;求出n中取r个组合系数C(n,r)&#xff0c;…

华为、苹果、高通,谁在领跑?全面解读清华AI芯片报告

来源&#xff1a;智东西摘要&#xff1a;本文全面讲解人工智能芯片&#xff0c;系统梳理人工智能芯片的发展现状及趋势。2010 年以来&#xff0c;由于大数据产业的发展&#xff0c;数据量呈现爆炸性增长态势&#xff0c;而传统的计算架构又无法支撑深度学习的大规模并行计算需求…