Dijkstra最短路算法和Floyd最短路算法

图论之邻接表 本文介绍了图的邻接表存储方法,使用邻接表存储图要稍微复杂一些,但能够提高空间利用率。本文给出了两种实现方法,一种是链式前向星,另一种是链表实现,链式前向星是利用数组来模拟链表,并且在最后给出了邻接表的一种打印方法。 阅读详情

Dijkstra最短路算法

转自:http://blog.51cto.com/ahalei/1387799

时间复杂度O(n^2)    空间复杂度O(n^2)

邻接矩阵存储

#include <stdio.h>
int main()
{
    int e[10][10],dis[10],book[10],n,m,t1,t2,t3,minn;
    int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值
    //读入n和m,n表示顶点个数,m表示边的条数
    scanf("%d %d",&n,&m);

    //初始化
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            if(i==j) e[i][j]=0;
            else e[i][j]=inf;

    //读入边
    for(int i=1; i<=m; i++)
    {
        scanf("%d %d %d",&t1,&t2,&t3);
        if(t3<e[t1][t2])//当有多组边时,应该比较一下。
        {
            e[t1][t2]=t3;
            e[t2][t1]=t3;//对于无向图,两边都要更新。
        }
    }
    //初始化dis数组,这里是1号顶点到其余各个顶点的初始路程
    for(int i=1; i<=n; i++)
        dis[i]=e[1][i];
    //book数组初始化
    for(int i=1; i<=n; i++)
        book[i]=0;
    book[1]=1;

    //Dijkstra算法核心语句
    int u;
    for(int i=1; i<=n-1; i++)
    {
        //找到离1号顶点最近的顶点
        minn=inf;
        for(int j=1; j<=n; j++)
        {
            if(book[j]==0 && dis[j]<minn)
            {
                minn=dis[j];
                u=j;
            }
        }
        book[u]=1;
        for(int v=1; v<=n; v++)
        {
            if(e[u][v]<inf)//可以不要
            {
                if(dis[v]>dis[u]+e[u][v])
                    dis[v]=dis[u]+e[u][v];
            }
        }
    }

    //输出最终的结果
    for(int i=1; i<=n; i++)
        printf("%d ",dis[i]);

    return 0;
}

input:

6 9

1 2 1

1 3 12

2 3 9

2 4 3

3 5 5

4 3 4

4 5 13

4 6 15

5 6 4

output:

0 1 8 4 13 17

 

Dijkstra巧妙的邻接表(数组实现)

转自:http://blog.51cto.com/ahalei/1391988

时间和空间复杂度都是0(m),如果一个图是稀疏图的话,m要远小于n*n,因此稀疏图选用邻接表来存储要比邻接矩阵来存储要好很多。

之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M。对于稀疏图来说,M要远远小于N2。先上数据,如下。

1

2

3

4

5

6

4 5

1 4 9

4 3 8

1 2 5

2 4 6

1 3 7

091650e0f00oqrcjcfnq93.png
 

第一行两个整数n m。n表示顶点个数(顶点编号为1~n),m表示边的条数。接下来m行表示,每行有3个数x y z,表示顶点x到顶点y的边的权值为z。下图就是一种使用链表来实现邻接表的方法。

091650gyll6hbqbjyxls8s.png

 

上面这种实现方法为图中的每一个顶点(左边部分)都建立了一个单链表(右边部分)。这样我们就可以通过遍历每个顶点的链表,从而得到该顶点所有的边了。使用链表来实现邻接表对于痛恨指针的的朋友来说,这简直就是噩梦。这里我将为大家介绍另一种使用数组来实现的邻接表,这是一种在实际应用中非常容易实现的方法。这种方法为每个顶点i(i从1~n)也都保存了一个类似“链表”的东西,里面保存的是从顶点i出发的所有的边,具体如下。

 

 

首先我们按照读入的顺序为每一条边进行编号(1~m)。比如第一条边“1 4 9”的编号就是1,“1 3 7”这条边的编号是5。

 

这里用u、v和w三个数组用来记录每条边的具体信息,即u[i]、v[i]和w[i]表示第i条边是从第u[i]号顶点到v[i]号顶点(u[i]àv[i]),且权值为w[i]。

 

091650h35zq3wgx30x3oe3.png

