算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
一、名称
动态规划法应用
二、目的
1.贪婪技术的基本思想;
2.学会运用贪婪技术解决实际设计应用中碰到的问题。
三、要求
1.实现基于贪婪技术思想的Prim算法;
2.实现基于贪婪技术思想的Dijkstra算法。
四、内容
1.实现基于贪婪技术思想的Prim算法
1.1、Prim算法的伪代码描述
算法 Prim(G)
//构造最小生成树的Prim算法
//输入:加权连通图G<V,E>
//输出:E(T),组成G的最小生成树的边的集合
V(t)←{V0} //可以用任意顶点来初始化树的顶点集合
Er←◎(集合空)
For i←1 to |V|-1 do
在所有的边(v,u)中,求权重最小的边e*=(v*,u*),
使得v在Vt中而V-Vt中
V←VtU{u*}
Et←ErU{e*}
Return Er
2.2、Prim算法的源代码实现
package com.zyz.four;
import java.util.*;
public class Primel {
static int MAX = Integer.MAX_VALUE;
public static void main(String[] args) {
int[][] map = new int[][]{
{0, 10, MAX, MAX, MAX, 11, MAX, MAX, MAX},
{10, 0, 18, MAX, MAX, MAX, 16, MAX, 12},
{MAX, MAX, 0, 22, MAX, MAX, MAX, MAX, 8},
{MAX, MAX, 22, 0, 20, MAX, MAX, 16, 21},
{MAX, MAX, MAX, 20, 0, 26, MAX, 7, MAX},
{11, MAX, MAX, MAX, 26, 0, 17, MAX, MAX},
{MAX, 16, MAX, MAX, MAX, 17, 0, 19, MAX},
{MAX, MAX, MAX, 16, 7, MAX, 19, 0, MAX},
{MAX, 12, 8, 21, MAX, MAX, MAX, MAX, 0}};
prim(map, map.length);
}
public static void prim(int[][] graph, int n) {
char[] c = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'E', 'F'};
int[] lowcost = new int[n]; //到新集合的最小权
int[] mid = new int[n];//存取前驱结点
List<Character> list = new ArrayList<Character>();//用来存储加入结点的顺序
int i, j, min, minid, sum = 0;
//初始化辅助数组
for (i = 1; i < n; i++) {
lowcost[i] = graph[0][i];
mid[i] = 0;
}
list.add(c[0]);
//一共需要加入n-1个点
for (i = 1; i < n; i++) {
min = MAX;
minid = 0;
//每次找到距离集合最近的点
for (j = 1; j < n; j++) {
if (lowcost[j] != 0 && lowcost[j] < min) {
min = lowcost[j];
minid = j;
}
}
if (minid == 0) return;
list.add(c[minid]);
lowcost[minid] = 0;
sum += min;
System.out.println(c[mid[minid]] + "到" + c[minid] + " 权值:" + min);
//加入该点后,更新其它点到集合的距离
for (j = 1; j < n; j++) {
if (lowcost[j] != 0 && lowcost[j] > graph[minid][j]) {
lowcost[j] = graph[minid][j];
mid[j] = minid;
}
}
}
System.out.println("sum:" + sum);
}
}
2.3、Prim算法的时间效率分析
时间效率:Tn=O(n*n),在每一遍|V|-1次迭代中,就要遍历实现优先队列的数组,来查找并删除距离最小的顶点,如果有必要,在更新余下顶点的优先级。
2.实现基于贪婪技术思想的Dijkstra算法
2.1、Dijkstra算法的伪代码描述
算法 Dijkstra(G,s)
//单起点最短路径的Dijkstra算法
//输入:具非权重加权连通图G=<V,E>以及它的顶点s
//输出:对于V中的每个顶点v来说,从s到v的最短路径的长度d
//以及路径上的倒数第二个顶点Pv
Initialize(Q)//将顶点优先从队列初始化为空
For V中每一个顶点v
dr←无穷大;Pv←null
insert(Q,v,dv)//初始化优先队列中顶点的优先级
ds←0;Decrease(Q,s,ds)//将s的优先级更新为ds
V(r) ←空集
For i←0 to |V|-1 do
u* ←DeleteMin(Q) //删除优先级最小的元素
Vr←VrU{u*}
For V-Vr中每一个和u*相邻的顶点u do
if du*+w(u*,u)<du
du←du*+w(u*,u);pu du*+w(u*,u)u*
Decrease(Q,u,du)
2.2、Dijkstra算法的源代码实现
package com.zyz.four;
public class Dijkstra {
/*
* 参数adjMatrix:为图的权重矩阵,权值为-1的两个顶点表示不能直接相连
* 函数功能:返回顶点0到其它所有顶点的最短距离,其中顶点0到顶点0的最短距离为0
*/
public int[] getShortestPaths(int[][] adjMatrix) {
int[] result = new int[adjMatrix.length]; //用于存放顶点0到其它顶点的最短距离
boolean[] used = new boolean[adjMatrix.length]; //用于判断顶点是否被遍历
used[0] = true; //表示顶点0已被遍历
for(int i = 1;i < adjMatrix.length;i++) {
result[i] = adjMatrix[0][i];
used[i] = false;
}
for(int i = 1;i < adjMatrix.length;i++) {
int min = Integer.MAX_VALUE; //用于暂时存放顶点0到i的最短距离,初始化为Integer型最大值
int k = 0;
for(int j = 1;j < adjMatrix.length;j++) { //找到顶点0到其它顶点中距离最小的一个顶点
if(!used[j] && result[j] != -1 && min > result[j]) {
min = result[j];
k = j;
}
}
used[k] = true; //将距离最小的顶点,记为已遍历
for(int j = 1;j < adjMatrix.length;j++) { //然后,将顶点0到其它顶点的距离与加入中间顶点k之后的距离进行比较,更新最短距离
if(!used[j]) { //当顶点j未被遍历时
//首先,顶点k到顶点j要能通行;这时,当顶点0到顶点j的距离大于顶点0到k再到j的距离或者顶点0无法直接到达顶点j时,更新顶点0到顶点j的最短距离
if(adjMatrix[k][j] != -1 && (result[j] > min + adjMatrix[k][j] || result[j] == -1))
result[j] = min + adjMatrix[k][j];
}
}
}
return result;
}
public static void main(String[] args) {
Dijkstra test = new Dijkstra();
int[][] adjMatrix = {{0,6,3,-1,-1,-1},
{6,0,2,5,-1,-1},
{3,2,0,3,4,-1},
{-1,5,3,0,2,3},
{-1,-1,4,2,0,5},
{-1,-1,-1,3,5,0}};
int[] result = test.getShortestPaths(adjMatrix);
System.out.println("顶点0到图中所有顶点之间的最短距离为:");
for(int i = 0;i < result.length;i++)
System.out.print(result[i]+" ");
}
}
2.3、Dijkstra算法的时间效率分析
Dijkstra复杂度是O(N^2),用权重矩阵表示,优先队列用无序数组来实现。
3、运行结果
3.1、Dijkstra算法的测试用例结果截图
3.2、Prim算法的测试用例结果截图
4、小结
在实验的过程中,我对贪婪技术的基本思想有了更加深入的了解。学会使用动态规划的目的,将问题从小的方面开始解决,逐步向解决整个问题靠近。通过本次实验、我了解到基于贪婪技术思想的Prim算法、Dijkstra算法基本原理。掌握了基本的使用方法、能够运用这种思路解决生活中的实际问题。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法的更多相关文章
- 基于STL优先队列和邻接表的dijkstra算法
首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...
- 算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
一.名称 动态规划法应用 二.目的 1.掌握动态规划法的基本思想: 2.学会运用动态规划法解决实际设计应用中碰到的问题. 三.要求 1.基于动态规划法思想解决背包问题(递归或自底向上的实现均可): 2 ...
- Python数据结构与算法设计总结篇
1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static ...
- 20145216史婧瑶《Java程序设计》第五次实验报告
20145216 实验五<Java网络编程> 实验内容 1.掌握Socket程序的编写 2.掌握密码技术的使用 3.设计安全传输系统 实验要求 1.基于Java Socket实现安全传输 ...
- Python数据结构与算法设计(总结篇)
的确,正如偶像Bruce Eckel所说,"Life is short, you need Python"! 如果你正在考虑学Java还是Python的话,那就别想了,选Pytho ...
- 2019JAVA第二次实验报告
Java实验报告 班级 计算机科学与技术二班 学号 20188442 姓名 吴怡君 完成时间 2019/9/19 评分等级 实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方 ...
- DS实验题 Dijkstra算法
参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...
- JAVA 实验报告
石家庄铁道大学信息科学与技术学院 实验报告 2018年----2019年 第一学期 题目: 四则运算.生成验证码 课程名称: JAVA语言程序设 ...
- Java基本语法实验报告
题目: Java基本语法 课程名称: JAVA语言程序设计 班 级: 信1705-1 姓 名: 刘雨馨 学号: 20173445 指导教师: ...
随机推荐
- JavaScript 里三个点 ...,可不是省略号啊···
摘要:Three dots ( - ) in JavaScript. 本文分享自华为云社区<JavaScript 里三个点 ... 的用法>,作者: Jerry Wang . Rest P ...
- 越折腾越好用的 3 款开源 APP
高中的时候我特别喜欢捣鼓手机,然后我一个哥们儿在我的强烈推荐下买了个 HTC Dream(G1) 手机. G1 作为谷歌的第一个亲儿子,它出厂搭载的是 Android 1.5 系统,但当时已经出到了 ...
- Dubbo源码(七) - 集群
前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 集群(cluster)就是一组计算机,它们作为一个总体向用户提供一组网络资源.这些单个的计算机系 ...
- selenium结合jmeter进行测试
背景 现在市面上有众多成熟的性能测试工具,JMeter就是其中之一.可以通过JMeter快速将已有的Selenium代码以性能测试的方式组织起来,并使用JMeter丰富的报表功能展示测试结果. 相关链 ...
- jQuery基础入门(二)
jQuery 效果 显示和隐藏 在 jQuery 中可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素,以及使用 toggle() 方法能够切换 hide() 和 show() ...
- GCC常见命令
rwx 对于目录和文件的区别 文件 目录 r 文件的内容可以被查看.支持cat.more.head...vim 目录的内容可以被查看.ls.tree w 文件的内容可以被添加.修改.删除.vim &g ...
- 搞定面试官 - 你可以介绍一下在 MySQL 中,哪些情况下 索引会失效嘛?
大家好,我是程序员啊粥,前边给大家分享了 *MySQL InnoDB 索引模型 在 MySQL InnoDB 中,为什么 delete 删除数据之后表数据文件大小没有变 如何计算一个索引的长度 如何查 ...
- MySQL-报错:Error when bootstrapping CMake:
在进行MySQL的源码安装的时候,系统上找不到合适的C编译器,GCC忘了装,莫慌,直接 yum命令装上gcc,还有gcc-C++没装的话后面也会提示错误,一起装上,,, [root@localhos ...
- Vmware 虚拟机连接外网和设置固定IP
NAT 模式(地址转换模式) 在NAT模式中,主机网卡直接与虚拟NAT设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上,虚拟机借助NAT功能,通过宿主机器所在的网络来 ...
- Learn Dijkstra For The Last Time
博客链接:https://www.codein.icu/learn-dijkstra/ Introduction Dijkstra 算法是用于求解非负权图单源最短路的经典算法. 市面上的大部分教程都仅 ...