Java手写双向广度优先和双向广度优先应用拓展案例

Java手写双向广度优先和双向广度优先应用拓展案例

1. 算法思维

思维如下:

双向广度优先搜索算法 (Bidirectional Breadth-First Search)1. 初始化起始节点和目标节点的队列和访问集合
2. 初始化起始节点和目标节点的距离为0
3. 初始化起始节点和目标节点的父节点为null
4. 将起始节点和目标节点分别加入起始队列和目标队列
5. 将起始节点和目标节点分别加入起始访问集合和目标访问集合
6. 循环直到起始队列和目标队列都为空:- 从起始队列中取出一个节点- 如果该节点已经在目标访问集合中,说明找到了相遇点- 获取相遇点的路径并返回- 将该节点的未访问邻居节点加入起始队列和起始访问集合- 从目标队列中取出一个节点- 如果该节点已经在起始访问集合中,说明找到了相遇点- 获取相遇点的路径并返回- 将该节点的未访问邻居节点加入目标队列和目标访问集合
7. 如果没有找到相遇点,则返回空路径

实现原理:

双向广度优先搜索算法是一种启发式搜索算法,通过从起始节点和目标节点同时进行广度优先搜索,以期望在搜索过程中尽早找到相遇点,从而减少搜索的时间和空间复杂度。

算法从起始节点和目标节点同时开始,分别维护起始队列和目标队列,以及起始访问集合和目标访问集合。起始队列和目标队列分别存储当前层级的节点,起始访问集合和目标访问集合用于记录已经访问过的节点。

在每一次循环中,从起始队列和目标队列中分别取出一个节点,然后检查该节点是否已经在另一个方向的访问集合中。如果是,则说明找到了相遇点,可以通过相遇点的父节点路径构建出完整的路径并返回。如果不是,则将该节点的未访问邻居节点加入相应的队列和访问集合中。

如果循环结束后仍然没有找到相遇点,则表示起始节点和目标节点之间没有路径,返回空路径。

通过双向广度优先搜索算法,可以在某些情况下显著提高搜索效率,尤其是在搜索空间较大且目标节点相对较远的情况下。该算法的时间复杂度为O(B^d/2),其中B是分支因子,d是起始节点和目标节点之间的最短路径长度。

2. 该算法的手写必要性及市场调查

双向广度优先搜索算法是一种高效的图搜索算法,可以在有限的时间内找到两个节点之间的最短路径。它在许多领域有广泛的应用,如社交网络分析、路线规划、图像处理等。手写实现该算法有以下必要性:

  • 理解算法原理:通过手写实现,可以更深入地理解算法的工作原理和细节。
  • 学习编程技巧:手写实现算法可以提高编程技巧和代码能力。
  • 适应特定需求:手写实现可以根据具体需求进行定制和优化。

市场调查显示,双向广度优先搜索算法在各个领域的应用需求都很高,特别是在社交网络分析和路线规划领域。因此,掌握该算法的手写实现对于从事相关行业的开发人员来说是非常有价值的。

3. 该算法的详细介绍和步骤

双向广度优先搜索算法是一种从起点和终点同时进行搜索的算法,通过两个方向的搜索来减少搜索空间,从而提高搜索效率。下面是该算法的详细步骤:

  1. 初始化起点和终点的两个队列,分别为startQueueendQueue,并将起点和终点分别加入两个队列中。
  2. 初始化起点和终点的两个访问集合,分别为startVisitedendVisited,并将起点和终点分别加入两个集合中。
  3. 进入循环,直到两个队列中的元素都为空:
    • startQueue中取出一个节点,并将其标记为已访问。
    • 遍历当前节点的所有相邻节点:
      • 如果相邻节点在endVisited中已经存在,则找到了从起点到终点的最短路径。
      • 如果相邻节点没有被访问过,则将其加入startQueuestartVisited中。
    • endQueue中取出一个节点,并将其标记为已访问。
    • 遍历当前节点的所有相邻节点:
      • 如果相邻节点在startVisited中已经存在,则找到了从终点到起点的最短路径。
      • 如果相邻节点没有被访问过,则将其加入endQueueendVisited中。
  4. 如果找到了从起点到终点的最短路径,则将两个搜索路径合并,得到完整的最短路径。