再用一个first数组来存储每个顶点其中一条边的编号。以便待会我们来枚举每个顶点所有的边(你可能会问:存储其中一条边的编号就可以了?不可能吧,每个顶点都需要存储其所有边的编号才行吧!甭着急,继续往下看)。比如1号顶点有一条边是 “1 4 9”(该条边的编号是1),那么就将first[1]的值设为1。如果某个顶点i没有以该顶点为起始点的边,则将first[i]的值设为-1。现在我们来看看具体如何操作,初始状态如下。

 

091650zw3988qpj5iljj8g.png

 

咦?上图中怎么多了一个next数组,有什么作用呢?不着急,待会再解释,现在先读入第一条边“1 4 9”。

 

 

读入第1条边(1 4 9),将这条边的信息存储到u[1]、v[1]和w[1]中。同时为这条边赋予一个编号,因为这条边是最先读入的,存储在u、v和w数组下标为1的单元格中,因此编号就是1。这条边的起始点是1号顶点,因此将first[1]的值设为1。

 

另外这条“编号为1的边”是以1号顶点(即u[1])为起始点的第一条边,所以要将next[1]的值设为-1。也就是说,如果当前这条“编号为i的边”,是我们发现的以u[i]为起始点的第一条边,就将next[i]的值设为-1(貌似的这个next数组很神秘啊⊙_⊙)。

091651kwo5g0aycy07wfwd.png

 

 

读入第2条边(4 3 8),将这条边的信息存储到u[2]、v[2]和w[2]中,这条边的编号为2。这条边的起始顶点是4号顶点,因此将first[4]的值设为2。另外这条“编号为2的边”是我们发现以4号顶点为起始点的第一条边,所以将next[2]的值设为-1。

091651fkswcj34c05k8w4k.png

 

 

读入第3条边(1 2 5),将这条边的信息存储到u[3]、v[3]和w[3]中,这条边的编号为3,起始顶点是1号顶点。我们发现1号顶点已经有一条“编号为1 的边”了,如果此时将first[1]的值设为3,那“编号为1的边”岂不是就丢失了?我有办法,此时只需将next[3]的值设为1即可。现在你知道next数组是用来做什么的吧。next[i]存储的是“编号为i的边”的“前一条边”的编号。

091651df28foy9ct7fl7qf.png

 

 

 

读入第4条边(2 4 6),将这条边的信息存储到u[4]、v[4]和w[4]中,这条边的编号为4,起始顶点是2号顶点,因此将first[2]的值设为4。另外这条“编号为4的边”是我们发现以2号顶点为起始点的第一条边,所以将next[4]的值设为-1。

091652vf4eg69f5zfsese9.png

 

读入第5条边(1 3 7),将这条边的信息存储到u[5]、v[5]和w[5]中,这条边的编号为5,起始顶点又是1号顶点。此时需要将first[1]的值设为5,并将next[5]的值改为3。

091652li6mzammza242tmp.png

 

此时,如果我们想遍历1号顶点的每一条边就很简单了。1号顶点的其中一条边的编号存储在first[1]中。其余的边则可以通过next数组寻找到。请看下图。

091652rtjh5qe2211eee58.png

细心的同学会发现,此时遍历边某个顶点边的时候的遍历顺序正好与读入时候的顺序相反。因为在为每个顶点插入边的时候都直接插入“链表”的首部而不是尾部。不过这并不会产生任何问题,这正是这种方法的其妙之处。

 

 

创建邻接表的代码如下。

int n,m,i;
//u、v和w的数组大小要根据实际情况来设置,要比m的最大值要大1
int u[6],v[6],w[6];
//first和next的数组大小要根据实际情况来设置,要比n的最大值要大1
int first[5],next[5];
scanf("%d %d",&n,&m);
//初始化first数组下标1~n的值为-1,表示1~n顶点暂时都没有边
for(i=1;i<=n;i++)
    first[i]=-1;
for(i=1;i<=m;i++)
{
    scanf("%d %d %d",&u[i],&v[i],&w[i]);//读入每一条边
    //下面两句是关键啦
    next[i]=first[u[i]];
    first[u[i]]=i;
}

