首发于 算法与复杂度
克鲁斯卡尔算法

克鲁斯卡尔算法

另一种猜想

上一节我们学习了如何用 普林姆算法来解决最小生成树的问题。简单回顾一下,算法一开始从节点集合 V 中任选一个节点作为起始节点,然后选择与之相邻的最小权重的边,如果这条边对应的下一个节点没有被访问过,那么就将这条边作为最小生成树的一部分;否则就看权重第二小的边是否满足要求。上述过程重复执行 |V| - 1,我们就可以得到一个图的最小生成树。

我们看到,普林姆算法是基于现成的图结构来得到最小生成树的。其实,我们还可以这样想:将图中的所有边全部拆开,使节点成为一个个孤立的节点,然后从边集合中取出一部分的边,来使这些节点彼此能够互相连通,并且权值之和最小。

那么,现在的问题是,如何判断两个节点是否连通呢?这时候就要用到并查集disjoint set)了。

并查集

查找是否为同一集合

并查集主要用于判断两个元素是否在同一集合,以及合并两个集合。要想判断两个元素是否在同一个集合,我们只需要让每个元素派出自己所属集合的“代表”(representative),然后判断是否是同一个“代表”即可。这就好比一个刚组建的社团里,同学们相互之间都还不认识,那怎样区分他们是不是同一个班上的人呢?这时只需要每个人都报出自己班上班长的名字,问题就可以得到解决。如果班长是同一个人,那么就是一个班的,否则就不是。例如下面的例子中,两个集合的代表就分别为 A 和 B。

我们首先定义一个Vertex类,使每一个节点在初始化的过程中都指向自身,表示单个节点的“代表”为自身。

接下来是DisjointSet类的find方法。我们采用递归的方式递归地查找parent为自身的节点,即树的根节点,找到后return

这样我们就可以判断两个节点是否为同一集合啦~

合并

合并并查集的方式有很多种,最常用的是基于树的高度的方式(union by rank)。为了使每次查找根节点的次数变少,我们需要rank小的根节点连接到rank大的根节点上,然后根据公式下面的公式更新合并后根节点的 rank

rank_{update} = \begin{cases} \max{(rank_A, rank_B+1)}, & \mbox{if }rank_A > rank_B\mbox{} \\ \max{(rank_B, rank_A+1)}, & \mbox{if }rank_B \geq rank_A\mbox{} \\ \end{cases}

例如下面的两个集合S1S2,对应根节点 A 和 B 的rank分别为 1 和 2,这时只需要将 A 的父节点指向 B 即可。

克鲁斯卡尔算法

知道了如何判断两个元素是否在一个集合中,以及怎样将其合并,我们就可以实现克鲁斯卡尔算法了,算法流程如下:

为了更好地理解这个过程,我做了一个 gif 动图。其中,我将不满足条件的边打上了 “×”,而用蓝色的线段表示生成树。

整个过程的代码如下:

最后来看看克鲁斯卡尔的时间复杂度。它主要分为三个部分,首先我们要对 |V| 个节点进行初始化,所以第一部分的复杂度为 Θ(|V|) ;然后,我们要对所有边 E 进行排序,用基于比较的排序算法,我们最快能够达到 Θ(|E|\log|E|) 的复杂度;最后,我们判断两个节点是否属于一个集合,由于树的高度和节点数 |V| 呈现一个近似对数关系,而我们要对 |E| 条边进行判断,因此这一部分的时间复杂度就为 Θ(|E|\log|V|) 。由于在比较稠密的图中,边的个数大于节点的个数,所以总的复杂度我们取较大的 Θ(|E|\log|E|)


本节全部代码



聚圣源家政公司起名大全三个字新能源公司起名大全双胎女孩起名大全免费成语起名男孩宋词起女孩姓名大全水瓶座的女人猪宝宝起名禁忌瑞典足球刘氏起名恐怖邮差smm.cnwww.5735pp.com陆起名字大全男孩名字小饭店起名字的爱ab给姓于的男孩子起名字鑫字起名梦见吃面条星座知识数字成语懋字有寓意的名字设备工程公司起名什么是防火板屈原姓什么的cnet悄悄地喜欢你免费观看花店起什么名字招财五行缺木的女孩子起什么名字好塑胶制品起名冯姓鼠年起名淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化