【算法设计与分析】— —单源最短路径的贪心算法

🎃欢迎大家前去观看我的算法设计与分析专栏: 算法设计与分析_IT闫的博客-CSDN博客 希望对大家有所帮助!


🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

🐳Java基础:Java基础_IT闫的博客-CSDN博客

🐋c语言:c语言_IT闫的博客-CSDN博客

🐟MySQL:数据结构_IT闫的博客-CSDN博客

🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

💎C++:C++_IT闫的博客-CSDN博客

🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

🥏python:python_IT闫的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

🎯目的:

🎯内容:

 🎯代码(Java):

🎯运行结果:

🎯 算法分析:

🎯其他程序语言的实现:

🎐C语言程序:

🎐python程序:

🎐C++程序:


🎯目的:

1)了解贪心算法思想及基本原理;

2)掌握使用贪心算法求解问题的一般特征;

3)能够针对实际问题,能够正确选择贪心策略;

4)能够针对选择的贪心策略,证明算法的正确性;

5)能够根据贪心策略,正确编写代码;

6)能够正确分析算法的时间复杂度和空间复杂度。

🎯内容:

单源最短路径的贪心算法。

测试数据可选用下图,1为源点:

 🎯代码(Java):

package one;public class Three {public static void main(String[] args) {// TODO Auto-generated method stubint x1[][] = { { 0, 2, 0, 1, 0, 3, 0, 0 }, { 0, 0, 6, 0, 5, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 6 },{ 0, 10, 0, 0, 0, 0, 2, 0 }, { 0, 0, 9, 0, 0, 0, 0, 4 }, { 0, 0, 0, 5, 0, 0, 4, 0 },{ 0, 7, 0, 0, 3, 0, 0, 8 }, { 0, 0, 0, 0, 0, 0, 0, 0 } };int s = 1;// 表示原点int[] dist = new int[x1.length];// 表示原点到各点的最短距离boolean[] visited = new boolean[x1.length];int [] pre=new int[x1.length];//记录最短路径的前驱结点for (int i = 0; i < x1.length; i++) {// 初始化dist[i] = Integer.MAX_VALUE;// 初始化为无穷大visited[i] = false;// 初始化为没有被访问过pre[i]=-1;//前去初始化为-1}dist[s - 1] = 0;// 自身到自身为0// 找原点到各个顶点的距离for (int i = 0; i < x1.length; i++) {int mindist = Integer.MAX_VALUE;// 最短路径int mindistindex = -1;// 最短路径的索引// 寻找路径中最短的for (int j = 0; j < x1.length; j++) {if (!(visited[j]) && dist[j] < mindist) {// 更新数据mindist = dist[j];mindistindex = j;}}visited[mindistindex] = true;// 将顶点添加到已访问数组中// 更新最短距离for (int j = 0; j < x1.length; j++) {if (!visited[j] && x1[mindistindex][j] != 0 && dist[mindistindex] != Integer.MAX_VALUE&& dist[mindistindex] + x1[mindistindex][j] < dist[j]) {dist[j] = dist[mindistindex] + x1[mindistindex][j];// 更新最短距离pre[j]=mindistindex+1;//记录前驱结点}}}System.out.printf("顶点:  ");for (int i = 0; i < x1.length; i++) {System.out.printf((i+1)+"   ");}System.out.println();System.out.printf("距离:       ");for (int i = 1; i < x1.length; i++) {System.out.printf(dist[i]+"   ");}System.out.println();System.out.printf("前驱:       ");for (int i = 1; i < x1.length; i++) {System.out.printf(pre[i]+"   ");}}

🎯运行结果:

🎯 算法分析:

时间复杂度:

  • 初始化阶段:需要遍历所有的顶点,时间复杂度为O(n)。
  • 最短路径查找阶段:需进行n次迭代,每次迭代需要遍历所有顶点,时间复杂度为O(n^2),因此,总体时间复杂度为O(n^2)。

空间复杂度:

  • 使用了四个数组,其中x1占用了O(n^2)的空间,dist,visited,pre占用各自O(n)的空间。因此,空间复杂度为O(n^2)。

        需要注意的是,时间复杂度和空间复杂度的分析是基于给定图的规模为n的情况下。在实际应用中,如果图的规模非常大,可以考虑采用优化算法或数据结构来减小时间和空间的开销。

🎯其他程序语言的实现:

以下代码均有ai生成,读者如发现bug可以发在评论区,咱们一起解决❤️!

🎐C语言程序:

#include <stdio.h>
#include <stdbool.h>
#include <limits.h>#define SIZE 8 // 矩阵大小void dijkstra(int graph[SIZE][SIZE], int source) {int dist[SIZE];     // 原点到各点的最短距离bool visited[SIZE]; // 记录节点是否被访问int pre[SIZE];      // 记录最短路径的前驱结点for (int i = 0; i < SIZE; i++) {dist[i] = INT_MAX;      // 初始化为无穷大visited[i] = false;     // 初始化为没有被访问过pre[i] = -1;            // 前驱初始化为-1}dist[source - 1] = 0; // 自身到自身为0// 找原点到各个顶点的距离for (int i = 0; i < SIZE; i++) {int minDist = INT_MAX; // 最短路径int minDistIndex = -1; // 最短路径的索引// 寻找路径中最短的for (int j = 0; j < SIZE; j++) {if (!visited[j] && dist[j] < minDist) {minDist = dist[j];minDistIndex = j;}}visited[minDistIndex] = true; // 将顶点添加到已访问数组中// 更新最短距离for (int j = 0; j < SIZE; j++) {if (!visited[j] && graph[minDistIndex][j] != 0 && dist[minDistIndex] != INT_MAX &&dist[minDistIndex] + graph[minDistIndex][j] < dist[j]) {dist[j] = dist[minDistIndex] + graph[minDistIndex][j]; // 更新最短距离pre[j] = minDistIndex + 1; // 记录前驱结点}}}printf("顶点:  ");for (int i = 0; i < SIZE; i++) {printf("%d   ", i + 1);}printf("\n");printf("距离:       ");for (int i = 1; i < SIZE; i++) {printf("%d   ", dist[i]);}printf("\n");printf("前驱:       ");for (int i = 1; i < SIZE; i++) {printf("%d   ", pre[i]);}
}int main() {int graph[SIZE][SIZE] = {{0, 2, 0, 1, 0, 3, 0, 0},{0, 0, 6, 0, 5, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 6},{0, 10, 0, 0, 0, 0, 2, 0},{0, 0, 9, 0, 0, 0, 0, 4},{0, 0, 0, 5, 0, 0, 4, 0},{0, 7, 0, 0, 3, 0, 0, 8},{0, 0, 0, 0, 0, 0, 0, 0}};int source = 1; // 表示原点dijkstra(graph, source);return 0;
}

🎐python程序:

import sysdef dijkstra(x1, s):dist = [sys.maxsize] * len(x1) # 表示原点到各点的最短距离visited = [False] * len(x1)pre = [-1] * len(x1) # 记录最短路径的前驱结点dist[s - 1] = 0 # 自身到自身为0for _ in range(len(x1)):mindist = sys.maxsize # 最短路径mindistindex = -1 # 最短路径的索引# 寻找路径中最短的for j in range(len(x1)):if not visited[j] and dist[j] < mindist:# 更新数据mindist = dist[j]mindistindex = jvisited[mindistindex] = True # 将顶点添加到已访问数组中# 更新最短距离for j in range(len(x1)):if not visited[j] and x1[mindistindex][j] != 0 and dist[mindistindex] != sys.maxsize and dist[mindistindex] + x1[mindistindex][j] < dist[j]:dist[j] = dist[mindistindex] + x1[mindistindex][j] # 更新最短距离pre[j] = mindistindex + 1 # 记录前驱结点print("顶点:", end=" ")for i in range(len(x1)):print(i + 1, end=" ")print()print("距离:", end="    ")for i in range(1, len(x1)):print(dist[i], end=" ")print()print("前驱:", end="    ")for i in range(1, len(x1)):print(pre[i], end=" ")print()if __name__ == "__main__":x1 = [[0, 2, 0, 1, 0, 3, 0, 0],[0, 0, 6, 0, 5, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 6],[0, 10, 0, 0, 0, 0, 2, 0],[0, 0, 9, 0, 0, 0, 0, 4],[0, 0, 0, 5, 0, 0, 4, 0],[0, 7, 0, 0, 3, 0, 0, 8],[0, 0, 0, 0, 0, 0, 0, 0]]s = 1 # 表示原点dijkstra(x1, s)

        请注意,Python中没有类似Java中的整型溢出问题,因此使用了sys.maxsize作为无穷大。另外,Python的索引是从0开始的,所以在输出时顶点和索引都需要加1。希望对你有所帮助!如有其他问题,请随时问我。

🎐C++程序:

#include<iostream>
using namespace std;int main(){int x1[8][8]={{0,2,0,1,0,3,0,0},{0,0,6,0,5,0,0,0},{0,0,0,0,0,0,0,6},{0,10,0,0,0,0,2,0},{0,0,9,0,0,0,0,4},{0,0,0,5,0,0,4,0},{0,7,0,0,3,0,0,8},{0,0,0,0,0,0,0,0}};int s=1;const int n=8;int dist[n],pre[n];bool visited[n];for(int i=0;i<n;i++){dist[i]=INT_MAX;visited[i]=false;pre[i]=-1;}dist[s-1]=0;for(int i=0;i<n;i++){int mindist=INT_MAX,mindistindex=-1;for(int j=0;j<n;j++){if(!visited[j]&&dist[j]<mindist){mindist=dist[j];mindistindex=j;}}visited[mindistindex]=true;for(int j=0;j<n;j++){if(!visited[j]&&x1[mindistindex][j]!=0&&dist[mindistindex]!=INT_MAX&&dist[mindistindex]+x1[mindistindex][j]<dist[j]){dist[j]=dist[mindistindex]+x1[mindistindex][j];pre[j]=mindistindex+1;}}}cout<<"顶点:  ";for(int i=0;i<n;i++){cout<<i+1<<"   ";}cout<<endl;cout<<"距离:       ";for(int i=1;i<n;i++){cout<<dist[i]<<"   ";}cout<<endl;cout<<"前驱:       ";for(int i=1;i<n;i++){cout<<pre[i]<<"   ";}cout<<endl;return 0;
}

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

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

相关文章

Spring 复习笔记

目录 第一步存 Bean第二步获取并使用 Bean依赖查找的方式ApplicationContext vs BeanFactory 更简单的存储 Bean1. 配合五大类注解使用2. 方法上添加注解 Bean 更简单的获取 Bean Spring IoC 容器管理的资源就是对象&#xff0c;这个对象也叫做 Bean。Spring 作为一个 IoC 容器…

zabbix自定义监控内容和自动发现

6 目录 一、自定义监控内容&#xff1a; 1.明确需要执行的 linux 命令 2.创建 zabbix 的监控项配置文件&#xff0c;用于自定义 key&#xff1a; 3. 在 Web 页面创建自定义监控项模板&#xff1a; 3.1 创建模板&#xff1a; 3.2 创建监控项&#xff1a; 3.3 创建触发器&#…

VxeTable 表格组件推荐

VxeTable 表格组件推荐 https://vxetable.cn 在前端开发中&#xff0c;表格组件是不可或缺的一部分&#xff0c;它们用于展示和管理数据&#xff0c;为用户提供了重要的数据交互功能。VxeTable 是一个优秀的 Vue 表格组件&#xff0c;它提供了丰富的功能和灵活的配置选项&…

关于优先队列的一点细节

在使用优先队列PriorityQueue时&#xff0c;默认的是升序排列&#xff0c;自己可以指定比较器改为降序排列&#xff0c;例如Collections.reverseOrder()等。 但是在我做力扣的过程中&#xff0c;简单的用一个list的addAll方法添加了优先队列里边所有元素&#xff0c;结果发现添…

【Spring】Spring MVC 程序开发

Spring MVC 程序开发 一. 什么是 Spring MVC1. MVC2. Spring、Spring Boot 与 Spring MVC 二. 创建 Spring MVC 项目1. 创建项目2. 用户和程序的映射3. 获取用户请求参数①. 获取单个参数②. 获取多个参数③. 传递对象④. 后端参数重命名&#xff08;后端参数映射&#xff09;R…

Django开发之进阶篇

Django进阶篇 一、Django学习之模板二、Django学习之中间件默认中间件自定义中间件 三、Django学习之ORM定义模型类生成数据库表操作数据库添加查询修改删除 一、Django学习之模板 在 Django 中&#xff0c;模板&#xff08;Template&#xff09;是用于生成动态 HTML&#xff…

vue-6

一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话&#xff0c;需要给当前跳转的导航加样式&#xff0c;同时要移除上一个a标签的样式&#xff0c;太麻烦&#xff01;&#xff01;&#xff01; 2.解决方案 vue-router 提供了一个全局组件 router…

【PickerView案例13-应用程序对象介绍 Objective-C语言】

一、应用程序对象介绍: 1.应用程序对象介绍: 应用程序介绍: 应用程序介绍: 应用程序介绍: 应用程序启动,本身这一过程,不是应用程序启动就完事儿了, 它有一些比较细节的东西,比如说: 1)info.plist以及pch文件 2)UIApplication对象 这个呢,我们都是分开的去说,…

