Prim、Kruskal、Prim+Heap算法效率实测

评测环境:WindowsXP,FreePascal2.40,Pentium(R) Dual-Core CPU T4300@2.10GHz,2G内存







通过上图可以看出:

1.Prim在稠密图中比Kruskal优,在稀疏图中比Kruskal劣。

2.Prim+Heap在任何时候都有令人满意的的时间复杂度,但是代价是空间消耗极大。【以及代码很复杂>_<】

3.时间复杂度并不能反映出一个算法的实际优劣。

竞赛所给的题大多数是稀疏图,所以尽可能地使用Prim+Heap吧,在稀疏图中这是无敌的。如果一定要在朴素Prim和Kruskal里选一个的话那就用Kruskal吧。当然Prim的代码比较简单,对付水题用Prim也无所谓,只要不是极稀疏图两者相差不大

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Prim算法实现: ```python import heapq class Graph: def __init__(self, vertices): self.graph = [[] for _ in range(vertices)] self.vertices = vertices def add_edge(self, u, v, w): self.graph[u].append((v, w)) self.graph[v].append((u, w)) def prim(self, start): # 初始化 visited = [False] * self.vertices heap = [(0, start)] mst_weight = 0 while heap: # 取出当前最小权值的边 weight, current = heapq.heappop(heap) if visited[current]: continue visited[current] = True mst_weight += weight # 添加所有连接当前节点的边到堆中 for neighbor, weight in self.graph[current]: if not visited[neighbor]: heapq.heappush(heap, (weight, neighbor)) return mst_weight g = Graph(5) g.add_edge(0, 1, 2) g.add_edge(0, 3, 6) g.add_edge(1, 3, 8) g.add_edge(1, 2, 3) g.add_edge(1, 4, 5) g.add_edge(2, 4, 7) print(g.prim(0)) ``` Kruskal算法实现: ```python class Graph: def __init__(self, vertices): self.graph = [] self.vertices = vertices self.parent = [i for i in range(vertices)] self.rank = [0] * vertices def add_edge(self, u, v, w): self.graph.append((u, v, w)) def find(self, node): # 寻找父节点 if self.parent[node] != node: self.parent[node] = self.find(self.parent[node]) return self.parent[node] def union(self, x, y): # 合并两个集合 xroot = self.find(x) yroot = self.find(y) if self.rank[xroot] < self.rank[yroot]: self.parent[xroot] = yroot elif self.rank[xroot] > self.rank[yroot]: self.parent[yroot] = xroot else: self.parent[yroot] = xroot self.rank[xroot] += 1 def kruskal(self): # 初始化 self.graph = sorted(self.graph, key=lambda x: x[2]) mst_weight = 0 for u, v, w in self.graph: if self.find(u) != self.find(v): self.union(u, v) mst_weight += w return mst_weight g = Graph(5) g.add_edge(0, 1, 2) g.add_edge(0, 3, 6) g.add_edge(1, 3, 8) g.add_edge(1, 2, 3) g.add_edge(1, 4, 5) g.add_edge(2, 4, 7) print(g.kruskal()) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值