Python实战开发及案例分析(21)—— 广度优先

        广度优先搜索(Breadth-First Search, BFS)是图和树结构中的一种基本搜索算法。它从根节点开始逐层遍历,先访问所有邻近节点,然后再遍历这些邻近节点的邻居。BFS通常使用队列来实现这一过程。在Python中,可以使用collections模块的deque实现高效的队列操作。

Python中的BFS实现

        以下是使用Python实现广度优先搜索的步骤,以及一个简单的示例,用于遍历图结构。

图的定义

        首先,我们定义一个图,这里使用字典来实现,其中键是节点,值是与该节点直接相连的节点列表。

graph = {'A': ['B', 'C'],'B': ['D', 'E'],'C': ['F'],'D': [],'E': ['G'],'F': [],'G': []
}
BFS算法实现

        使用队列来实现BFS,以下是一个基本的BFS函数,用于遍历并打印每个节点。

from collections import dequedef bfs(graph, start):visited = set()  # 用于记录所有访问过的节点,防止重复访问queue = deque([start])  # 使用deque创建一个队列,并初始化为包含起始节点while queue:  # 当队列非空时持续处理vertex = queue.popleft()  # 从队列左侧弹出一个元素if vertex not in visited:  # 如果该节点尚未访问print(vertex, end=' ')  # 处理节点,这里是打印节点visited.add(vertex)  # 标记节点为已访问# 将所有未访问的邻接节点加入队列for neighbor in graph[vertex]:if neighbor not in visited:queue.append(neighbor)# 调用BFS函数
bfs(graph, 'A')

案例分析:迷宫寻路问题

        假设我们有一个迷宫,需要找到从起点到终点的最短路径。迷宫由一个二维数组表示,其中0表示可以通行的路径,1表示障碍物。

迷宫定义
maze = [[0, 1, 0, 0, 0],[0, 1, 0, 1, 0],[0, 0, 0, 0, 0],[0, 1, 1, 0, 0],[0, 0, 0, 0, 0]
]
BFS求解迷宫

        使用BFS找到从左上角到右下角的最短路径。

def bfs_maze(maze, start, goal):rows, cols = len(maze), len(maze[0])queue = deque([(start, [start])])  # 存储节点及路径directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 可移动方向(右,下,左,上)while queue:(x, y), path = queue.popleft()if (x, y) == goal:return pathfor dx, dy in directions:nx, ny = x + dx, y + dyif 0 <= nx < rows and 0 <= ny < cols and maze[nx][ny] == 0:maze[nx][ny] = 2  # 标记为已访问queue.append(((nx, ny), path + [(nx, ny)]))return None# 起点和终点
start_pos = (0, 0)
end_pos = (4, 4)
path = bfs_maze(maze, start_pos, end_pos)
print("Path from start to goal:", path)

        在这个示例中,我们使用BFS在迷宫中寻找最短路径。每次从队列中取出一个节点时,都会检查它是否是目标节点。如果不是,就将它的未访问邻居节点加入队列。这个过程不断重复,直到找到终点或队列为空。

总结

        广度优先搜索是一种强大的图遍历技术,适用于从给定起点到达目标点的最短路径问题,以及其他需要按层次遍历的场景。通过Python的deque实现,BFS不仅效率高,而且代码实现简洁。此外,它的变体和扩展应用广泛,包括网络路由算法、社交网络分析、游戏编程等领域。

        扩展广度优先搜索(BFS)的应用范围,我们可以探讨如何将其用于更复杂的数据结构和算法问题中,比如层次遍历多维数据结构、最短路径求解在复杂网络中的应用,以及图着色问题等。这些应用不仅显示了BFS的多功能性,还能解决实际问题中的关键挑战。

多维数据结构的层次遍历

        BFS不限于简单的二维网格或标准树结构;它也可用于遍历更高维度的数据结构,如三维或多维数组。

示例:三维迷宫的BFS遍历

        假设有一个三维迷宫,我们需要找到从起点到终点的路径。

def bfs_3d(maze, start, end):directions = [(1,0,0), (-1,0,0), (0,1,0), (0,-1,0), (0,0,1), (0,0,-1)]  # 六个可能的移动方向queue = deque([(start, [start])])visited = set([start])while queue:current, path = queue.popleft()if current == end:return pathfor d in directions:next_pos = (current[0] + d[0], current[1] + d[1], current[2] + d[2])if next_pos in visited:continueif is_valid(next_pos, maze):  # 检查新位置是否有效或者是否是墙queue.append((next_pos, path + [next_pos]))visited.add(next_pos)return None# 假设迷宫及起点终点已定义
# path = bfs_3d(three_dimensional_maze, (0,0,0), (n-1,m-1,p-1))
# print("Path from start to goal:", path)