北斗高精度定位为无人车成为机场运营新常态提供技术保障

在现代快节奏的生活中&#xff0c;人们对交通效率和安全性的需求越来越高。为了满足这一需求&#xff0c;无人驾驶技术被广泛研究和应用。而随着北斗卫星系统的发展&#xff0c;机场无人车正成为潜在的未来运输解决方案。本文将深入探讨北斗卫星如何改变机场运营&#xff0c;以…

一站式数据可视化与分析平台JVS智能BI强大的数据节点功能

在商业智能&#xff08;BI&#xff09;中&#xff0c;数据集是数据的集合&#xff0c;用于分析和报告。数据节点是数据集中的一个重要组成部分&#xff0c;它代表数据集中的一个特定数据点或数据元素。通过使用数据节点&#xff0c;可以对数据进行过滤、分组和计算&#xff0c;…

2785323-77-3,MAL-Alkyne,双功能连接试剂Alkyne maleimide

炔烃马来酰亚胺&#xff0c;Alkyne maleimide,MAL-Alkyne是一种非常有用的双功能连接试剂&#xff0c;可以在生物分子中发挥重要的作用。它的马来酰亚胺基团可以与生物分子中的硫醇基团反应&#xff0c;形成共价键&#xff0c;从而将生物分子与炔烃连接起来。这种连接方式在生物…