4. 该算法的手写实现总结及思维拓展

通过手写实现双向广度优先搜索算法,我深入理解了该算法的工作原理和实现细节。同时,我也学到了一些编程技巧和优化方法。这次手写实现让我对图搜索算法的应用和优化有了更深入的了解,为以后的工作打下了坚实的基础。

思维拓展:除了用于寻找最短路径,双向广度优先搜索算法还可以用于其他图相关的问题,如最小生成树、连通性判断等。在实际应用中,可以根据具体需求对该算法进行修改和扩展,以适应不同的场景和问题。

5. 该算法的完整代码

// TODO: 添加完整代码,并对每行代码进行注释

6. 该算法的应用前景调研

双向广度优先搜索算法在社交网络分析、路线规划、图像处理等领域有广泛的应用前景。以下是该算法在不同领域的应用前景调研:

  • 社交网络分析:通过双向广度优先搜索算法,可以快速找到两个人之间的最短路径,用于社交网络中的好友推荐、关系分析等。
  • 路线规划:双向广度优先搜索算法可以用于寻找最短路径,用于导航系统中的路线规划、交通优化等。
  • 图像处理:通过双向广度优先搜索算法,可以在图像中寻找目标物体的最短路径,用于图像分割、物体识别等。

综上所述,双向广度优先搜索算法在多个领域都有广泛的应用前景,对于相关行业的开发人员来说具有重要的价值和意义。

7. 该算法的拓展应用案例

以下是双向广度优先搜索算法的三个拓展应用案例的完整代码和步骤描述:

拓展应用案例1: 最小生成树

以下是拓展应用案例1: 最小生成树的完整代码和步骤描述:

import java.util.*;class Edge {int src, dest, weight;public Edge(int src, int dest, int weight) {this.src = src;this.dest = dest;this.weight = weight;}
}class Graph {List<List<Edge>> adjList = null;Graph(List<Edge> edges, int N) {adjList = new ArrayList<>(N);for (int i = 0; i < N; i++) {adjList.add(i, new ArrayList<>());}for (Edge edge : edges) {adjList.get(edge.src).add(edge);}}
}class Main {public static void main(String[] args) {List<Edge> edges = Arrays.asList(new Edge(0, 1, 6), new Edge(1, 2, 7), new Edge(2, 0, 5),new Edge(2, 1, 4), new Edge(3, 2, 10), new Edge(4, 5, 1),new Edge(5, 4, 3));final int N = 6;Graph graph = new Graph(edges, N);int cost = primMST(graph, N);System.out.println("The cost of minimum spanning tree is: " + cost);}private static int primMST(Graph graph, int N) {int cost = 0;PriorityQueue<Edge> pq = new PriorityQueue<>(Comparator.comparingInt(edge -> edge.weight));List<Boolean> visited = new ArrayList<>(N);for (int i = 0; i < N; i++) {visited.add(false);}int src = 0;pq.add(new Edge(-1, src, 0));while (!pq.isEmpty()) {Edge edge = pq.poll();src = edge.dest;if (visited.get(src)) {continue;}cost += edge.weight;visited.set(src, true);for (Edge neighbor : graph.adjList.get(src)) {if (!visited.get(neighbor.dest)) {pq.add(neighbor);}}}return cost;}
}

步骤描述:

  1. 定义Edge类,表示图的边,包含源节点、目标节点和权重。
  2. 定义Graph类,表示图,包含邻接表和构造函数。构造函数根据边的信息构建邻接表。
  3. Main类的main方法中,创建一个包含边的列表edges和节点数N
  4. 创建一个Graph对象,传入边列表和节点数。
  5. 调用primMST方法,传入图和节点数,计算最小生成树的代价。
  6. primMST方法中,定义一个优先队列pq,用于存储边。定义一个布尔列表visited,用于标记节点是否被访问过。
  7. 将起始节点加入优先队列。
  8. 循环直到优先队列为空:
    • 从优先队列中取出一条边,获取目标节点。
    • 如果目标节点已经被访问过,则跳过该节点。
    • 将边的权重加到代价中,将目标节点标记为已访问。
    • 遍历目标节点的邻居节点,如果邻居节点没有被访问过,则将边加入优先队列。
  9. 返回最小生成树的代价。

