当前位置: 首页 > news >正文

Java手写最短路径算法和案例拓展

Java手写最短路径算法和案例拓展

1. 算法手写的必要性

在实际开发中,经常需要处理图的最短路径问题。虽然Java提供了一些图算法库,但手写最短路径算法的必要性体现在以下几个方面:

  1. 理解算法原理:手写算法可以帮助我们深入理解最短路径算法的原理和思路,提高对算法的理解程度。
  2. 灵活性和可定制性:手写算法可以根据具体需求进行定制,满足不同场景下的需求。
  3. 性能优化:手写算法可以根据具体情况进行性能优化,提高算法的效率。

2. 市场调查

在市场调查中,我们发现最短路径算法在物流、导航、网络通信等领域有着广泛的应用。例如,物流公司需要确定最短路径来优化运输成本;导航软件需要找到最短路径来指导用户行驶;网络通信需要确定最短路径来提高数据传输效率。

3. 实现思路原理

为了更好地理解最短路径算法的实现思路,我们使用Mermanid代码表示思维导图,解释实现思路的原理。

初始化距离和路径
选择起点
更新距离和路径
选择下一个顶点
更新距离和路径
重复选择下一个顶点
输出最短路径

上述思维导图描述了最短路径算法的基本思路:从起点开始,逐步选择下一个顶点,并更新距离和路径,直到到达目标顶点,输出最短路径。

4. 实现的详细介绍和详细步骤

步骤1:初始化距离和路径

在开始算法之前,需要初始化距离和路径。距离表示从起点到每个顶点的最短距离,路径表示从起点到每个顶点的最短路径。

// 初始化距离和路径
for (int i = 0; i < vertexCount; i++) {distance[i] = Integer.MAX_VALUE;path[i] = -1;
}
distance[start] = 0;

步骤2:选择起点

选择起点作为当前顶点,并标记为已访问。

int current = start;
visited[current] = true;

步骤3:更新距离和路径

遍历当前顶点的所有邻接顶点,更新距离和路径。

for (int neighbor : getNeighbors(current)) {if (!visited[neighbor]) {int newDistance = distance[current] + getWeight(current, neighbor);if (newDistance < distance[neighbor]) {distance[neighbor] = newDistance;path[neighbor] = current;}}
}

步骤4:选择下一个顶点

从未访问的顶点中选择距离最小的顶点作为下一个顶点。

int minDistance = Integer.MAX_VALUE;
for (int i = 0; i < vertexCount; i++) {if (!visited[i] && distance[i] < minDistance) {minDistance = distance[i];current = i;}
}
visited[current] = true;

步骤5:重复选择下一个顶点

重复步骤3和步骤4,直到所有顶点都被访问。

步骤6:输出最短路径

根据路径数组,输出从起点到目标顶点的最短路径。

List<Integer> shortestPath = new ArrayList<>();
int vertex = target;
while (vertex != -1) {shortestPath.add(vertex);vertex = path[vertex];
}
Collections.reverse(shortestPath);

5. 手写实现总结及必要性

通过手写最短路径算法的实现,我们深入理解了算法的原理和思路。手写实现能够提高我们对算法的理解程度,并且具有灵活性和可定制性,可以根据具体需求进行定制和性能优化。手写最短路径算法在物流、导航、网络通信等领域有着广泛的应用前景。

5.1 手写完整代码