将 Ordinals 与比特币智能合约集成:第 3 部分

基于 Ordinals 的 BSV-20 同质化代币 之前&#xff0c;我们展示了如何将比特币智能合约与 Ordinals 集成&#xff0c;Ordinals 可以被视为链上的 NFT。 在本文中&#xff0c;我们将展示如何将它们与同质化代币&#xff08;即 BSV-20 代币&#xff09;集成。 我们仍然以拍卖为例…

【数据库——MySQL(实战项目1)】(2)图书借阅系统

目录 1. 简述2. 功能代码2.1 创建视图显示所有逾期未归还的借阅信息&#xff08;包括借阅人姓名&#xff0c;借阅人类别&#xff0c;书名&#xff0c;借出日期&#xff0c;应归还日期&#xff0c;逾期时长&#xff09;&#xff1b;2.2 创建存储过程&#xff0c;每借出一本图书&…

【算法笔记】LCR 086. 分割回文串

基本思想是使用回溯法&#xff0c;回溯法都可以将问题划分为一个解空间树&#xff1a;假设字符串s为"aab"&#xff0c;那么我们可以使用深度优先搜索去构建解空间树&#xff1a; dfs遍历出来的第一个序列是[a, a, b]&#xff0c;显然该序列都是回文子串&#xff0c;…