接下来如何遍历每一条边呢?我们之前说过其实first数组存储的就是每个顶点i(i从1~n)的第一条边。比如1号顶点的第一条边是编号为5的边(1 3 7),2号顶点的第一条边是编号为4的边(2 4 6),3号顶点没有出向边,4号顶点的第一条边是编号为2的边(2 4 6)。那么如何遍历1号顶点的每一条边呢?也很简单。请看下图:

遍历1号顶点所有边的代码如下。

k=first[1];// 1号顶点其中的一条边的编号(其实也是最后读入的边)
while(k!=-1) //其余的边都可以在next数组中依次找到
{
    printf("%d %d %d\n",u[k],v[k],w[k]);
    k=next[k];
}

遍历每个顶点的所有边的代码如下。

for(i=1;i<=n;i++)
{
    k=first[i];
    while(k!=-1)
    {
        printf("%d %d %d\n",u[k],v[k],w[k]);
        k=next[k];
    }
}

 

      可以发现使用邻接表来存储图的时间空间复杂度是O(M),遍历每一条边的时间复杂度是也是O(M)。如果一个图是稀疏图的话,M要远小于N2。因此稀疏图选用邻接表来存储要比邻接矩阵来存储要好很多。

 

只有五行的Floyd最短路算法 

转自:http://blog.51cto.com/ahalei/1383613

   如现在只允许经过1号顶点,求任意两点之间的最短路程,应该如何求呢?只需判断e[i][1]+e[1][j]是否比e[i][j]要小即可。e[i][j]表示的是从i号顶点到j号顶点之间的路程。e[i][1]+e[1][j]表示的是从i号顶点先到1号顶点,再从1号顶点到j号顶点的路程之和。其中i是1~n循环,j也是1~n循环,代码实现如下。

for(i=1;i<=n;i++)
{
    for(j=1;j<=n;j++)
    {
        if ( e[i][j] > e[i][1]+e[1][j] )
              e[i][j] = e[i][1]+e[1][j];
    }
}

整个算法过程虽然说起来很麻烦,但是代码实现却非常简单,核心代码只有五行:

for(k=1;k<=n;k++)
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(e[i][j]>e[i][k]+e[k][j])
                 e[i][j]=e[i][k]+e[k][j];

 

#include <stdio.h>
int main()
{
    int e[10][10],n,m,t1,t2,t3;
    //e[i][j]表示点i到点j的距离
    int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值
    //读入n和m,n表示顶点个数,m表示边的条数
    scanf("%d %d",&n,&m);

    //初始化
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            if(i==j) e[i][j]=0;
            else e[i][j]=inf;
    //读入边
    for(int i=1; i<=m; i++)
    {
        scanf("%d %d %d",&t1,&t2,&t3);
        e[t1][t2]=t3;
    }

    //Floyd-Warshall算法核心语句
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                if(e[i][j]>e[i][k]+e[k][j] )
                    e[i][j]=e[i][k]+e[k][j];

    //输出最终的结果
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            printf("%10d",e[i][j]);
        }
        printf("\n");
    }

    return 0;
}

 

 

 

数组模拟邻接表(超详细!!!) 这两天做到了很多这样的问题,所以我就想写一下关于这个问题的一些总结。 首先我们先看一下常见的代码模板 struct Edge { int to; //子节点 int w; //权重 int next; //每个head链表的下一个节点 } edge[N * 2]; int head[N], idx = 0; void add_edge(int from, int... 阅读详情

相关推荐

最短路Floyd算法和Dijkstra算法

最短路Floyd算法和Dijkstra算法实验报告1.问题问题实例问题实例2.解析Floyd算法具体步骤Dijkstra算法具体步骤3.设计Floyd算法Dijkstra算法:4.分析Floyd算法Dijkstra算法5.源码 实验报告 课程名称 《算法分析与设计》 实验日期 2021年 3月15日 实验名称 最短路Floyd算法和Dijkstra算法 实验地点 勤园13-208 1.问题 [描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)] 用F

zkpj12的博客 604

图还可以这样存——邻接表的数组实现

之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M。对于稀疏图来说,M要远远小于N2。先上数据,如下。 4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 复制代码         第一行两个整数n m。n表示顶

不可数的爱 ! 5906

蓝桥杯备赛别慌!Floyd、Bellman-Ford、Dijkstra三大最短路算法,我用‘问路’和‘多米诺骨牌’给你讲明白

