最小生成树的3个算法

最小生成树常见算法(Prim、kruskal、染色法、匈牙利算法c++实现) 最小生成树问题 1.朴素版Prim(权重正负都实用) 举例模拟一遍: 4 5 1 2 1 1 3 2 1 4 3 2 3 2 3 4 4 注意:与Dijkstra算法不同的是Dijkstra算法更新的是每个点到第一个点的最短距离,而Prim算法更新的是到生成树的最短距离。 #include<iostream> #include<cstring> using namespace std; const int N = 510 , INF = 0x3f3f3f3f; int g[N] 阅读详情

最小生成树——Prim、Kruskal、Sollin(Boruvka)

 

本文内容框架:

1.Prim算法及其基于优先队列实现

      2.Kruskal算法

      3.Sollin算法

对于最小生成树,有两种算法可以解决。一种是Prim算法,该算法的时间复杂度为O(n²),与图中边数无关,该算法适合于稠密图,而另外一种是Kruskal,该算法的时间主要取决于边数,它较适合于稀疏图。

 

Prim算法

 

Prim算法描述

 

设图G =(V,E),其生成树的顶点集合为U。

①、把v0放入U。

②、在所有u∈U,v∈V-U的边(u,v)∈E中找一条最小权值的边,加入生成树。

③、把②找到的边的v加入U集合。如果U集合已有n个元素,则结束,否则继续执行②。

时间复杂度

 

最小边、权的数据结构 时间复杂度(总计)
邻接矩阵、搜索O(V2)
二叉堆(后文伪代码中使用的数据结构)、邻接表O((V + E) log(V)) = O(E log(V))
斐波那契堆、邻接表O(E + V log(V))

(该图转自wikipedia)

 

通过邻接矩阵图表示的简易实现中,找到所有最小权边共需O(V²)的运行时间。使用简单的二叉堆与邻接表来表示的话,普里姆算法的运行时间则可缩减为O(E *log V),其中E为连通图的边数,V为顶点数。如果使用较为复杂的斐波那契堆,则可将运行时间进一步缩短为O(E + V* log V),这在连通图足够密集时(当E满足Ω(V* log V)条件时),可较显著地提高运行速度。

 

Prim算法实现

用优先队列实现

 

Cpp代码   收藏代码
  1. #include <iostream>    
  2. #include <cstdio>    
  3. #include <cstdlib>    
  4. #include <cstring>    
  5. #include <cmath>    
  6. #include <algorithm>    
  7. #include <set>    
  8. #include <map>    
  9. #include <vector>    
  10. #include <queue>    
  11. #include <ctime>    
  12. using namespace std;    
  13. #define LL long long    
  14. const int N = 2000;    
  15. const int INF = 1 << 30;    
  16.     
  17. struct Node    
  18. {    
  19.     int v,next,w;    
  20.     bool operator < (const Node &a) const    
  21.     {    
  22.         return w > a.w;    
  23.     }    
  24. } p[N],t1,t2;    
  25.     
  26. int dis[N],vis[N],head[N],cnt;    
  27. int res;    
  28.     
  29. void addedge(int u,int v,int w)    
  30. {    
  31.     p[cnt].v = v;    
  32.     p[cnt].next = head[u];    
  33.     p[cnt].w = w;    
  34.     head[u] = cnt++;    
  35. }    
  36.     
  37. void prim()    
  38. {    
  39.     priority_queue<Node> q;    
  40.     for(int i = head[0] ; i != -1 ; i = p[i].next)    
  41.     {    
  42.         int v = p[i].v;    
  43.         if(p[i].w < dis[v])    
  44.         {    
  45.             dis[v] = p[i].w;    
  46.             t1.w = dis[v];    
  47.             t1.v =  v;    
  48.             q.push(t1);    
  49.         }    
  50.     }    
  51.     vis[0] = 1;    
  52.     while(!q.empty())    
  53.     {    
  54.         t1 = q.top();    
  55.         q.pop();    
  56.         int u = t1.v;    
  57.         if(vis[u]) continue;    
  58.         vis[u] = 1;    
  59.         res += dis[u];    
  60.         for(int i = head[u]; i != -1; i = p[i].next)    
  61.         {    
  62.             int v = p[i].v;    
  63.             if(!vis[v] && dis[v] > p[i].w)    
  64.             {    
  65.                 dis[v] = p[i].w;    
  66.                 t2.v = v;    
  67.                 t2.w = dis[v];    
  68.                 q.push(t2);    
  69.             }    
  70.         }    
  71.     }    
  72. }    
  73.     
  74. int main()    
  75. {    
  76.     int n,m,w;    
  77.     while(scanf("%d",&n),n)    
  78.     {    
  79.         memset(p,0,sizeof(p));    
  80.         memset(head,-1,sizeof(head));    
  81.         memset(vis,0,sizeof(vis));    
  82.         char u,v;    
  83.         for(int i=0; i<n-1; i++)    
  84.         {    
  85.             cin>>u>>m;    
  86.             for(int j=0; j<m; j++)    
  87.             {    
  88.                 cin>>v>>w;    
  89.                 addedge(u-'A',v-'A',w);    
  90.                 addedge(v-'A',u-'A',w);    
  91.             }    
  92.         }    
  93.         for(int i = 0 ; i < n ;  i ++) dis[i] = INF;    
  94.         res = 0;    
  95.         prim();    
  96.         printf("%d\n",res);    
  97.     }    
  98.     return 0;    
  99. }    

 

