算法教程学习——贪心算法(Kruskal算法)

本文介绍了贪心算法的概念及其证明过程,重点讲解了Kruskal算法解决最小生成树问题的思路。Kruskal算法按边的权重从小到大选择边,并利用并查集判断是否形成环,确保生成树的正确性。并提供了相关并查集资源供进一步学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贪心算法所做的每个选择都是独立的,并且是当下所有选择中的最佳决策。贪心算法相对容易实现,但是很难给出一个确切的证明,即贪心算法是合理的,是问题的最优解之一。贪心算法的证明通常涉及到两个步骤:

  1. 贪心选择性
  2. 最优子结构

贪心选择性指的是,每次通过贪心选择得到了一个最优解决方案的一部分。而最优子结构则是,做出选择后剩下的问题和原有的问题有着同样的解决方案。

最小生成树问题

Kruskal算法

kruskal算法的思想是,按照所有边的大小排序,从最短边开始选择,依次加入最短边,如果未出现环,则算法继续,出现环则跳过该边,算法继续,直到遍历完边集合。
这里的贪心就体现在每次都选择当前最短的边作为生成树的元素。这种贪心的想法是正确的,接下来要处理的问题就是如何判断环的问题。一种简单的解决方案就是运用遍历技术,另外还可以运用并查集来解决问题。
关于并查集,可以参考这篇博客:https://blog.youkuaiyun.com/huisekonghuan/article/details/79288550

#coding:utf-8

class unionFindSet(object):
	
	def init(self, number):
		self.parent = [i for i in range(number)]

	def find(self, k):
		while self.parent[k] != k:
			k = self.parent[k]

		return k

	def union(self ,u, v):
		if self.isConnected(u, v) is False:
			self.parent[u] = v 

	def isConnected(self, u, v):
		u = self.find(u)
		v =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值