以下是一个使用Dijkstra算法求解最短路径的完整代码示例:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;public class DijkstraAlgorithm {private int vertexCount;private int[][] adjacencyMatrix;public DijkstraAlgorithm(int vertexCount) {this.vertexCount = vertexCount;adjacencyMatrix = new int[vertexCount][vertexCount];}public void addEdge(int source, int destination, int weight) {adjacencyMatrix[source][destination] = weight;adjacencyMatrix[destination][source] = weight;}public List<Integer> shortestPath(int start, int target) {int[] distance = new int[vertexCount];int[] path = new int[vertexCount];boolean[] visited = new boolean[vertexCount];// 初始化距离和路径Arrays.fill(distance, Integer.MAX_VALUE);Arrays.fill(path, -1);distance[start] = 0;// 选择起点int current = start;visited[current] = true;// 更新距离和路径for (int neighbor = 0; neighbor < vertexCount; neighbor++) {if (!visited[neighbor] && adjacencyMatrix[current][neighbor] > 0) {int newDistance = distance[current] + adjacencyMatrix[current][neighbor];if (newDistance < distance[neighbor]) {distance[neighbor] = newDistance;path[neighbor] = current;}}}// 选择下一个顶点for (int i = 1; i < vertexCount; i++) {int minDistance = Integer.MAX_VALUE;for (int j = 0; j < vertexCount; j++) {if (!visited[j] && distance[j] < minDistance) {minDistance = distance[j];current = j;}}visited[current] = true;// 更新距离和路径for (int neighbor = 0; neighbor < vertexCount; neighbor++) {if (!visited[neighbor] && adjacencyMatrix[current][neighbor] > 0) {int newDistance = distance[current] + adjacencyMatrix[current][neighbor];if (newDistance < distance[neighbor]) {distance[neighbor] = newDistance;path[neighbor] = current;}}}}// 输出最短路径List<Integer> shortestPath = new ArrayList<>();int vertex = target;while (vertex != -1) {shortestPath.add(vertex);vertex = path[vertex];}Collections.reverse(shortestPath);return shortestPath;}public static void main(String[] args) {DijkstraAlgorithm graph = new DijkstraAlgorithm(6);graph.addEdge(0, 1, 2);graph.addEdge(0, 2, 4);graph.addEdge(1, 2, 1);graph.addEdge(1, 3, 7);graph.addEdge(2, 4, 3);graph.addEdge(3, 4, 1);graph.addEdge(3, 5, 5);graph.addEdge(4, 5, 2);List<Integer> shortestPath = graph.shortestPath(0, 5);System.out.println("Shortest Path: " + shortestPath);}
}

以上代码实现了一个Dijkstra算法的最短路径求解器。在示例中,我们创建了一个有6个顶点的图,并添加了8条边。然后,我们使用Dijkstra算法计算从顶点0到顶点5的最短路径,并打印出结果。输出结果为Shortest Path: [0, 2, 4, 5],表示从顶点0到顶点5的最短路径为0 -> 2 -> 4 -> 5。

6. 拓展案例

下面是一个拓展案例,展示了每个步骤的代码进行文字描述:

// 步骤1:初始化距离和路径
for (int i = 0; i < vertexCount; i++) {distance[i] = Integer.MAX_VALUE;path[i] = -1;
}
distance[start] = 0;// 步骤2:选择起点
int current = start;
visited[current] = true;// 步骤3:更新距离和路径
for (int neighbor : getNeighbors(current)) {if (!visited[neighbor]) {int newDistance = distance[current] + getWeight(current, neighbor);if (newDistance < distance[neighbor]) {distance[neighbor] = newDistance;path[neighbor] = current;}}
}// 步骤4:选择下一个顶点
int minDistance = Integer.MAX_VALUE;
for (int i = 0; i < vertexCount; i++) {if (!visited[i] && distance[i] < minDistance) {minDistance = distance[i];current = i;}
}
visited[current] = true;// 步骤5:重复选择下一个顶点// 步骤6:输出最短路径
List<Integer> shortestPath = new ArrayList<>();
int vertex = target;
while (vertex != -1) {shortestPath.add(vertex);vertex = path[vertex];
}
Collections.reverse(shortestPath);

通过以上拓展案例,我们可以更加清晰地了解每个步骤的代码实现和作用。

相关文章:

Java手写最短路径算法和案例拓展

Java手写最短路径算法和案例拓展 1. 算法手写的必要性 在实际开发中&#xff0c;经常需要处理图的最短路径问题。虽然Java提供了一些图算法库&#xff0c;但手写最短路径算法的必要性体现在以下几个方面&#xff1a; 理解算法原理&#xff1a;手写算法可以帮助我们深入理解最…...

深度学习实战51-基于Stable Diffusion模型的图像生成原理详解与项目实战

大家好,我是微学AI,今天给大家介绍一下深度学习实战51-基于Stable Diffusion模型的图像生成原理详解与项目实战。大家知道现在各个平台发的漂亮小姐姐,漂亮的图片是怎么生成的吗?这些生成的底层原理就是用到了Stable Diffusion模型。Stable Diffusion是一种基于深度学习的图…...

基于matlab实现的多普勒脉冲雷达回波仿真

完整程序&#xff1a; clear all;clc;close all; fc3e9; %载波频率 PRF2000; Br5e6; %带宽 fs10*Br; %采样频率 Tp5e-6; %脉宽 KrBr/Tp; %频率变化率 c3e8; %光速 lamda…...

Linux服务器中安装Anaconda+Tensorflow+Keras

Anaconda安装 从https://repo.anaconda.com/archive/查看你需要下载的Anaconda版本&#xff0c;例如2020.11的x86_64&#xff08;uname -a 查看linux框架&#xff09;版下载Anaconda到linux服务器&#xff0c; wget https://repo.anaconda.com/archive/Anaconda3-2020.11-Li…...

ubuntu+.net6+docker 应用部署教程

先期工作 1、本地首先安装 Docker Desktop 2、本地装linux in windows 3、生成镜像 后期工作 1、云服务器部署 生成镜像方法 1、生成Dockerfile配置文件 开发工具visual studio 2022 如果项目已经存在&#xff0c;可以选中项目&#xff0c;右键点击->选择添加Docker…...

Spring常见面试题总结

什么是Spring Spring是一个轻量级Java开发框架&#xff0c;目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题&#xff0c;以提高开发效率。它是一个分层的JavaSE/JavaEE full-stack&#xff08;一站式&#xff09;轻量级开源框架&#xff0c;为开发Java应用程序…...

Git全套命令使用

日升时奋斗&#xff0c;日落时自省 目录 1、Git安装 1.1、创建git本地仓库 1.2、配置Git 1.3、认识Git内部区分 2、Git应用操作 2.1、添加文件 2.2、查看日志 2.3、查看修改信息 2.4、查看添加信息 3、版本回退 4、撤销修改 4.1、工作区撤销 4.2、已经add&#xf…...

【陕西理工大学-数学软件实训】数学实验报告(8)(数值微积分与方程数值求解)

目录 一、实验目的 二、实验要求 三、实验内容与结果 四、实验心得 一、实验目的 1. 掌握求数值导数和数值积分的方法。 2. 掌握代数方程数值求解的方法。 3. 掌握常微分方程数值求解的方法。 二、实验要求 1. 根据实验内容&#xff0c;编写相应的MATLAB程序&#xff0c…...

Vue3为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactive reactive本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代option api的data的替代,可以存放任何数据类型,而reactive声明的数据类型只能是对象; 先抛出结论,再详细说原因:非必要不用rea…...

JavaScript函数this指向

一、this的指向规则 1.this到底指向什么呢&#xff1f; 我们先来看一个让人困惑的问题&#xff1a; 定义一个函数&#xff0c;我们采用三种不同的方式对它进行调用&#xff0c;它产生了三种不同的结果 // 定义函数 function foo(name) {console.log("foo函数:", …...

Java的序列化

写在前面 本文看下序列化和反序列化相关的内容。 源码 。 1&#xff1a;为什么&#xff0c;什么是序列化和反序列化 Java对象是在jvm的堆中的&#xff0c;而堆其实就是一块内存&#xff0c;如果jvm重启数据将会丢失&#xff0c;当我们希望jvm重启也不要丢失某些对象&#xff…...

计算机二级python简单应用题刷题笔记(一)

计算机二级python简单应用题刷题笔记&#xff08;一&#xff09; 1、词频统计&#xff1a;键盘输入一组我国高校所对应的学校类型&#xff0c;以空格分隔&#xff0c;共一行。2、找最大值、最小值、平均分&#xff1a;键盘输入小明学习的课程名称及考分等信息&#xff0c;信息间…...

Spring注解家族介绍: @RequestMapping

前言&#xff1a; 今天我们来介绍RequestMapping这个注解&#xff0c;这个注解的内容相对来讲比较少&#xff0c;篇幅会比较短。 目录 前言&#xff1a; RequestMapping 应用场景&#xff1a; 总结&#xff1a; RequestMapping RequestMapping 是一个用于映射 HTTP 请求…...

系统架构设计师(第二版)学习笔记----信息安全系统及信息安全技术

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----信息加解密技术 文章目录 一、信息安全系统的组成框架1.1 信息安全系统组成框架1.2 信息安全系统技术内容1.3 常用的基础安全设备1.4 网络安全技术内容1.5 操作系统安全内容1.6 操作系统安全机制1.7 数据…...

交换机的工作原理(含实例,华为ensp操作)

目录​​​​​​​ ​​​​​​​1.交换机学习和转发 案例 1.设置静态地址表项 2.配置黑洞mac地址表项 1.交换机学习和转发 交换机工作在数据链路层。当交换机从某个端口收到一个帧时&#xff0c;它并不是向所有的接口转发此帧&#xff0c;而是根据此帧的目的MAC地址&a…...

从字符串中删除指定字符

任务描述 编写一个函数实现功能&#xff1a;从字符串中删除指定的字符。同一字母的大、小写按不同字符处理。例如&#xff1a;程序执行时输入字符串&#xff1a;turbo c and Borland c&#xff0c;从键盘输入字符n&#xff0c;则输出后变为&#xff1a;turbo c ad Borlad c。如…...

Xcode14.3.1 真机调试iOS17的方法(无iOS17 DeviceSupport)

由于iOS17需要使用Xcode15 才能调试&#xff0c;而当前Xcode15都是beta&#xff0c;正式版还未出&#xff0c;那么要真机调试iOS17的方式一般有两种&#xff1a; 方法一&#xff1a; 一种是下载新的Xcode15 beta版 &#xff08;但Xcode包一般比较大&#xff0c;好几个G&#…...

JWT基础

概念 JSON Web Token本质上就是一串字符串&#xff0c;一串包含了很多信息的字符串令牌拥有三个部分头部-包含加密算法和令牌类型{"alg":"算法名称","type":"JWT"}负载-包含数据和信息-七个官方默认-也可以自己定义内容{iss&#xff…...

关于远程工作的面试可能存在的陷阱

附上看到的完整帖子地址&#xff1a;面试 POPER 的后端开发工程师的离奇经历 分享一下我遇到过的&#xff0c;我至少面试过10个远程工作&#xff0c;其中有3个的面试是直接让我完成一个需求的&#xff0c;前两次都耐心做了&#xff0c;第3次看到相同要求时我都懒得回复了&…...

Qt5开发及实例V2.0-第一章Qt概述

Qt5开发及实例V2.0-第一章-Qt概述 第一章-Qt概述1.1 什么是Qt1.2 Qt 5的安装1.2.1 下载安装Qt 51.2.2 运行Qt 5 Creator1.2.3 Qt 5开发环境 1.3 Qt 5开发步骤及实例1.3.1 设计器Qt 5 Designer实现1.3.2 代码实现简单实例 L1.2 Qt 5安装&#xff1a;概念解析L1.3 Qt 5开发步骤及…...

matlab检索相似图像

在Matlab中检索相似图像通常需要使用图像处理和计算机视觉技术。以下是一种常见的方法&#xff0c;可以帮助您在Matlab中进行相似图像检索&#xff1a; 准备图像数据库&#xff1a; 首先&#xff0c;您需要有一个包含待检索图像的图像数据库。这些图像应该经过预处理&#xff0…...

ArrayBlockingQueue 带有三个参数的构造函数为何需要加锁?

哪一个构造函数 public ArrayBlockingQueue(int capacity, boolean fair,Collection<? extends E> c) {this(capacity, fair);final ReentrantLock lock = this.lock;lock.lock(); // Lock only for visibility, not mutual exclusiontry {final Object[] items = this…...

实训笔记——Spark计算框架

实训笔记——Spark计算框架 Spark计算框架一、Spark的概述二、Spark的特点三、Spark的安装部署&#xff08;安装部署Spark的Cluster Manager-资源调度管理器的&#xff09;3.1 本地安装--无资源管理器3.2 Spark的自带独立调度器Standalone3.2.1 主从架构的软件3.2.2 Master/wor…...

自定义类型:结构体

自定义类型&#xff1a;结构体 一&#xff1a;引入二&#xff1a;结构体类型的声明1&#xff1a;正常声明2&#xff1a;特殊声明 三&#xff1a;结构体变量的创建和初始化1:结构体变量的创建2&#xff1a;结构体变量的初始化 三&#xff1a;结构体访问操作符四&#xff1a;结构…...

postman如何设置才能SwitchHosts切换host无缓存请求到指定ip服务

开发测试中,遇到多版本同域名的服务使用postman进行测试,一般会搭配SwitchHosts切换host类似工具进行请求,postman缓存比较重,如何做到无缓存请求呢,下面简单记录一下如何实现 首先要知道如何当前请求服务的ip是哪个 打开postman 依次点击/menu/view/show postman console 就…...

LeetCode LCR 103. 零钱兑换【完全背包,恰好装满背包的最小问题】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

竞赛 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的人脸专注度…...

supervisord 进程管理器 Laravel执行队列

supervisord 进程管理器 执行队列 安装 yum install supervisor修改配置文件 /etc/supervisord.conf 最后一行 ini改为conf files=/etc/supervisor.d/*.conf vim /etc/supervisord.conf/etc/supervisord.d目录下新增配置文件 vim laravel-worker.conf 修改i 粘贴内容 退出修…...

Lnmp架构之mysql数据库实战1

1、mysql数据库编译 编译成功 2、mysql数据库初始化 配置数据目录 全局文件修改内容 生成初始化密码并进行初始化设定 3、mysql主从复制 什么是mysql的主从复制&#xff1f; MySQL的主从复制是一种常见的数据库复制技术&#xff0c;用于将一个数据库服务器&#xff08;称为主…...

ChatGLM 大模型炼丹手册-理论篇

序言一)大还丹的崛起 在修真界,人们一直渴望拥有一种神奇的「万能型丹药」,可包治百病。 但遗憾的是,在很长的一段时间里,炼丹师们只能对症炼药。每一枚丹药,都是特效药,专治一种病。这样就导致,每遇到一个新的问题,都需要针对性的炼制,炼丹师们苦不堪言,修真者们吐…...

wordpress 邮箱免验证/江苏营销型网站建设

索引&#xff1a; C# 3.0\3.5 新特性 C# 4.0 新特性 1、自动属性 以前private string lastName;public string LastName{get { return lastName; }set { lastName value; }} 现在 public string LastName{get;set;} C#编译器遇到上面空的get/set属性时&#xff0c;会自动在类…...

网站 提示建设中/网站维护公司

励学篇 赵恒(宋真宗) 富家不用买良田&#xff0c; 书中自有千钟粟。 安居不用架高楼&#xff0c; 书中自有黄金屋。 娶妻莫恨无良媒&#xff0c; 书中自有颜如玉。 出门莫恨无人随&#xff0c; 书中车马多如簇。 男儿欲遂平生志&#xff0c; 六经勤向窗前读。 最近正在…...

东莞定制网站建设/企业网站网页设计

网络下载图片方法一&#xff1a;//处理图片url---下载图片---保存图片到相册 //-(void)dealDownloadImageStr{ // dispatch_queue_t queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // dispatch_semaphore_t semaphore dispatch_semaphore_cre…...

网站建设合作伙伴/seo的关键词无需

目录OS/OS.PATH模块系统操作目录操作Path模块判断例题OS/OS.PATH模块 在Python里面&#xff0c;我们要对文件系统进行访问&#xff0c;一般是通过os模块来实现的Python是跨平台语言。有了os模块&#xff0c;不需要关心什么操作系统下使用什么模块 系统操作 os.name显示当前使…...

网站备案ip更换/石家庄网站建设就找

关系数据库设计范式介绍 .1 第一范式&#xff08;1NF&#xff09;无重复的列 所谓第一范式&#xff08;1NF&#xff09;是指数据库表的每一列都是不可分割的基本数据项&#xff0c;同一列中不能有多个值&#xff0c;即实体中的某个属性不能有多个值或者不能有重复的属性。…...

衢州做网站公司/免费域名注册查询

三年级推荐书目(一)1.父与子全集连环漫画《父与子》是德国幽默大师埃奥卜劳恩(1903-1944)的不朽杰作。作品中一个个生动幽默的小故事都是来自于漫画家在生活中的真实感受&#xff0c;父与子实际上就是卜劳恩与儿子克里斯蒂安的真实写照。一幅幅小巧精湛的画面闪烁着智慧之光&am…...