本文通过生动的‘问路警察’和‘多米诺骨牌’比喻,详细解析了Floyd、Bellman-Ford、Dijkstra三大最短路算法的核心原理与应用场景,帮助蓝桥杯备赛者高效掌握算法选择技巧。特别适合软件赛参赛者快速理解多源最短路径、负权边处理等关键概念,提升竞赛解题效率。

weixin_30772105的博客 461

图的存储结构——邻接表

图的存储结构之邻接表一、邻接表表示法无向图的邻接表有向图的邻接表有向图的逆邻接表二、图的邻接表存储表示 一、邻接表表示法 回忆在线性表时,顺序存储结构就存在预先分配内存可能造成存储空间浪费的问题,于是引出了链式存储结构,同样的,我们可以考虑对边或弧使用链式存储方式来避免空间浪费问题 邻接表是图的一种链式存储结构。 由两部分组成:表头结点表和边表。 邻接表中每个单链表的第一个结点存放有关顶点的信...

ker的博客 5万+

【数据结构】图的存储结构—邻接表

在图论和计算机科学中,邻接表【Adjacency List】是用来表示有限图的无序表的集合。每个列表描述图中一个顶点的邻域集。今天来和叶子一起学习邻接表吧!

四季轮换叶,一路招摇胜 1万+

STM32F407ZGT6开发板跑马灯实战:从原理图到烧录全流程(附FlyMcu配置)

本文以正点原子F4探索者开发板(STM32F407ZGT6)为例,手把手指导完成跑马灯实验。内容涵盖从原理图解读、GPIO驱动逻辑分析、HAL库工程搭建,到代码编写与FlyMcu串口烧录配置的全流程,帮助嵌入式开发新手快速实现第一个LED控制程序,打通软硬件开发链路。

weixin_29183637的博客 223

关于Floyd和Dijkstra最短路算法

Floyd最短路: /* 16 14 79 11 5 63 3 19 26 13 12 41 14 7 28 15 3 7 4 5 18 20 7 43 10 16 38 8 4 55 1 12 100 6 5 10 7 6 78 18 7 77 19 16 6 12 18 47 2 3 63 9 19 17 17 2 100 */ #include&lt;bits/stdc++.h&gt; u...

qq_52051345的博客 333

别再手动算了!用Excel函数一键搞定AQI和首要污染物分析(附完整公式模板)

本文介绍如何利用Excel函数自动化计算AQI和首要污染物分析,大幅提升数据处理效率。通过构建标准化输入模板、智能计算IAQI、自动判定AQI与首要污染物,并生成可视化仪表盘,帮助环保工作者快速完成每日监测报告。

weixin_30443075的博客 345

最短路算法(Dijkstra算法和Floyd算法)

迪杰斯特拉算法是一种高效的单源最短路径算法,广泛应用于网络路由、地理信息系统等领域。通过结合最小堆可以有效优化其性能,但仅适用于非负权重图。弗洛伊德算法在处理任意两点间最短路径问题中具有较高的效率,尤其适合处理小规模的稠密图。在包含负权边的情况下也可以正确执行,广泛应用于路径优化、交通网络等领域。

2303_80261633的博客 2195

LabVIEW工程密码保护机制与移除技术详解

LabVIEW作为工业自动化领域广泛使用的图形化编程工具,其密码保护机制涉及文件加密与权限控制等核心技术。从技术实现来看,现代版本采用AES-128加密结合SHA-256哈希校验,而经典版本使用XOR加密配合Base64编码。理解这些加密原理对于工程维护、灾难恢复等合法场景至关重要。在实际应用中,密码移除工具需要处理不同版本的文件结构差异,包括解析XML描述区的Protection标签、动态识别版本并应用对应解密策略。这类技术在工业设备维护、教学研究等场景具有重要价值,但必须注意遵守法律边界,确保拥有合法的

weixin_34161083的博客 390

手把手教你理解MIS结构C-V特性曲线:从理论到测试实操

本文深入解析了金属-绝缘体-半导体(MIS)结构的电容-电压(C-V)特性曲线,从积累、耗尽到反型等物理状态出发,详细阐述了其测试原理与实操要点。文章重点介绍了如何通过C-V曲线提取氧化层厚度、掺杂浓度、界面态密度等关键参数,并探讨了偏压-温度(B-T)应力实验在揪出可动离子电荷等可靠性问题中的应用,为半导体器件物理研究与工艺评估提供了实用指南。