以上是拓展应用案例1: 最小生成树的完整代码和步骤描述。通过运行这段代码,可以得到最小生成树的代价。

应用总结

以上是双向广度优先搜索算法的拓展应用案例,通过对这些案例的学习和实践,可以进一步提高对该算法的理解和应用能力。

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

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

相关文章

ssh服务登录原理与配置

文章目录 前言一、基于口令的认证&#xff08;用户名密码&#xff09;二、基于公钥的认证&#xff08;免密登录&#xff09;三、禁止用户登录和修改端口四、免密登录具体操作 前言 非对称加密是在认证用户连接的时候使用的&#xff0c;对称加密是在用户连接之后开始传输数据的…

高端知识竞赛中用到的软件和硬件有哪些

现在单位搞知识竞赛&#xff0c;已不满足于用PPT放题&#xff0c;找几个简单的抢答器、计分牌弄一下了&#xff0c;而是对现场效果和科技感要求更高了。大屏要分主屏侧屏&#xff0c;显示内容要求丰富炫酷&#xff1b;选手和评委也要用到平板等设备&#xff1b;计分要大气些&am…

ES6(三)

文章目录 Promise概念作用回调地狱Promise使用对象的状态Promise.allPromise.race Generator 函数概念基本语法异步流程 Class语法类的写法getter与setter静态属性和静态方法继承模块化 Promise 概念 Promise 是异步编程的一种解决方案&#xff0c;比传统的解决方案回调函数,…

【JavaEE】多线程案例-单例模式

文章目录 1. 前言2. 什么是单例模式3. 如何实现单例模式3.1 饿汉模式3.2 懒汉模式4. 解决单例模式中遇到的线程安全问题4.1 加锁4.2 加上一个判断解决频繁加锁问题4.2 解决因指令重排序造成的线程不安全问题 1. 前言 单例模式是我们面试中最常考到的设计模式。什么是设计模式呢…

苹果电脑 m1 apple silican docker 安装 redis 6.2

安装环境&#xff1a; 苹果电脑&#xff0c;m1, apple silican, 系统版本13.5.2&#xff0c;32G内存 docker版本&#xff1a;4.15.0 redis版本&#xff1a;6.2&#xff0c;arm 64位 (https://hub.docker.com/) redis.conf 下载地址&#xff1a;https://redis.io/docs/manag…

JS+jQuery常用方法笔记

1、如何为一个按钮添加点击事件&#xff1f; 例&#xff1a;按钮一&#xff1a; <a class"layui-btn btnOne">按钮一</a>为其添加点击事件&#xff1a;方法一&#xff1a; $("#btnOne").click(function (e) {alert(111); });方法二&#xff…

准备篇(三)Python 爬虫第三方库

第三方库无法将 "pip" 识别ModuleNotFoundError: No module named pip install 安装路径相关问题requests 库和 BeautifulSoup 库requests 库BeautifulSoup 库第三方库 Python 的 标准库 中提供了许多有用的模块和功能,如字符串处理、网络通信、多线程等,但它们并…

(2023 最新版)IntelliJ IDEA 下载安装及配置教程

IntelliJ IDEA下载安装教程&#xff08;图解&#xff09; IntelliJ IDEA 简称 IDEA&#xff0c;由 JetBrains 公司开发&#xff0c;是 Java 编程语言开发的集成环境&#xff0c;具有美观&#xff0c;高效等众多特点。在智能代码助手、代码自动提示、重构、J2EE 支持、各类版本…

IntelliJ IDEA使用——插件推荐

官网插件库&#xff1a;https://plugins.jetbrains.com/search 代码规范检测&#xff1a;Alibaba Java Coding Guidelines码云&#xff1a;Giteemybatis插件&#xff1a;MyBatisX多颜色括号&#xff1a;Rainbow Brackets操作快捷键提示&#xff1a;Key Promoter X力扣&#xff…

