继上一篇文章的Prim算法,今天学习使用的是Kruskal算法,Prim和Kruskal算法作用是相同的,都是为了求解加权图问题中的最小生成树,至于Kruskal算法的原理也是很好理解的,这里不多累赘简单概要一下Kruskal算法的的核心思想:

首先设置一个空的集合A,依次从原始图中寻找权重最小的边加入到A中,一个前提和原则是:不能形成回路,n个顶点,当A中存在n-1条边的时候算法终止

核心思想就是这么简洁,但是算法这东西,往往就是越简单越是容易被接受和使用,我本人对于Kruskal算法和Prim算法在本科的时候考试做题编程都是使用Kruskal算法居多,可能就是感觉这个做起来更方便了一点,简单实现了一下如下:

#!usr/bin/env python
#encoding:utf-8'''
__Author__:沂水寒城
功能:使用Kruskal算法求加权连通图的最小生成树
'''import random
import time
import numpydef random_matrix_genetor(vex_num=10):'''随机图顶点矩阵生成器输入:顶点个数,即矩阵维数'''data_matrix=[]for i in range(vex_num):one_list=[]for j in range(vex_num):one_list.append(random.randint(1, 100))data_matrix.append(one_list)return data_matrixdef Kruskal(data_matrix):'''Kruskal 算法输入:图矩阵输出:加权最小生成树总权重'''vex_num=len(data_matrix)kruskal=[]weights=[]start_set=[]end_set=[]for i in range(vex_num):kruskal.append([i])for j in range(i+1,vex_num):if data_matrix[i][j]!='N':start_set.append(i)end_set.append(j)weights.append(data_matrix[i][j])distance=0for i in range(vex_num):tmp=numpy.argsort(weights)[0]for j in range(vex_num):if start_set[tmp] in kruskal[j]:m=jif end_set[tmp] in kruskal[j]:n=jif m!=n:kruskal[m]=kruskal[m]+kruskal[n]kruskal[n]=[]distance+=weights[tmp]weights.pop(tmp)start_set.pop(tmp)end_set.pop(tmp)print '加权最小生成树总权重为:', distancereturn distancedef main_test_func(vex_num=10):'''主测试函数'''start_time=time.time()data_matrix=random_matrix_genetor(vex_num)distance=Kruskal(data_matrix)end_time=time.time()return end_time-start_timeif __name__=='__main__':data_matrix=[[0,3,1,'N'],[3,0,2,4],[1,2,0,5],['N',4,5,0]]print data_matrixKruskal(data_matrix)   time_list=[]print '----------------------------10顶点测试-------------------------------------'time10=main_test_func(10)time_list.append(time10)print '----------------------------50顶点测试-------------------------------------'time50=main_test_func(50)time_list.append(time50)print '----------------------------100顶点测试-------------------------------------'time100=main_test_func(100)time_list.append(time100)print '----------------------------1000顶点测试-------------------------------------'time1000=main_test_func(1000)time_list.append(time1000)print '---------------------------------时间消耗对比--------------------------------'for one_time in time_list:print one_time

结果如下:

[[0, 3, 1, 'N'], [3, 0, 2, 4], [1, 2, 0, 5], ['N', 4, 5, 0]]
加权最小生成树总权重为: 7
----------------------------10顶点测试-------------------------------------
加权最小生成树总权重为: 111
----------------------------50顶点测试-------------------------------------
加权最小生成树总权重为: 103
----------------------------100顶点测试-------------------------------------
加权最小生成树总权重为: 116
----------------------------1000顶点测试-------------------------------------
加权最小生成树总权重为: 834
---------------------------------时间消耗对比--------------------------------
0.0
0.010999917984
0.0670001506805
57.513999939
[Finished in 58.1s]

时间上的话可以看出来的确是跟Prim算法相差了一大截,尤其是当数据规模增大的时候,这个变得极其明显,我个人只是在做习题相关的时候更偏重于使用Kruskal算法的思想来求解得到加权图中的最小生成树,Prim算法在应对大数据规模的图矩阵的时候有着无可比拟的优势,这一点自然就被用于大规模的数据中了,当然,二者都是很优秀的算法,各有千秋

好了,简单的学习了一下,学习中也查阅了相关的网上资料,关于Kruskal算法就到这里了,如有兴趣欢迎讨论!

python实现Kruskal算法求解加权图中最小生成树问题相关推荐

  1. em算法python代码_EM 算法求解高斯混合模型python实现

    注:本文是对<统计学习方法>EM算法的一个简单总结. 1. 什么是EM算法? 引用书上的话: 概率模型有时既含有观测变量,又含有隐变量或者潜在变量.如果概率模型的变量都是观测变量,可以直接 ...

  2. Python小白的数学建模课-18.最小生成树问题

    Python小白的数学建模课-18.最小生成树问题 最小生成树(MST)是图论中的基本问题,具有广泛的实际应用,在数学建模中也经常出现. 路线设计.道路规划.官网布局.公交路线.网络设计,都可以转化为 ...

  3. 证明kruskal算法求解图的最小生成树具有贪心选择性质_将并查集应用在图论中的最小生成树算法——Kruskal...

    点击上方蓝字,和我一起学技术. 今天是算法和数据结构专题的第19篇文章,我们一起来看看最小生成树. 我们先不讲算法的原理,也不讲一些七七八八的概念,因为对于初学者来说,看到这些术语和概念往往会很头疼. ...

  4. 最小生成树 kruskal_使用Kruskal算法求解Java最小生成树问题

    最小生成树 kruskal In Electronic Circuit we often required less wiring to connect pins together. We can m ...

  5. Dijkstra算法求解图中最短路径距离

    前言:这里是自学内容,讲解的是用python来实现Dijkstra算法,算是入门求解图中最短路径问题的典型案例. 算法简介: 迪杰斯特拉(Dijkstra)算法是一个按照路径长度递增的次序产生的最短路 ...

  6. Python使用秦九韶算法求解多项式的值

    ----------喜大普奔---------- 1.董付国老师Python系列教材,亚马逊.京东.当当.天猫均有销售: 1)<Python程序设计(第2版)>(2018年5月第6次印刷) ...

  7. Kruskal算法求解最小生成树

    最小生成树是一个连通图.什么是连通图,(强)连通图详解前面介绍了<图存储结构>,本节继续讲解什么是 连通图 . 前面讲过,图中从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是连 ...

  8. 分治算法求解列表中第k小的数

    分治算法地思想就是将复杂问题分解为简单的子问题,然后寻求子问题的地归结,并组合各个子问题的解一起得到最终复杂问题的解. 针对求解列表中第k小的数,暴力拆解法可以将列表排序然后根据索引求出列表中第k小的 ...

  9. python实现Kruskal算法

    一.kruskal算法的原理和证明: 基本思想:[比Prim更直接] 按权重升序对边排序: 按序逐条检查边 只要不会成环,就加入T. 伪代码如下: 按边权升序排序://重新编号 T=空集: FOR j ...

  10. 编程珠玑第八章——分治算法求解数组中的最大的连续和

    关键在于把数组分为两个部分a,b.最大的连续和要么在a要么在b,另外还有可能就是跨越a,b的边界,将跨越边界的最大向量称为mc. 一个注意的地方就是mc正在a中的部分包含右边边界的最大子向量,而mc在 ...

最新文章

  1. MVC模式下My97DatePicker日期控件引用注意事项
  2. 逆向知识十三讲,汇编中数组的表现形式,以及还原数组
  3. 写给初学前端工程师的一封信 (转于Kejun)
  4. EOF是什么?(转)
  5. .NET(C#)连接各类数据库
  6. COMBO--组合拳打穿回调地狱~
  7. Spring IOC(控制反转)思想笔记
  8. Python—json模块
  9. 思科即将支持32Gbit/s Fibre Channel及NVMe over FC
  10. OPPO R7C刷机包下载_OPPO r7c原厂固件包下载地址
  11. 金蝶EAS,序时簿界面去除数据隔离,根据枚举项实现背景色标记,数据排序
  12. 【化学信息学|机器学习】分子亲和力(Kd,Ki,IC50)
  13. 习题8-5 折纸痕(Paper Folding, UVa177)
  14. 关闭Win 11自动更新工具
  15. 秦殇千年轮回java游戏下载,智云稳定器如何拍旋转画面 使用稳定器拍摄画面方法...
  16. 在Linux中,如何找回root密码(So easy!!)
  17. javacore日志分析工具jca
  18. iOS UIActivityViewController 实现微信微博等等的分享功能
  19. ai怎么做波普风圆点_超实用AI描边小技巧:AI画一个圆点组成的圆
  20. pci-e服务器显卡性能,PCI-E延长线拖累显卡性能?实测大惊喜

热门文章

  1. 几种实用的pythonic语法
  2. 用Jersey构建RESTful服务简单示例
  3. java代码split分割数字类
  4. 显示隐藏dataGrid控件的标题栏,改变标题栏高度.
  5. CCF 201809-2 买菜
  6. Tomcat 加载外部dll时如何配置
  7. luogu题解 UVA11992 【Fast Matrix Operations】
  8. mysql5.7 主从复制的正常切换【转】
  9. 20170831_安装软件
  10. C++ 头文件系列(iostream)