网络中的最短路径求解

        在社交网络、交通网络或通信网络中,找到两点之间的最短路径是常见需求。BFS可以高效求解无权图中的最短路径问题。

示例:社交网络中的六度分隔理论
def social_network_bfs(graph, start, end):queue = deque([(start, 0)])  # 存储节点及其社交距离visited = set([start])while queue:node, distance = queue.popleft()if node == end:return distancefor neighbor in graph[node]:if neighbor not in visited:visited.add(neighbor)queue.append((neighbor, distance + 1))return -1  # 如果没有路径存在# 示例用法
# degrees = social_network_bfs(social_graph, 'PersonA', 'PersonB')
# print(f"Degrees of separation: {degrees}")

图着色问题

        图着色问题是确定能否在给定颜色数量内为图的顶点着色,使相邻的顶点有不同颜色。BFS可以用来逐层检查并尝试着色。

示例:使用BFS进行图着色
def bfs_graph_coloring(graph, num_colors):coloring = {}for start in graph:if start not in coloring:if not bfs_color(graph, start, coloring, num_colors):return Falsereturn Truedef bfs_color(graph, start, coloring, num_colors):queue = deque([start])coloring[start] = 0  # 初始颜色while queue:node = queue.popleft()current_color = coloring[node]for neighbor in graph[node]:if neighbor in coloring and coloring[neighbor] == current_color:return Falseif neighbor not in coloring:coloring[neighbor] = (current_color + 1) % num_colorsqueue.append(neighbor)return True# 示例用法
# is_possible = bfs_graph_coloring(graph, 3)
# print("Coloring possible:", is_possible)

        这些示例展示了广度优先搜索在实际应用中的广泛适用性。BFS不仅用于简单的搜索和路径找寻问题,还可以扩展到解决网络分析、多维数据处理、以及优化和决策制定等复杂问题中。通过这些高级应用,可以更好地理解BFS的实用性及其在各种领域中的潜在价值。

        继续深入探讨广度优先搜索(BFS)的其他应用领域和高级用例,可以考虑如何将BFS运用于实时监控系统、动态网络分析、以及自动化测试领域。这些应用展示了BFS在不仅限于理论模型的实际和复杂系统中的广泛适用性。

实时监控系统

        在实时监控系统中,如安全监控或健康监控系统,BFS可以用来追踪事件的传播和状态的变化,确保系统及时响应潜在的问题。

示例:安全监控中的事件传播分析
def monitor_event_spread(network, start_event):queue = deque([start_event])events_tracked = set([start_event])alert_generated = Falsewhile queue and not alert_generated:current_event = queue.popleft()# 检查当前事件是否符合生成警报的条件if is_critical_event(current_event):generate_alert(current_event)alert_generated = Truebreak# 追踪当前事件影响的其他事件for connected_event in network[current_event]:if connected_event not in events_tracked:events_tracked.add(connected_event)queue.append(connected_event)return alert_generated# 假设已定义network和start_event
# alert_status = monitor_event_spread(security_network, 'Initial_Security_Breach')
# print("Alert generated:", alert_status)

        在此示例中,BFS用于跟踪由初始安全漏洞引发的事件链,以评估是否需要生成系统警报。

动态网络分析

        在社交网络、交通网络或通信网络中,网络的状态可能会不断变化。BFS可以用来分析网络的动态结构,特别是在网络规模巨大时,快速更新和分析网络变化。

示例:交通网络中的最短路径更新
def update_traffic_paths(traffic_network, changes):# 假设changes包含了网络中的变化,如路线关闭或开放updated_network = apply_changes(traffic_network, changes)all_paths = {}# 为网络中的每个节点更新最短路径for start_point in updated_network.keys():shortest_paths = bfs_shortest_paths(updated_network, start_point)all_paths[start_point] = shortest_pathsreturn all_paths# 示例用法
# current_changes = {'A-B': 'closed', 'C-D': 'open'}
# updated_paths = update_traffic_paths(city_traffic_network, current_changes)
# print("Updated paths:", updated_paths)

自动化测试领域

        在自动化测试中,BFS可以用来测试图形用户界面(GUI)或Web应用中的所有可能状态,确保应用的稳定性和可用性。