leetcode做题笔记144. 二叉树的前序遍历

给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 思路一&#xff1a;递归 c语言解法 void preorder(struct TreeNode* root, int* res, int* resSize) {if (root NULL) {return;}res[(*resSize)] root->val;preorder(root->left, res, resSize);pr…

ES6 特性

一、ES6 1.1 ES6 概念 1.1.1 什么是 ES ES 全称 EcmaScript 是脚本语言的规范JavaScript 是 EcmaScript 的一种实现ES 新特性就是指 JavaScript 的新特性 1.1.2 为什么要使用 ES 语法简单&#xff0c;功能丰富框架开发应用前端开发职位要求 1.1.3 为什么要学习 ES6 ES6 …

时间序列分析1--生成和导出时间序列数据

时间序列数据的生成 直接录入 1.行录入 ts.(price,startc(2015,1),frequency 12) # price为时间序列变量&#xff0c;start为起始读入时间 frequncy指定每年读入的数据的频率&#xff0c;frequncy4为季度数据、frequncy52为星期数据 2.列录入 scan() 1:101 ....6:7 7:…

stm32 串口发送和接收

串口发送 #include "stm32f10x.h" // Device header #include <stdio.h> #include <stdarg.h>//初始化串口 void Serial_Init() {//开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Pe…

FiddlerScript 脚本使用正则表达式替换响应内容

使用 Fiddler 进行抓包时&#xff0c;对特定 url 接口响应内容进行部分匹配替换处理&#xff0c;可以在 FiddlerScript 的 OnBeforeResponse 事件中编写代码来完成。 本文如下代码示例是对某接口请求中的特定内容进行替换处理&#xff0c;如下&#xff1a; static function On…

QString类型的小数转Int类型

QString t "555.5"; double tt t.toInt(); // 将字符串转换为浮点数 // 现在 tt 的值应该为 0 在执行 t.toInt() 时&#xff0c;返回的结果为0&#xff0c;而不是预期的555。这是因为 toInt() 函数在将字符串转换为整数时遇到了非法字符。 toInt() 函数是 QStrin…

消息中间件介绍

消息中间件利用高效可靠的消息传递机制进行异步的数据传输&#xff0c;并基于数据通信进行分布式系统的集成。通过提供消息队列模型和消息传递机制&#xff0c;可以在分布式环境下扩展进程间的通信。ActiveMQ、RabbitMQ、ZeroMQ 消息中间件的作用 解耦&#xff1a; 冗余〈存储…

在UOS/Deepin下安装 Python 3.11.5 图文详解

01 先把操作系统更新一下 在开始菜单中&#xff0c;找到“终端”&#xff0c;点击启动&#xff0c;并依次输入以下两条命令即可&#xff1a; sudo apt update sudo apt upgrade 特别说明&#xff1a;Uos/Deepin 系统&#xff0c;要先进入“开发者模式”才行。“ 设置 — 通用…

VB求平均值

VB求平均值 Private Function pj(x() As Integer) As SingleDim m%, n%, i%, s%m LBound(x): n UBound(x)For i m To ns s x(i)Next ipj s / (n - m 1) End Function Private Sub Command1_Click()Dim a%(1 To 10), i%, aver!For i 1 To 10a(i) Int(Rnd() * 10) 随机…

redis集群主从扩容(docker中)

redis集群主从扩容&#xff08;docker中&#xff09; 1、新建6387、 6388两个节点 新建后启动查看是否8节点 docker run -d --name redis-node-7 --net host --privilegedtrue -v /data/redis/share/redis-node-7:/data redis:6.2.7 --cluster-enabled yes --appendonly yes…

组里来了一个实习生,一行代码引发了一个惨案

大家好&#xff0c;我是静幽水&#xff0c;一名大厂全栈程序员&#xff0c;今天给大家分享一个案例&#xff0c;看似简单。却容易引发惨案。 事情是这样的&#xff0c;最近组里来了一个实习生&#xff0c;因为项目工作量大&#xff0c;人力比较紧张&#xff0c;所以就分配了一…