weixin_29304021的博客 442

用Dijkstra算法和Floyd算法求解最短路问题

数学建模最短路问题两个小作业,涉及Dijkstra算法和Floyd算法,用Matlab实现。

只想躺平不想动 835

MNI152 坐标空间和 fsaverage 坐标空间相互转换, 如已知fsaverage空间的坐标如何求MNI152 坐标?aparc.a2009s.annot转化到MNI152空间?

大多数神经影像学研究的结果是在体积(例如,MNI152)或表面(例如,fsaverage)坐标系中报告的。体积坐标系和表面坐标系之间的准确映射可以促进许多应用,例如将 fMRI 组分析从 MNI152 投影到 fsaverage 以进行可视化或从 fsaverage 投影静息状态 fMRI 分区对 MNI152进行新数据的体积分析。Wu et al., 2018 评估了三种在 MNI152通过模拟上述应用的 Colin27 和 fsaverage 坐标系:将组平均数据从 MNI152/Colin27 投影到

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 2966

最短路 Dijkstra 和 Floyd 算法

图论中一个经典问题就是求最短路,最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划,这也是算法中的两大经典代表。用一个简单图在纸上一步一步演算,也是很好理解的,理解透自己多默写几次即可记住,机试时主要的工作往往就是快速构造邻接矩阵了。 对于平时的练习,一个很厉害的 ACMer  @BenLin_BLY 说:“刷水题可以加快我

duxingxia356的专栏 689

MATLAB船舶开尔文尾迹三维仿真建模

开尔文尾迹介绍 Kelvin最早研究舰船在水面运动在水面上形成波纹的原理,主要针对静水中点源运动的尾迹问题,并给出尾迹的张角和波高分布情况。由 Kelvin 的理论,一般情况下假设由一个理想点源来代替舰船,开尔文尾迹由分歧波和横断波组成,分歧波向船的两侧扩散,而横断波主要向船的后方传播,在相遇的地方两波相干形成尖头波,且尖头波位于尾迹角16°到19.5°之间,又因为尖头波波长过短,以至于无法单独的区分出每个尖头波的波前,所有的波前在视觉效果上就连成一条直线表现为亮线,称为开尔文臂,开尔文臂以船身对称,且角度

qq_19512613的博客 3844

Oracle EBS Interface/API(42) -AP发票客制化付款申请

背景 在OA系统上,选择Oracle EBS的某张AP发票做付款申请,需要类似于锁定该发票以便付款,其他用户或者下次用户不能再次选择该发票做付款申请。 快速参考 参考点 内容 功能导航 N: AP->Invoices->Entry>Invoices 并发请求 None 基表 AP.AP_INV_SELECTION_CRITERIA_ALLAP.AP_SELECTED_INVOICES_ALL API 参考下面介绍 错误信息表 None 接口Form

陈显平的专栏-Oracle EBS 1200

最短路 dijkstra , floyd 和spfa算法 模板

