当前位置:首页 » 操作系统 » 邻接种子算法

邻接种子算法

发布时间: 2025-01-17 23:34:28

㈠ [图] 最小生成树-Prime算法和Kruskal算法

普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。

4 .输出:使用集合 V new 和 E new 来描述所得到的最小生成树。

下面对算法的图例描述

反证法:假设prim生成的不是最小生成树

这里记顶点数v,边数e

邻接矩阵:O(v 2 )
邻接表:O(e * log 2 v)

Kruskal算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表。用来解决同样问题的还有 Prime 算法和 Boruvka 算法等。三种算法都是贪婪算法的应用。和 Boruvka 算法不同的地方是,Kruskal 算法在图中存在相同权值的边时也有效。

图例描述:

对图的顶点数 n 做归纳,证明 Kruskal 算法对任意 n 阶图适用。

归纳基础:

n = 1,显然能够找到最小生成树。

归纳过程:

假设 Kruskal 算法对 n ≤ k 阶图适用,那么,在 k + 1 阶图 G 中,我们把最短边的两个端点 a 和 b 做一个合并操作,即把 u 与 v 合为一个点 v',把原来接在 u 和 v 的边都接到 v' 上去,这样就能够得到一个 k阶图 G'(u ,v 的合并是 k + 1 少一条边),G' 最小生成树 T' 可以用Kruskal 算法得到。

我们证明 T' + {<u,v>} 是 G 的最小生成树。

用反证法,如果 T' + {<u,v>} 不是最小生成树,最小生成树是 T,即W(T) < W(T' + {<u,v>})。显然 T 应该包含 <u,v>,否则,可以用<u,v> 加入到 T 中,形成一个环,删除环上原有的任意一条边,形成一棵更小权值的生成树。而T - {<u,v>},是 G' 的生成树。所以 W(T-{<u,v>}) <= W(T'),也就是 W(T) <= W(T') + W(<u,v>) = W(T'+{<u,v>}),产生了矛盾。于是假设不成立,T' + {<u,v>}是 G 的最小生成树,Kruskal 算法对 k+1 阶图也适用。

由数学归纳法,Kruskal 算法得证。

e * log 2 e (e为图中的边数)

㈡ 写一个算法,判断对给定有向图中的指定顶点是否至少存在一条有向边指向它。

【答案】:(1)数据结构
采用有向图的邻接表(出边表)表示法。
(2)思路
图有3种表示方法:出边表(邻接表的一种)、入边表(邻接表的一种)和邻接矩阵。相应的有3种算法。设n为顶点数,m为边数。
对于出边表,顺序搜索一遍边即可,时间代价为O(m)。
对于入边表,判断指定顶点的边表头指针是否非空即可,时间代价为O(1)。
对于邻接矩阵,搜索矩阵中指定顶点对应的列,判断其中是否有非0元即可,时间代价为O(n)。
以出边表为例,给出一个算法如下。
(3)算法
int is_end(GraphList g,int k){
/*判断图g中是否有边指向第k个结点(0<=k<=g.n-1)*/
EdgeList p;
inti;
for(i=0;i<g.n;i++){
p=g.vexs[i].edgelist;
while(p!=NULL){
if(p->endvex==i)return 1;
p=p->nextedge;
}
}
return 0;
}
(4)代价分析
该算法的时间复杂度为O(m)。

㈢ NI Vision:二值图像连通域标记算法

前面说到,要使用Labwindows + NI Vision(IMAQ Vision)这套商用开发框架来做数图课设。很明显,这套虚拟仪器开发平台由NI Instrument(美国国家仪器公司)开发的。大名鼎鼎的Labview软件就是这个公司开发的。相比较而言,Labwindows使用ANSI C开发,但应用场景是差不多的。

在做课程作业的时候,遇到了一个很有趣的应用。输入是米粒,比背景灰度要低,目的是输出米粒的颗数、面积、周长和孔数,这是工业上的一个很常见的应用。具体处理过程是二值化后使用低通滤波,并计算各种性质。

界面设计如下,可以看到米粒的详细情况。

让我感兴趣的,是通过怎样的算法能够得到米粒的数量?之前曾经用过OpenCV中找最大外界矩形这个函数,但没有具体了解算法实现。直觉告诉我原理应该是相似的。

可以看到,每一个米粒之间都是不连通的。这里就就提出了一个概念。 连通区域(Connected Component) 是指图像中相邻并有相同像素值的图像区域。 连通区域分析(Connected Component Analysis,Connected Component Labeling) 是指将图像中的各个连通区域找出并标记。

二值图像分析最重要的方法就是连通区域标记,它是所有二值图像分析的基础,它通过对二值图像中白色像素(目标)的标记,让每个单独的连通区域形成一个被标识的块,进一步的我们就可以获取这些块的轮廓、外接矩形、质心、不变矩等几何参数。如果要得到米粒的数量,那么通过连通区域分析(这里是二值图像的连通区域分析),就可以得到标记的数量,从而得到米粒的数量。

下面这幅图中,如果考虑4邻接,则有3个连通区域,8邻接则是2个。

从连通区域的定义可以知道,一个连通区域是由具有相同像素值的相邻像素组成像素集合,因此,我们就可以通过这两个条件在图像中寻找连通区域,对于找到的每个连通区域,我们赋予其一个唯一的 标识(Label) ,以区别其他连通区域。

连通区域分析的基本算法有两种:1)Two-Pass两便扫描法 2)Seed-Filling种子填充法 。

两遍扫描法(Two-Pass),正如其名,指的就是通过扫描两遍图像,就可以将图像中存在的所有连通区域找出并标记。

说了一堆数学语言,其实用图很好理解

种子填充方法来源于计算机图形学,常用于对某个图形进行填充。它基于区域生长算法。至于区域生长算法是什么,可以参照我的这篇 文章 。

同样的,上动图

NI Vision 中的算子定义如下

OpenCV中也有相应的算子

这里参照其他博客实现一下Two-Pass算法,Seed-Filling算法就偷懒不搞了。

Reference:
OpenCV实现图像连通组件标记与分析
OpenCV-二值图像连通域分析
数字图像处理技术 ——邓继忠(我的任课老师)

热点内容
人间地狱为什么没有服务器 发布:2025-01-18 05:20:07 浏览:442
c语言编译器的版权 发布:2025-01-18 05:13:37 浏览:296
htmlbase64图片上传 发布:2025-01-18 05:13:03 浏览:19
微信小程序源码目录 发布:2025-01-18 05:08:51 浏览:679
投影仪什么配置好 发布:2025-01-18 05:01:46 浏览:56
倾城密码有什么蛋糕 发布:2025-01-18 05:00:35 浏览:413
安卓应用锁是什么意思 发布:2025-01-18 04:59:57 浏览:908
mfc数据存储 发布:2025-01-18 04:59:05 浏览:570
今日头条as算法 发布:2025-01-18 04:53:05 浏览:6
设置js缓存时间 发布:2025-01-18 04:43:44 浏览:512