微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

算法代码实现之Union-Find,Golang(Go语言)实现,quick-find、quick-union、加权quick-union(附带路径压缩优化)

本算法主要解决动态连通性一类问题,这里尽量用精炼简洁的话来阐述。


数据结构描述:

  1. 有N个节点(索引0~N-1),可以查询节点数量
  2. 可以连接两个节点
  3. 可以查询两个节点是否连通
算法大致设计思路:
  1. 每个节点初始化为不同的整数标记
  2. 通过一个辅助函数查询某个节点的标记
  3. 如果两节点标记相同,说明两节点是连通的
一个包专门处理union-find算法(unionfind)
定义接口和基类(union_find.go):
    
    
package unionfind//union-find的quick-find实现版type QuickFind struct { BaseUnionFind}func (qf *QuickFind) Connectedp, q intboolreturn qf.id[]==q] Union i j :=],123)">if i for k v range qfid k= icount--func NewQuickFindn *QuickFind&QuickFind{*NewBaseUnionFindn)}}

QuickFind:

  1. a和b进行union的时候,将b及与b连通节点的标记都置为和a的标记一样
  2. 标记相同的节点是连通的
quick_find.go:
   
   
i j j c }

QuickUnion:

  1. 连通的节点形成一棵树,根节点相同
quick_union.go:
//union-find的quick-union实现版type QuickUnion}//查询根节点qu *QuickUnion findRootp int p != qu pfindRoot) rp rq rq rpfunc NewQuickUnion*QuickUnion&QuickUnion}

加权QuickUnion(附带路径压缩优化):

  1. union的时候小树挂在大树下
  2. 查询根节点的时候顺便将该节点的父节点直接指向根节点,压缩路径
weighted_quick_union.go:
//union-find的加权quick-union实现版,//另外还作了路径压缩优化type WeightedQuickUnion QuickUnion sz []//查询根节点,顺便压缩路径wqu *WeightedQuickUnion wquwqu]]szrp< rq+=elsefunc NewWeightedQuickUnion*WeightedQuickUnion make([] n 0;++ sz1&WeightedQuickUnion{QuickUnion:*NewQuickUnion),161)">:}

原文地址:https://www.jb51.cc/go/189913.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