最短路算法还有spfa算法,但是对于比赛的一些数据来说,单纯的求最短路还是用D算法更快更稳定,但是对于有负权值的边来说,就必须用到spfa算法了,所以放在下次说。 floyd 5 行算法,求各个点之间的最短路,相当于遍历每个边,做传递,a-c,c-b,那么a就可以通过c到b。时间复杂度O(n^3) ps:一般就这种用邻接矩阵存好点 模板代码: void read(){ memset(g...

A_Pathfinder的博客 466

UE5实现建筑剖切效果

UE5实现建筑剖切效果

专注GIS开发 8463

简单复习最短路算法-Floyd和Dijkstra

Floyd算法是求每一个顶点到每一个顶点间的最短距离,Dijkstra是求指定顶点到其余所有顶点间的最短距离。 **Floyd思想:**不断加入新的中间结点,来判断加入新节点会否使得某点到其余点距离更近。 for i in range(len(V)): # 中间结点 for j in range(len(V)): # 起始顶点 for k in range(len(V)): # 结束顶点 if dist[j][k] > dist[j][i] + dist

吟游诗人——吟唱生命的不朽 961

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

代码随想录第59 60 61天 | 最短路算法:dijkstra和Bellman_ford 以及 Floyd算法和A*算法 汇总

本文摘要:本文系统介绍了图论中最短路径算法,包括Dijkstra算法(朴素版和堆优化版)、Bellman-Ford算法(含SPFA优化)、Floyd算法和A算法。Dijkstra适用于正权图,Bellman-Ford可处理负权边并检测负环,Floyd解决多源最短路问题,A算法通过启发函数提高搜索效率。文章详细分析了各算法的核心思想、时间复杂度和适用场景,并提供了选择指南:正权图优先选择Dijkstra堆优化版,负权图使用Bellman-Ford,多源小图选择Floyd,棋盘寻路适用A*算法。每种算法均附有代

2301_79328557的博客 1005

深度学习工具包 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'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('DeepLearnToolbox'));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('state',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'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',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 = 'sigm';%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, 'Too big error');```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('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';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)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';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, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% 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'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 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, 'Too big error');```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('state',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, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',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, 'Too big error');%% ex3 neural net with dropoutrand('state',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, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % 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, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % 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, 'Too big error');%% 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('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % 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, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

最短路算法:Dijkstra算法、Bellman-Ford算法、spfa算法和Floyd算法

最短路算法的分类: 单源最短路 所有边权都是正数 朴素的Dijkstra算法 O(n^2) 适合稠密图(n为节点个数) 堆优化版的Dijkstra算法 O((m+n)log n)(m是图中边的个数)适合稀疏图 存在负权边 Bellman-Ford O(nm) spfa 一般O(m),最坏O(nm) 多源汇最短路 Floyd算法 O(n^3) 【例题】 【方法一】朴素Dijkstra class Solution { publ

qq_40586164的博客 1774

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

图的最短路算法(Dijkstra和Floyd-Warshall)

一、单源最短路(Dijkstra算法) 基本思想 选定一个源点,按路径长度递增次序,逐步产生最短路径(贪心),直到此源点到其他各顶点的最短路径全部求出为止。 数据结构 带权有向图G=(V,E),V = 1,2,…,n,顶点1为源点。图的存储结构为带权矩阵C。 一维数组D[n]:D[i]表示从源点1到顶点i的当前最短路径长度,初始时,D[i] = C[1][i]; 一维数组P[n]:P[i]表示源点...

yqy2001的博客 629

最短路:Dijkstra算法和Floyd算法

算法:最短路径

小逗子的脑黄金 504

最短路-Floyd算法和Dijkstra算法

两者在负权问题上不是很好,最好只处理正值,Dijkstra算法对负权毫无办法,但是Floyd算法不能处理出现负环的东西。。。 Dijkstra算法的话,为了方便,我认为从i到i点不可达;百部百科解释挺好,那个堆优化挺好的 Floyd算法百部百科也不错,都是老算法了,哪都有资料 博客园这位筒子的写得很好 http://www.cnblogs.com/biyeymyhjob/archive/20...

weixin_34055910的博客 122

【图论】最短路算法:Dijkstra、bellman-ford、spfa、Floyd 和拓扑排序

是AcWing算法基础课关于基本图论算法的笔记。 AcWing YYDS! 朴素版Dijkstra-849. Dijkstra求最短路 I(稠密图) 参考 步骤: 初始化,dis[1]=0,dis[n]=0x3f3f3f3f.——起点到起点的距离为0,到其他点的距离为正无穷(这里1是起点) 迭代:n次迭代确定每个点到起点的最小值 输出答案 其中: dist[n]表示起点到点n的距离 st[n]表示点n到起点的最短距离是否已经确定 每次找还没有确定最短距离的点中的最短的那个进行更新: 可以看这里的演示

karshey的博客 1178

算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法

图论中一个经典问题就是求最短路。最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划。这也是算法中的两大经典代表。用一个简单图在纸上一步一步演算,也是非常好理解的。理解透自己多默写几次就可以记住,机试时基本的工作往往就是高速构造邻接矩阵了。 对于平时的练习,一个非常厉害的 ACMer @BenLin_BLY说:“刷水题能够...

weixin_30478757的博客 153
上一篇: AC自动机
下一篇: 最小生成树Kruskal算法
flyzer
博客等级 码龄9年 27粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值