示例:GUI的状态遍历测试
def gui_state_testing(gui_states, start_state):queue = deque([start_state])visited_states = set([start_state])while queue:current_state = queue.popleft()execute_tests(current_state)for event in gui_events[current_state]:next_state = trigger_event(gui_states, current_state, event)if next_state not in visited_states:visited_states.add(next_state)queue.append(next_state)return "Testing completed for all states"# 假设gui_states和start_state已定义
# test_result = gui_state_testing(application_gui, 'Home_Screen')
# print(test_result)

        这里,BFS被用于自动化测试,以确保从GUI的起始状态开始,通过系统地触发每个可能的事件,测试应用的所有状态。

结论

        广度优先搜索不仅限于理论的树和图遍历问题,它的应用范围非常广泛,能够解决实时系统监控、动态网络分析、自动化测试等多种实际问题。通过适当的实现和优化,BFS可以为解决复杂的现代技术挑战提供有效的工具,确保系统的高效运行和稳定性。

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

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

相关文章

前端学习——工具的使用

文章目录 1. 引入一个组件需要什么步骤2. 监听变量的修改3. async与await实现异步调用4. position: relative5. 定时执行方法 1. 引入一个组件需要什么步骤 引入一个组件&#xff0c;一定不要加{} &#xff08;对&#xff09;import editForm from “./component/editForm”; …

Python中tkinter编程入门4

在Python中tkinter编程入门3-CSDN博客中创建了Button控件&#xff0c;点击该控件就会产生一个点击事件&#xff0c;在创建Button控件时指定该点击事件的处理程序后&#xff0c;按键控件就会对用户的点击事件产生响应。 1 定义事件处理器 定义事件处理器就是一个自定义的函数。…

前端连续发送同一个请求时,终止上一次请求

场景&#xff1a;几个tab页之间快速的切换&#xff08;tab页只是参数不同&#xff0c;下边的数据渲染给同一个data&#xff09;就会导致如果我在1,2,3&#xff0c;tab页按照顺序快速点击&#xff0c;发送三个请求&#xff0c;我想要展示的是3但是如果1或者2请求响应的时间比3长…

Python tensor向量维度转换,不同维度的向量转化为相同的维度,经过全连接层MLP的维度转换,代码实战

问题&#xff1a;在机器学习特征工程中&#xff0c;假如每类特征需要转化为相同的维度进行拼接&#xff0c;那该怎么办呢&#xff1f;接一个全连接层MLP就可以了。 例子&#xff1a;将&#xff08;128,64&#xff09; 维度的向量转化为&#xff08;128,32&#xff09;维。 impo…

CountDownLatch的 常用场景及使用示例

CountDownLatch的 常用场景及使用示例 CountDownLatch是Java并发编程中一个非常实用的同步工具类&#xff0c;它允许一个或多个线程等待其他线程完成操作后再继续执行。其核心功能在于控制线程的执行流程&#xff0c;确保某些关键操作或准备工作完全就绪后&#xff0c;再释放等…

Stm32串口搭配DMA实现自定义printf、scanf

前言:本文仅供学习参考使用&#xff0c;主要目的是让大家快速使用串口调试&#xff0c;文章所提及的GCC适用于Clion&#xff0c;Vscode等第三方编辑器的用户。作者有时间会继续更新^_^ 一、GCC环境 1、标准库 (1)、使用方法 在主函数while(1)初始化中&#xff0c;添加Seria…

柯桥法语学习-5大法语听写网站:全力助攻你的dictée!

提到法语dicte&#xff0c;绝对可是法语学生们的老大难&#xff0c;简直就是心痛得不能自已啊&#xff01;所以今天&#xff0c;法语君整理了5个听写网站助攻大家的dicte哦&#xff01; Projet Voltaire 01 一个很容易让你对dicte上瘾的APP 写邮件、实习报告或者动机信时&…

vue + koa2 + crypto-js + md5加密:创建加密账户、登录验证

