一、名称

动态规划法应用

二、目的

1.贪婪技术的基本思想;
2.学会运用贪婪技术解决实际设计应用中碰到的问题。

三、要求

1.实现基于贪婪技术思想的Prim算法;
2.实现基于贪婪技术思想的Dijkstra算法。

四、内容

1.实现基于贪婪技术思想的Prim算法

1.1、Prim算法的伪代码描述

  1. 算法 Prim(G)
  2. //构造最小生成树的Prim算法
  3. //输入:加权连通图G<V,E>
  4. //输出:E(T),组成G的最小生成树的边的集合
  5. V(t)←{V0} //可以用任意顶点来初始化树的顶点集合
  6. Er←◎(集合空)
  7. For i1 to |V|-1 do
  8. 在所有的边(v,u)中,求权重最小的边e*=(v*,u*),
  9. 使得vVt中而V-Vt
  10. VVtU{u*}
  11. EtErU{e*}
  12. Return Er

2.2、Prim算法的源代码实现


  1. package com.zyz.four;
  2. import java.util.*;
  3. public class Primel {
  4. static int MAX = Integer.MAX_VALUE;
  5. public static void main(String[] args) {
  6. int[][] map = new int[][]{
  7. {0, 10, MAX, MAX, MAX, 11, MAX, MAX, MAX},
  8. {10, 0, 18, MAX, MAX, MAX, 16, MAX, 12},
  9. {MAX, MAX, 0, 22, MAX, MAX, MAX, MAX, 8},
  10. {MAX, MAX, 22, 0, 20, MAX, MAX, 16, 21},
  11. {MAX, MAX, MAX, 20, 0, 26, MAX, 7, MAX},
  12. {11, MAX, MAX, MAX, 26, 0, 17, MAX, MAX},
  13. {MAX, 16, MAX, MAX, MAX, 17, 0, 19, MAX},
  14. {MAX, MAX, MAX, 16, 7, MAX, 19, 0, MAX},
  15. {MAX, 12, 8, 21, MAX, MAX, MAX, MAX, 0}};
  16. prim(map, map.length);
  17. }
  18. public static void prim(int[][] graph, int n) {
  19. char[] c = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'E', 'F'};
  20. int[] lowcost = new int[n]; //到新集合的最小权
  21. int[] mid = new int[n];//存取前驱结点
  22. List<Character> list = new ArrayList<Character>();//用来存储加入结点的顺序
  23. int i, j, min, minid, sum = 0;
  24. //初始化辅助数组
  25. for (i = 1; i < n; i++) {
  26. lowcost[i] = graph[0][i];
  27. mid[i] = 0;
  28. }
  29. list.add(c[0]);
  30. //一共需要加入n-1个点
  31. for (i = 1; i < n; i++) {
  32. min = MAX;
  33. minid = 0;
  34. //每次找到距离集合最近的点
  35. for (j = 1; j < n; j++) {
  36. if (lowcost[j] != 0 && lowcost[j] < min) {
  37. min = lowcost[j];
  38. minid = j;
  39. }
  40. }
  41. if (minid == 0) return;
  42. list.add(c[minid]);
  43. lowcost[minid] = 0;
  44. sum += min;
  45. System.out.println(c[mid[minid]] + "到" + c[minid] + " 权值:" + min);
  46. //加入该点后,更新其它点到集合的距离
  47. for (j = 1; j < n; j++) {
  48. if (lowcost[j] != 0 && lowcost[j] > graph[minid][j]) {
  49. lowcost[j] = graph[minid][j];
  50. mid[j] = minid;
  51. }
  52. }
  53. }
  54. System.out.println("sum:" + sum);
  55. }
  56. }

2.3、Prim算法的时间效率分析

时间效率:Tn=O(n*n),在每一遍|V|-1次迭代中,就要遍历实现优先队列的数组,来查找并删除距离最小的顶点,如果有必要,在更新余下顶点的优先级。

2.实现基于贪婪技术思想的Dijkstra算法

