本文实例讲述了Java贪心算法之Prime算法原理与实现方法。分享给大家供大家参考,具体如下:

Prime算法:是一种穷举查找算法来从一个连通图中构造一棵最小生成树。利用始终找到与当前树中节点权重最小的边,找到节点,加到最小生成树的节点集合中,直至所有节点都包括其中,这样就构成了一棵最小生成树。prime在算法中属于贪心算法的一种,贪心算法还有:Kruskal、Dijkstra以及哈夫曼树及编码算法。
下面具体讲一下prime算法:
1、首先需要构造一颗最小生成树,以及两个节点之间的权重数组,在此我们用一个二维数组来代表这样一个连通图的形式。节点就是0~数组长度-1,10000代表节点本身,权重 >= 100代表两个节点不连通,反之连通。
构建连通图代码如下:
// 初始化连通图
public static void initGraph(int[][] graph, ArrayList<Integer> points) {
for(int i = 0 ; i < graph.length; i++) {
points.add(i);
for(int j = 0; j < graph[i].length; j++) {
if(i == j) {
graph[i][j] = 10000;
}else {
int temp = (int)(Math.random() * 200 +1);
graph[i][j] = temp; // 大于等于100不连通, 小于100连通
}
graph[j][i] = graph[i][j];
}
}
}
连通图的数组表示:
2、找到距离当前树中节点权重最小的边,开始节点随机产生,(算法的重点)!!!
// prime算法实现
public static int prime(int[][] graph, ArrayList<Integer> points, int current) {
String path = "";
ArrayList<Integer> selectPoints = new ArrayList<Integer>(); // 选中的点集合
int totalWeights = 0; // 权重总和
selectPoints.add(current); // 添加初始开始节点
points.remove(current); // 从未选择的节点集合中删除被选中的节点
path = "|" + current + "|";
System.out.println("当前路径:" + path);
System.out.println("当前已选中节点: " + selectPoints.toString());
System.out.println("当前剩余节点: " + points.toString());
System.out.println("当前总权重: " + totalWeights);
// 循环找出最小权重的边 直至所有的点都被选中
while(points.size() > 0) {
// 遍历选中的点相连的边中权重最小的边记录下来
int mincost = 0; // 最小权重
int mincostPoint = selectPoints.get(0); // 最小权重边对应的点
List<Integer> linePoints = new ArrayList<Integer>(); // 记录所有与已选中点相连的点
for(int i = 0 ; i < selectPoints.size(); i++) {
for(int j = 0; j < points.size(); j++) {
int startPoint = selectPoints.get(i); // 起点
int endPoint = points.get(j); // 终点
// 两点是相连的
if(graph[startPoint][endPoint] != 10000 && graph[startPoint][endPoint] < 100) {
// 将和已选中点连通的点加入连通集合
linePoints.add(points.get(j));
if(linePoints.size() == 1) {
// 将第一个连通的边的权重赋值为最小权重
mincost = graph[startPoint][linePoints.get(0)];
// 最小权重相连的点
mincostPoint = endPoint;
}else {
// 与当前的最小权重比较
if(graph[startPoint][endPoint] < mincost) {
// 最小权重相连的点
mincost = graph[startPoint][endPoint];
mincostPoint = endPoint;
}
}
}
}
}
if(mincost != 0) { // 证明是找到了相连的点
selectPoints.add(mincostPoint); // 添加点
points = (ArrayList<Integer>) removeFormPoints(points, mincostPoint);
// 权重增加
totalWeights += mincost;
path += " ---" + mincost + "--- |" + mincostPoint + "|";
System.out.println("当前路径:" + path);
}else {
System.out.println("不连通");
return 0;
}
// 打印当前所选中的最小权重边对应的点
System.out.println("当前已选中节点: " + selectPoints.toString());
System.out.println("当前剩余节点: " + points.toString());
System.out.println("当前总权重: " + totalWeights);
}
System.out.println("总路径:" + path);
// 返回总权重
return totalWeights;
}
// 删除剩余节点中的相连通的最小权重的节点的方法(就是将该节点加入最小生成树中)
public static List<Integer> removeFormPoints(ArrayList<Integer> points, int mincostPoint) {
List<Integer> tempPoints = new ArrayList<Integer>();
for(int i = 0; i < points.size(); i++) {
if(points.get(i) != mincostPoint) {
tempPoints.add(points.get(i));
}
}
return tempPoints;
}
以下是算法实现过程的打印信息:
10000 101 72 100 146 101 10000 67 64 11 72 67 10000 13 79 100 64 13 10000 111 146 11 79 111 10000 开始所有节点集:[0, 1, 2, 3, 4] 开始节点:1 当前路径:|1| 当前已选中节点: [1] 当前剩余节点: [0, 2, 3, 4] 当前总权重: 0 当前路径:|1| ---11--- |4| 当前已选中节点: [1, 4] 当前剩余节点: [0, 2, 3] 当前总权重: 11 当前路径:|1| ---11--- |4| ---64--- |3| 当前已选中节点: [1, 4, 3] 当前剩余节点: [0, 2] 当前总权重: 75 当前路径:|1| ---11--- |4| ---64--- |3| ---13--- |2| 当前已选中节点: [1, 4, 3, 2] 当前剩余节点: [0] 当前总权重: 88 当前路径:|1| ---11--- |4| ---64--- |3| ---13--- |2| ---72--- |0| 当前已选中节点: [1, 4, 3, 2, 0] 当前剩余节点: [] 当前总权重: 160 总路径:|1| ---11--- |4| ---64--- |3| ---13--- |2| ---72--- |0| 总权重:160
该算法只是个人的理解实现,若有其他想法或者建议,欢迎大家交流。
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
# Java
# 贪心算法
# Prime算法
# Java使用贪心算法解决电台覆盖问题(示例详解)
# Java 数据结构与算法系列精讲之贪心算法
# java贪心算法初学感悟图解及示例分享
# 贪心算法原理及在Java中的使用
# 浅析java贪心算法
# Java贪心算法超详细讲解
# 一棵
# 操作技巧
# 穷举
# 是一种
# 相关内容
# 第一个
# 在此
# 遍历
# 一颗
# 感兴趣
# 数据结构
# 给大家
# 这样一个
# 欢迎大家
# 若有
# 更多关于
# 所述
# 将该
# 图中
# 程序设计
相关文章:
如何快速搭建虚拟主机网站?新手必看指南
jQuery 常见小例汇总
如何在服务器上配置二级域名建站?
如何在西部数码注册域名并快速搭建网站?
网站制作软件有哪些,制图软件有哪些?
广东企业建站网站优化与SEO营销核心策略指南
linux top下的 minerd 木马清除方法
高防服务器租用指南:配置选择与快速部署攻略
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
如何获取开源自助建站系统免费下载链接?
*服务器网站为何频现安全漏洞?
大连 网站制作,大连天途有线官网?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何快速搭建高效服务器建站系统?
,网站推广常用方法?
如何在Golang中使用replace替换模块_指定本地或远程路径
免费网站制作appp,免费制作app哪个平台好?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
,在苏州找工作,上哪个网站比较好?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
建站主机与服务器功能差异如何区分?
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何在建站之星绑定自定义域名?
盐城做公司网站,江苏电子版退休证办理流程?
网站制作壁纸教程视频,电脑壁纸网站?
如何在Windows 2008云服务器安全搭建网站?
建站之星ASP如何实现CMS高效搭建与安全管理?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
建站之星安装步骤有哪些常见问题?
开心动漫网站制作软件下载,十分开心动画为何停播?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
建站主机选购指南与交易推荐:核心配置解析
青浦网站制作公司有哪些,苹果官网发货地是哪里?
如何通过山东自助建站平台快速注册域名?
网页设计网站制作软件,microsoft office哪个可以创建网页?
山东网站制作公司有哪些,山东大源集团官网?
建站主机如何安装配置?新手必看操作指南
手机网站制作与建设方案,手机网站如何建设?
哈尔滨网站建设策划,哈尔滨电工证查询网站?
淘宝制作网站有哪些,淘宝网官网主页?
建站主机选虚拟主机还是云服务器更好?
大连网站设计制作招聘信息,大连投诉网站有哪些?
英语简历制作免费网站推荐,如何将简历翻译成英文?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
智能起名网站制作软件有哪些,制作logo的软件?
建站上传速度慢?如何优化加速网站加载效率?
C#怎么创建控制台应用 C# Console App项目创建方法
*请认真填写需求信息,我们会在24小时内与您取得联系。