转自http://blog.youkuaiyun.com/acceptedxukai/article/details/6978868

 

Kruskal算法

  Kruskal算法与Prim算法的不同之处在于,Kruskal在找最小生成树结点之前,需要对所有权重边做从小到大排序。将排序好的权重边依次加入到最小生成树中,如果加入时产生回路就跳过这条边,加入下一条边。当所有结点都加入到最小生成树中之后,就找出了最小生成树。

Kruskal算法步骤

1.新建图G,G中拥有原图中相同的点,但没有边

2.将原图中所有的边按权值从小到大排序

3.从权值最小的边开始,如果这条边链接的两个点于图G中不在同一个连通分量中,则添加这条边到图G中

4.重复3,直至图G中所有的点都在同一个连通分量中

Kruskal算法实现

利用最小堆来存储边集E,利用并-查集来判断向T中添加边是否构成环路。

Cpp代码   收藏代码
  1. #include <iostream>  
  2. #include <vector>  
  3. #include <algorithm>  
  4. using namespace std;  
  5.    
  6. struct Edge   
  7. {  
  8.     int from, to, w; //~ 不要被假象迷惑,这里是无向图  
  9.     Edge(int f, int t, int _w): from(f), to(t), w(_w){}  
  10.     /* 
  11.     //~ bool operator <(const Edge& e){ return w < e.w; } 
  12.     bool operator >(const Edge& e){ return w > e.w; } 
  13.     */  
  14. };  
  15. //~ 为什么我把operator<重载为成员会出错?  
  16. //~ bool operator <(const Edge& e1, const Edge& e2){ return e1.w < e2.w; }  
  17. bool operator >(const Edge& e1, const Edge& e2){ return e1.w > e2.w; }   
  18. bool AddEdge(vector<int> & V, const Edge& e);  
  19. int main(int argc, char* argv[])  
  20. {  
  21.     vector<Edge> E;  
  22.     int from, to, w;  
  23.     int n; //~ 顶点数  
  24.     cin>>n;  
  25.     vector<int> V(n+1, -1); //~ 顶点并查集  
  26.     while (cin>>from>>to>>w) E.push_back(Edge(from, to, w));  
  27.    
  28.     make_heap(E.begin(), E.end(), greater<Edge>());  
  29.     int count = 0; //~ 已添加边数  
  30.     while (E.size())  
  31.     {  
  32.         Edge e = E[0];  
  33.         if(AddEdge(V, e)) //~ 将成功添加的边输出  
  34.         {  
  35.             count++;  
  36.             if(count == n - 1) break; //~ 树已生成完毕  
  37.             cout<<e.from<<"->"<<e.to<<": "<<e.w<<endl;  
  38.         }  
  39.         pop_heap(E.begin(), E.end(),greater<Edge>());  
  40.         E.pop_back();  
  41.     }  
  42.     if (count != n - 1) cout<<"I cannot do what you want."<<endl;  
  43.     return 0;  
  44. }  
  45.    
  46. bool AddEdge(vector<int> & V, const Edge& e)  
  47. {  
  48.     int i = e.from;  
  49.     for (; V[i] > 0;) i = V[i]; //~ 寻找根节点  
  50.     int j = e.to;  
  51.     for (; V[j] > 0;) j = V[j]; //~ 寻找根节点  
  52.     if (i == j)    return false; //~ i,j两节点已经联通  
  53.     if (V[i] > V[j]) //~ 将小集合合并至大集合上  
  54.         V[i] = j;  
  55.     else  
  56.         V[j] = i;  
  57.     return true; //~ ^_^  

 转自http://www.cppblog.com/superKiki/archive/2010/05/02/114180.aspx

 

Sollin(Boruvka)算法

Sollin(Brouvka)算法虽然是最小生成树最古老的一个算法之一,其实是前面介绍两种算法的综合,每次迭代同时扩展多课子树,直到得到最小生成树T。

Sollin(Boruvka)算法步骤

1.用定点数组记录每个子树(一开始是单个定点)的最近邻居。(类似Prim算法)

2.对于每一条边进行处理(类似Kruskal算法)

如果这条边连成的两个顶点同属于一个集合,则不处理,否则检测这条边连接的两个子树,如果是连接这两个子树的最小边,则更新(合并)

 

由于每次循环迭代时,每棵树都会合并成一棵较大的子树,因此每次循环迭代都会使子树的数量至少减少一半,或者说第i次迭代每个分量大小至少为。所以,循环迭代的总次数为O(logn)。每次循环迭代所需要的计算时间:对于第2步,每次检查所有边O(m),去更新每个连通分量的最小弧;对于第3步,合并个子树。所以总的复杂度为O(E*logV)。

Sollin(Boruvka)算法实现

 

C代码   收藏代码
  1. typedef struct{int v;int w;double wt;}Edge;  
  2. typeder struct{int V;int E;double **adj}Graph;  
  3. /*nn存储每个分量的最邻近,a存储尚未删除且还没在MST中的边 
  4. *h用于访问要检查的下一条边 
  5. *N用于存放下一步所保存的边 
  6. *每一步都对应着检查剩余的边,连接不同分量的顶点的边被保留在下一步中 
  7. *最后每一步将每个分量与它最邻近的分量合并,并将最近邻边添加到MST中 
  8. */  
  9. Edge nn[maxE],a[maxE];  
  10. void Boruvka(Graph g,Edge mst[])  
  11. {  
  12. int h,i,j,k,v,w,N;  
  13. Edge e;  
  14. int E=GRAPHedges(a,G);  
  15. for(UFinit(G->V);E!=0;E=N)  
  16. {  
  17.      for(k=0;k<G->V;k++)  
  18.            nn[k]=Edge(G->V,G->V,maxWT);  
  19.      for(h=0,N=0;h<E;h++)  
  20.      {  
  21.           i=find(a[h].v);j=find(a[h].w);  
  22.           if(i==h) continue;  
  23.           if(a[h].wt<nn[i].wt)nn[i]=a[h];  
  24.           if(a[h].wt<nn[j].wt)nn[j]=a[h];  
  25.           a[N++]=a[h];  
  26.       }  
  27.       for(k=0;k<G->V;k++)  
  28.       {  
  29.            e=nn[k];v=e.v;w=e.w;  
  30.            if(v!=G->V&&!UFfind(v,w))  
  31.            {  
  32.                 UFunion(v,w);mst[k]=e;  
  33.              }  
  34.         }  
  35.   
  36. }  


转自 http://dsqiu.iteye.com/blog/1689178


2022.3.29 图论——PRIM 最小生成树算法 最低成本联通所有城市 + 连接所有点的最小费用 阅读详情

相关推荐

最小生成树之Boruvka算法

Boruvka算法是求最小生成树的最古老的算法,于1926年由Boruvka提出,那时计算机还没出现呢。其时间复杂度和Prim、Kruskal算法一样,也是O(ELogV)。而且Boruvka算法也和Prim、Kruskal一样是贪心法。 它的基本思想是:生成树中所有顶点必然是连通的,所以两个不相交集必须连接起来才能构成生成树,而且所选择的连接边的权重必须最小,才能得到最小生成树。 算法描述如下 (1)输入一个连通的有向带权图; (2)把所有顶点都初始化成单独的一个子集; (3)初始化一个空的MS

愿君出走半生,归来时仍是少年 4733

最小生成树——Prim、Kruskal、Sollin(Boruvka)

最小生成树——Prim、Kruskal、Sollin(Boruvka)   本文内容框架: 1.Prim算法及其基于优先队列实现       2.Kruskal算法       3.Sollin算法 对于最小生成树,有两种算法可以解决。一种是Prim算法,该算法的时间复杂度为O(n²),与图中边数无关,该算法适合于稠密图,而另外一种是Kruskal,该算法的时间主要取决于边数,它较...

qiudesuo的专栏 1705

最小生成树(Prim、Kruskal)算法,秒懂!

前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法。但是可能很多人对概念不是很清楚,什么是最小生成树? 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。 通俗易懂的讲就是最小生成树包含原图的所有节点而只用最少的边和最小的权值距离。因为n个节点最少需要n-1个边联通,而距离就需要采取某种策略选择恰当的边。 学习最

bigsai 4万+

最小生成树的三种算法及图的相关知识

欢迎访问https://blog.youkuaiyun.com/lxt_Lucia~~ 宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~dalao们点个关注呗~~ 先介绍几个关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。 强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图...

lxt_Lucia的博客 2万+

Kruskal 的最小生成树 (MST) 算法3

详细介绍寻找最小成本生成树的 Kruskal 算法使用贪心的原理和C代码的实现

DT程序员的博客 629

XC7K325T FPGA硬件设计实战:从板级原理图到高速接口优化

本文以XC7K325T FPGA为核心,详细阐述了从板级原理图设计到高速接口优化的完整硬件实战流程。内容涵盖芯片管脚与电源规划、时钟复位配置电路设计,并重点解析了DDR3内存子系统以及PCIe与光纤接口等高速电路的原理图与PCB设计要点,旨在帮助工程师构建稳定可靠的高性能硬件平台。

python9snake的博客 513

实验3 图的最小生成树算法

(说明:第一对数据5 8表示共有5个顶点,共8条边,后面的AB 8表示AB边的权重为8,顶点个数不超过20,边的数目不超过50)求出该无向网络的最小生成树并输出该最小生成树的所有的边。熟悉求图的最小生成树的普里姆算法和克鲁斯卡尔算法。熟悉图的邻接矩阵、邻接表和边集数组表示。掌握建立图的邻接矩阵的算法。根据输入构造一个无向网络。输出该无向网络对应的矩阵。

凌咚的博客 396

【100%通过率】2023华为od机试C卷【螺旋数组矩阵】C++ 实现

给出数字个数n和行数m(1 < n,m < 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3...n,最终形成个一m行矩阵。疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。输入一行,两个整数,空格隔开,依次表示n、m。4.数字不够时,使用单个*号占位。3.填充数字时优先填充外部。1:模拟整个过程打印即可。1.每行数字的个数一样多。小明对这个矩阵有些要求。2.列的数量尽可能少。

MISAYAONE的博客 1248

9.3 最小生成树算法

接下来我们看最小生成树问题,和下一节的最短路径问题容易混淆。 最小生成树的概念 (1)一个带权值的图:网。并需要最小成本,就是用n-1条边把n个顶点连接起来,且连接起来的权值最小。 (2)我们把构造联通网的最小代价生成树称为最小生成树 产生最小生成树必须解决下边两个问题:(1) 尽可能选取权值小的边,但不能构成回路;(2) 选取n-1条恰当的边以连通n个顶点。 最小生成树的算法主要有Kruskal算法和Prim算法,他们都是贪心算法的应用。 最小生成树的应用 用带权值的图表示一群城市及城市间的

xutiantian1412的博客 687

基于 Langchain 开发一个完整的支持多轮数据分析(直连 mysql 数据,多表综合分析 SQL 取数,数据分析,报表生成)ChatBI 系统(前后端完整实现源代码)

ChatBI系统开发摘要 本文介绍了基于Langchain的多轮数据分析ChatBI系统开发方案。该系统支持MySQL数据库连接,提供多表分析、SQL查询、数据分析和报表生成功能。系统采用前后端分离架构:前端使用React+Ant Design+ECharts实现交互界面;后端基于FastAPI搭建服务,集成Langchain处理自然语言到SQL的转换;核心技术栈还包括SQLAlchemy、Pandas和Matplotlib。 系统核心模块包括: 数据库连接层:使用SQLAlchemy管理MySQL连接 L

AI天才研究院 814

30天入门 SAP BTP 开发系列之一:SAP 开发顾问为什么要学习 SAP BTP 开发?能带来哪些收获?

国内 SAP 开发顾问们的微信朋友圈,最近可能都被 SAP 和阿里这两家巨头宣布合作的重磅消息刷屏了吧。近日,德国软件巨头SAP SE与中国电商巨头阿里巴巴集团宣布建立战略合作伙伴关系。根据协议,阿里巴巴集团将利用 SAP Cloud ERP Private 强化企业基础设施,并采用联合上市策略为全球客户创造卓越价值。阿里巴巴将集成 SAP Business Suite,以简化系统维护与升级流程,并实现 AI 功能与核心业务流程的无缝整合。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2381

图(3)最小生成树、Prim算法和Kruskal算法

最小生成树的概念,构建最小生成树的Prim算法和Kruskal算法

我只钓小鱼的博客 462

YOLOv11-Pose部署RK3588实战:人体姿态识别精度翻倍,边缘推理速度突破瓶颈

本教程从YOLOv11-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

m0_64661770的博客 138

3.29 最小生成树算法

接上图,如果我们需要在某城市之间修建道路,点与点之间的加权边就是两城市道路的维修费,如果我们想找到一种将所有城市都连通起来并且使得道路修建费用最小的一种方案,那么就要选择使用最小生成树。用点t更新集合外点到集合的距离,就是找集合外和t有连接的点,如果更小就更新,最后将点t放入集合中。生成树是指一个联通图的极小的连通子图,它包含了图中的所有n个顶点,并只有n-1条边(构成一棵树)最小生成树是针对一个带权图来说的,就是指原图中能构成的所有生成树中,边权和最小的一颗生成树。(该集合是一个已经确定了的连通块)

m0_52860713的博客 492

Open3d (C++) RANSAC拟合圆柱(详细过程版)

实现了一种基于RANSAC算法的圆柱拟合方法。

点云侠的博客 238

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

算法exp3_Prim&&Kruskal最小生成树

算法实验3 代码链接

Xixoqw的博客 539

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

算法4.3 最小生成树

最小生成树4.3.1 定义

LYZ 685

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Kruskal算法求最小生成树-算法设计与分析实验3

题目: 求如图所示,用kruskal算法求下面图的最小生成树: 话不多说,程序如下: #include #include #define N 7 using namespace std; typedef struct _node{ int val; int start; int end; }Node; Node V[N]; int cmp(const

Chen_dSir的博客 2839

数据结构与算法之ACM Fellow-算法4.3 最小生成树

图的。

2301_79479951的博客 1085

2022.3.28 图论——KRUSKAL 最小生成树算法

数组完整输出 + Arrays.sort用法

LGoGoGo的博客 1018

算法培训 Day4-3 最小生成树

算法培训 Day4-3 最小生成树 两种做法 Kruscal 和 Prim 1.Kruscal 虽然这个适合稀疏图,但好像没怎么遇到边很多的图,就算边很多,因为是遍历一遍边 即O(n) 复杂度,也是很快速算完的,且经过对比 比Prim 耗时还要短 需要用sort对边的结构体进行排序 struct edge{ int u,v; long long len; }e[maxm]; b...

Northern_Light_Y的博客 268

PTA 图的算法设计 3 图的最小生成树算法——Prim算法

PTA 图的算法设计 3 图的最小生成树算法——Prim算法

C19334的博客 169

2021年SWPUACM暑假集训day3最小生成树算法

什么是最小生成树 在讲最小生成树之前,我们先回顾一下什么是生成树:对于无向图G和一棵树T来说,如果T是G的子图,则称T为G的树,如果T是G的生成子图,则称T是G的生成树。而最小生成树就是对于一个有权值的图来说最小权值和的图就是最小生成树(也就是边权和最小的连通图,且只有n-1条边,其实也就是一颗树) Kruskal算法 该算法的基本思想是从小到大加入边,是个贪心算法。Kruskal 算法是一种常见并且好写的最小生成树算法,由 Kruskal 发明。 原理虽然简单,但是需要一种数据结构维护一个森林,不能使其成

小谢的博客 935

10.5.3 最小生成树——kruskal算法

#include <cstdio> #include <algorithm> using namespace std; //最小生成树——kruskal算法 struct edge{ //边的定义 int u,v;//边的两个端点编号 int w; //边的边权 }E[maxe];//最多有maxe条边 bool cmp(edge a,edge b)//排序函数...

小魚兒 215
上一篇: 简单的表达式求值
下一篇: 组合数学中的项链计数
DJS_K_D
博客等级 码龄12年 2粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值