2.1、Dijkstra算法的伪代码描述

  1. 算法 DijkstraGs
  2. //单起点最短路径的Dijkstra算法
  3. //输入:具非权重加权连通图G=<V,E>以及它的顶点s
  4. //输出:对于V中的每个顶点v来说,从s到v的最短路径的长度d
  5. //以及路径上的倒数第二个顶点Pv
  6. Initialize(Q)//将顶点优先从队列初始化为空
  7. For V中每一个顶点v
  8. dr←无穷大;Pvnull
  9. insert(Q,v,dv)//初始化优先队列中顶点的优先级
  10. ds0;Decrease(Q,s,ds)//将s的优先级更新为ds
  11. V(r) ←空集
  12. For i0 to |V|-1 do
  13. u* DeleteMin(Q) //删除优先级最小的元素
  14. VrVrU{u*}
  15. For V-Vr中每一个和u*相邻的顶点u do
  16. if du*+w(u*,u)<du
  17. dudu*+w(u*,u);pu du*+w(u*,u)u*
  18. Decrease(Q,u,du)

2.2、Dijkstra算法的源代码实现

  1. package com.zyz.four;
  2. public class Dijkstra {
  3. /*
  4. * 参数adjMatrix:为图的权重矩阵,权值为-1的两个顶点表示不能直接相连
  5. * 函数功能:返回顶点0到其它所有顶点的最短距离,其中顶点0到顶点0的最短距离为0
  6. */
  7. public int[] getShortestPaths(int[][] adjMatrix) {
  8. int[] result = new int[adjMatrix.length]; //用于存放顶点0到其它顶点的最短距离
  9. boolean[] used = new boolean[adjMatrix.length]; //用于判断顶点是否被遍历
  10. used[0] = true; //表示顶点0已被遍历
  11. for(int i = 1;i < adjMatrix.length;i++) {
  12. result[i] = adjMatrix[0][i];
  13. used[i] = false;
  14. }
  15. for(int i = 1;i < adjMatrix.length;i++) {
  16. int min = Integer.MAX_VALUE; //用于暂时存放顶点0到i的最短距离,初始化为Integer型最大值
  17. int k = 0;
  18. for(int j = 1;j < adjMatrix.length;j++) { //找到顶点0到其它顶点中距离最小的一个顶点
  19. if(!used[j] && result[j] != -1 && min > result[j]) {
  20. min = result[j];
  21. k = j;
  22. }
  23. }
  24. used[k] = true; //将距离最小的顶点,记为已遍历
  25. for(int j = 1;j < adjMatrix.length;j++) { //然后,将顶点0到其它顶点的距离与加入中间顶点k之后的距离进行比较,更新最短距离
  26. if(!used[j]) { //当顶点j未被遍历时
  27. //首先,顶点k到顶点j要能通行;这时,当顶点0到顶点j的距离大于顶点0到k再到j的距离或者顶点0无法直接到达顶点j时,更新顶点0到顶点j的最短距离
  28. if(adjMatrix[k][j] != -1 && (result[j] > min + adjMatrix[k][j] || result[j] == -1))
  29. result[j] = min + adjMatrix[k][j];
  30. }
  31. }
  32. }
  33. return result;
  34. }
  35. public static void main(String[] args) {
  36. Dijkstra test = new Dijkstra();
  37. int[][] adjMatrix = {{0,6,3,-1,-1,-1},
  38. {6,0,2,5,-1,-1},
  39. {3,2,0,3,4,-1},
  40. {-1,5,3,0,2,3},
  41. {-1,-1,4,2,0,5},
  42. {-1,-1,-1,3,5,0}};
  43. int[] result = test.getShortestPaths(adjMatrix);
  44. System.out.println("顶点0到图中所有顶点之间的最短距离为:");
  45. for(int i = 0;i < result.length;i++)
  46. System.out.print(result[i]+" ");
  47. }
  48. }

2.3、Dijkstra算法的时间效率分析

Dijkstra复杂度是O(N^2),用权重矩阵表示,优先队列用无序数组来实现。

3、运行结果

3.1、Dijkstra算法的测试用例结果截图

3.2、Prim算法的测试用例结果截图

4、小结

在实验的过程中,我对贪婪技术的基本思想有了更加深入的了解。学会使用动态规划的目的,将问题从小的方面开始解决,逐步向解决整个问题靠近。通过本次实验、我了解到基于贪婪技术思想的Prim算法、Dijkstra算法基本原理。掌握了基本的使用方法、能够运用这种思路解决生活中的实际问题。