一、前端页面设置 1、创建账户 import CryptoJS from crypto-js; const loginFun function () {request({url: /user/register,method: post,data: {username: ruleForm.username,password: CryptoJS.MD5(ruleForm.password).toString(),role: ruleForm.role}}).then((res) …

徐翔——投资的心性

徐翔&#xff0c;1976年出生。 1993年&#xff0c;徐翔当时还是个高中生&#xff0c;17岁的他带着父母给的几万元本钱进入股票市"那个时候&#xff0c;宁波老百姓家里几万元很正常,而且家里就我一个小孩。”徐翔说。场。1994年&#xff0c;18岁的徐翔放弃高考&#xff0c…

XML的现状及其发展

XML&#xff08;Extensible Markup Language&#xff09;是一种用于描述结构化数据的标记语言&#xff0c;它具有良好的可读性和可扩展性&#xff0c;并且被广泛应用于数据交换、数据存储和配置文件等领域。 目前&#xff0c;XML仍然是一种非常重要的数据交换格式。它被广泛应…

Nat Plants | 植物抽核单细胞!多组学探究大豆根瘤成熟过程

发表时间&#xff1a;2023-04 发表期刊&#xff1a;Nature Plants 影响因子&#xff1a;17.352 DOI&#xff1a;10.1038/s41477-023-01387-z 研究背景 根瘤菌是亲和互作寄主植物&#xff0c;感染宿主并在根部形成共生器官根瘤&#xff0c;具有固氮…

jmeter中HttpClient4发送失败,java方法请求成功

jmeter中HttpClient4请求失败 上传文件时&#xff1a;Httpclient4: 请求体 请求头 响应结果 ,后端服务都总是提示存在非法标签。 jmeter中使用java请求成功 修改使用java方式&#xff0c;访问正常&#xff1b; 根据分析可能因为HC4对一些特殊字符会进行转义&#xff0c;转义后…

idea配置MySQL提示

点击sql语句&#xff0c;然后再选择show context actions 然后再选择Inject language or reference 然后再选择MySQL 然后我们会发现sql语句变颜色了 如果表是红色 那么需要我们连接mysql的对于的数据库

做私域不止是积累流量,生态也很重要!

如今&#xff0c;私域流水占比已经逼近整个零售市场的30%&#xff0c;达到4万亿规模&#xff0c;百度、阿里、腾讯等头部玩家也都在加速布局&#xff0c;私域运营&#xff0c;已不再是一个单一的商业模式或者运营手段&#xff0c;而是逐渐构成一种可持续的行业生态。 一、什么…

全球量子计算已开始商业化!应用最多的行业你一定想不到

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨卉可 排版丨沛贤 深度好文&#xff1a;2600字丨5 分钟阅读 01 量子计算是一场高风险的游戏 近日&#xff0c;PsiQuantum从澳大利亚联邦政府和地方政府获得了10亿澳元资金&#xff0c;这…

大屏UI:建筑可视化应用越来越广泛,根本挡不住。

建筑可视化在可视化大屏中有许多应用场景&#xff0c;以下是其中一些常见的应用场景&#xff1a; 建筑项目展示&#xff1a;可以使用建筑可视化技术展示正在进行或已完成的建筑项目。通过可视化大屏&#xff0c;可以展示建筑的外观、内部布局、材料选择等信息&#xff0c;帮助…

鬼畜作品创作必备素材,鬼畜自学语音包合集

一、素材描述 鬼畜是什么&#xff1f;鬼畜是一种网络流行语&#xff0c;也是网络文化的一种表现形式。它指的是将原本无关的两个或多个视频、音频、图片或文字进行剪辑、混合、重组等处理后&#xff0c;形成一种新的有趣、诙谐或恶搞的作品。鬼畜的制作过程通常需要一定的技术…

图像归一化处理

归一化 归一化是一种简化计算的方式&#xff0c;即将有量纲的表达式&#xff0c;经过变换&#xff0c;化为无量纲的表达式&#xff0c;成为标量。 在多种计算中都经常用到这种方法。 简单介绍 归一化是一种无量纲处理手段&#xff0c;使物理系统数值的绝对值变成某种相对值关…

C++哈希(个人笔记)

C哈希 1.unordered_mapd1.1unordered_map的构造函数1.2unorder_map的容量1.3unordered_map的迭代器1.4unordered_map的元素访问1.5unorder_map的查找1.6unordered_map的修改操作1.7unordered_map的桶操作 2.unordered_set3.unordered_set和unordered_set的笔试题4.哈希4.1哈希概…

应急救灾北斗终端手机应用方案

在应对自然灾害和紧急救援的严峻挑战中&#xff0c;技术的力量从未如此重要。为了保障救援人员能够迅速、准确地响应灾情&#xff0c;提供及时有效的救助&#xff0c;顶坚应急救灾北斗终端手机应用应运而生。这款应用依托北斗卫星导航系统的高精度定位与通信功能&#xff0c;不…