数据结构与算法基础十:图的遍历与最小生成树算法

树可以根据其父子关系构建前中后三种遍历方式,而图就要复杂的多,为了保证能够到达每一个顶点,并且每个顶点都只被访问一次,就需要在访问之后进行记录,类似走迷宫.

一:深度优先遍历DFS

首先思考一个例子,想要在下面这个图中,走完所有的顶点,该如何进行.
在MC的矿洞中,经常有很多的连通路径,为了防止迷路,一般会使用这样的方案,叫做右侧火把,就是靠右边走并且在墙壁插火把,在遇到之前插过的火把之前,一直靠右前进,当遇到火把的时候,表示这个地方已经走过,就退回到前一个没有走过的洞口(分支),以此类推.
把下面这张图看成是立体的,我们从A进入,右手边是B,一路靠右走经过BCDEF,再回到A,发现A走过了,进行标记,于是回到F,这时F有一个没走的分支,是G,此时路径是ABCDEFG,G再靠右走,到B,B已经走过了,标记并回到G,然后再选D,D也走过了,最后再选H,H没有走过,此时路径是ABCDEFGH,H的两条分支D和E都走过了;这时候关键来了,H已经没有路了,但是前面ABCDE等等可能还要分支,因此需要退回去,首先退到G,发现G的分支都走完了,然后退到F,E都没了,再到D,D有一个I没有走,此时路径是ABCDEFGHI,再退到C,B,A就可以确认已经完成遍历.


矿洞

走进去再退回来,显然这是一个递归过程,如果把过程画出来,会发现是一个树的前序遍历.因此树的前序遍历其实也可以叫深度优先遍历,这种算法并不是图的专属.


前序遍历

二:广度优先遍历BFS

广度优先遍历与树的层序遍历相同,就是把图的顶点分层,然后一层一层的遍历.
如果说深度优先遍历是递归或者栈操作,那么广度就是队列操作.


广度优先遍历

遍历的一个要素就是访问元素的顺序,主要是服务于查找,顺序不一样那么在不同的场景下两种遍历方式效率就不同,对于一个简单的无向图来说,邻接矩阵,邻接表都是把顶点放在数组或者链表中,仅仅只是考虑顶点的话,根本用不上这两种算法,主要还是在网的场景中使用;而对于树来说,这两种算法的应用就很广了.

三:最小生成树

假设在几个村庄之间修路,经过考察,排除了一些难以修路的地质,生成了这样一张网图:


这个图中的边是可以修路的路径,并且权值代表的是路径长度,那么如何修路可以获得最短的总路径.
这种构造连通网的最小代价生成树叫做最小生成树
几种方案的总路径

1.普利姆算法
首先画出上面例子中网结构的邻接矩阵

邻接矩阵

具体算法如下:
普利姆算法

解析:
首先创建两个数组lowcost和adjvex长度是顶点个数9;
把v0放进lowcost和adjvex,表示从v0开始,并且把v0先放进最小生成树中;
8~12行把矩阵的第一行放进lowcost数组,adjvex全部初始为0,这里∞使用65535表示,lowcost是[0,10,∞,∞,∞,11,∞,∞,∞];
15~17行,min用作存储权值,j用作循环,k存储目标最小值的j,这样while循环就可以找到最小的权值以及其下标;
第一次运行到第26行,找到了v0到下一个顶点的最小权值,是v0-v1,是10,打印出来;
第27行很重要,这里把lowcost的k,k是1,也就是v1,的权值设置为0,表示v1已经确定加入最小生成树,后面的循环不在比较,现在lowcost是[0,0,∞,∞,∞,11,∞,∞,∞];
第28~35行,是寻找与v1相连的其他顶点,找到比65536小路径是18,16和12,现在lowcost是[0,0,18,∞,∞,11,16,∞,12];dajvex是[0,0,1,0,0,1,0,1];
再次循环到26行,找到v5是最小路径,现在lowcost是[0,0,18,∞,∞,0,16,∞,12];
再次到36行,lowcost是[0,0,18,∞,26,0,16,∞,12];adjvex是[0,0,1,0,5,0,0,1];
过程

从过程来分析,当v0找到v1时,接下来要比较的是剩下7的顶点,到v0或者v1最短的距离,这里有18,12,16,11,那自然最短的是11,也就是v5;在接下来是剩下6个顶点到v0,v1,或者v5的距离,是18,16,12,17,26,得到12最小,这个算法就是这个过程
从代码可以看出来复杂度是O(n²).

2.克鲁斯卡尔算法
这个算法是从边的角度考虑,既然是找最短路径,那就是路径组合而已,不过还需要考虑是否构成回路.
首先定义边的数据结构:

边的数据结构

然后把边组成一个集合,并且这里按照权值升序排列:
边集

代码如下:
代码

分析:
maxedge设置为15,maxvex设置为9;并且省略掉了邻接矩阵生成边集数组的过程,假设edges已经是边集数组了;
第5~7行初始化数组parent并且全部初始化为0;
第10行调用Find函数,得到n=4,第11行得到m=7;
第12~16行,m不等于n,parent[4] = 7;parent为[0,0,0,0,7,0,0,0,0];此时v4v7纳入最小生成树;
接下来v2v8,v0v1,v0v5,v1v8,v3v7,v1v6都得到了,现在parent是[1,5,8,7,7,8,0,0,6],
来观察一下parent数组,parent[0] = 1,看图发现v0v1在集合A中,接着从1开始,parent[1] = 5,那么v1和v5,也在A中,p[5] = 8,那么v5和v8,p[8] = 6,则v8和v6,p[6] = 0,那么结束了,在看p[2] = 8,则v2v8也在A中,现在A有v0,v1,v2,v5,v6,v8,不在A的点就是v3,v4,v7了;
image.png

i=7时,得到m=n=6,防止v5v6形成回路,于是直接开始下一次循环
i=8同上
i=9时,n=6,m=7,得到parent[6] = 7,此时parent为[1,5,8,7,7,8,1,0,6].
最终

最终克鲁斯卡尔算法复杂度是O(nlogn),n是边数,对于边数较少的网来说,更合适.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容