前后端分离项目-基于springboot+vue的足球青训俱乐部管理后台系统的设计与实现(内含代码+文档+报告)

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

colab切换目录的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【MySQL】深入理解MySQL中的Join算法

原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 什么是JoinIndex Nested-Loop JoinBlock Nested-Loop JoinMRR & BKA总结 在数据库处理中&#xff0c;Join操作是最基本且最重要的操作之一&#xff0c;它能将不同的表连接起来&#xff0c;实现对数据集…

前端八股文

目录 一、CSS1.说一下CSS的盒模型。2.CSS选择器的优先级&#xff1f;3.隐藏元素的方法有哪些&#xff1f;4.px和rem的区别是什么&#xff1f;5.重绘重排有什么区别&#xff1f;6.让一个元素水平垂直居中的方式有哪些&#xff1f;7.CSS的哪些属性哪些可以继承&#xff1f;哪些不…

vscode 调试使用 make 编译的项目

1、首先点击运行 --> 启动调试&#xff1a; 2、选择g或gcc生成和调试活动文件&#xff1a; 3、出现下面提示是正常的&#xff0c;点击仍要调试&#xff1a; 点击打开“launch.json”&#xff1a; 4、此时会在项目工作目录下生成tsak.josn和launch.json文件&#xff1a; 如…

Android rtmp 低延迟直播方案:简介

Android rtmp 低延迟直播方案:简介 Android RTMP 低延迟直播方案:使用 RTMP 推送至 ZLMediaKit,通过 WebRTC 进行拉流。