算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法的更多相关文章

  1. 基于STL优先队列和邻接表的dijkstra算法

    首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...

  2. 算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法

    一.名称 动态规划法应用 二.目的 1.掌握动态规划法的基本思想: 2.学会运用动态规划法解决实际设计应用中碰到的问题. 三.要求 1.基于动态规划法思想解决背包问题(递归或自底向上的实现均可): 2 ...

  3. Python数据结构与算法设计总结篇

    1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static ...

  4. 20145216史婧瑶《Java程序设计》第五次实验报告

    20145216 实验五<Java网络编程> 实验内容 1.掌握Socket程序的编写 2.掌握密码技术的使用 3.设计安全传输系统 实验要求 1.基于Java Socket实现安全传输 ...

  5. Python数据结构与算法设计(总结篇)

    的确,正如偶像Bruce Eckel所说,"Life is short, you need Python"! 如果你正在考虑学Java还是Python的话,那就别想了,选Pytho ...

  6. 2019JAVA第二次实验报告

    Java实验报告 班级 计算机科学与技术二班 学号 20188442 姓名 吴怡君 完成时间 2019/9/19 评分等级 实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方 ...

  7. DS实验题 Dijkstra算法

    参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...

  8. JAVA 实验报告

        石家庄铁道大学信息科学与技术学院       实验报告 2018年----2019年  第一学期               题目:   四则运算.生成验证码 课程名称:  JAVA语言程序设 ...

  9. Java基本语法实验报告

      题目:       Java基本语法 课程名称:  JAVA语言程序设计 班    级:    信1705-1 姓    名:   刘雨馨     学号:   20173445 指导教师:    ...

随机推荐

  1. JavaScript 里三个点 ...,可不是省略号啊···

    摘要:Three dots ( - ) in JavaScript. 本文分享自华为云社区<JavaScript 里三个点 ... 的用法>,作者: Jerry Wang . Rest P ...

  2. 越折腾越好用的 3 款开源 APP

    高中的时候我特别喜欢捣鼓手机,然后我一个哥们儿在我的强烈推荐下买了个 HTC Dream(G1) 手机. G1 作为谷歌的第一个亲儿子,它出厂搭载的是 Android 1.5 系统,但当时已经出到了 ...

  3. Dubbo源码(七) - 集群

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 集群(cluster)就是一组计算机,它们作为一个总体向用户提供一组网络资源.这些单个的计算机系 ...

  4. selenium结合jmeter进行测试

    背景 现在市面上有众多成熟的性能测试工具,JMeter就是其中之一.可以通过JMeter快速将已有的Selenium代码以性能测试的方式组织起来,并使用JMeter丰富的报表功能展示测试结果. 相关链 ...

  5. jQuery基础入门(二)

    jQuery 效果 显示和隐藏 在 jQuery 中可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素,以及使用 toggle() 方法能够切换 hide() 和 show() ...

  6. GCC常见命令

    rwx 对于目录和文件的区别 文件 目录 r 文件的内容可以被查看.支持cat.more.head...vim 目录的内容可以被查看.ls.tree w 文件的内容可以被添加.修改.删除.vim &g ...

  7. 搞定面试官 - 你可以介绍一下在 MySQL 中,哪些情况下 索引会失效嘛?

    大家好,我是程序员啊粥,前边给大家分享了 *MySQL InnoDB 索引模型 在 MySQL InnoDB 中,为什么 delete 删除数据之后表数据文件大小没有变 如何计算一个索引的长度 如何查 ...

  8. MySQL-报错:Error when bootstrapping CMake:

    在进行MySQL的源码安装的时候,系统上找不到合适的C编译器,GCC忘了装,莫慌,直接  yum命令装上gcc,还有gcc-C++没装的话后面也会提示错误,一起装上,,, [root@localhos ...

  9. Vmware 虚拟机连接外网和设置固定IP

    NAT 模式(地址转换模式) 在NAT模式中,主机网卡直接与虚拟NAT设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上,虚拟机借助NAT功能,通过宿主机器所在的网络来 ...

  10. Learn Dijkstra For The Last Time

    博客链接:https://www.codein.icu/learn-dijkstra/ Introduction Dijkstra 算法是用于求解非负权图单源最短路的经典算法. 市面上的大部分教程都仅 ...