并查集

并查集UnionFind一种奇怪的树形结构
  • 非常高效的解决连接问题

  • 判断网络中节点的链接状态

  • 数学中集合并的实现

并查集的定义

  • 判断是否连接,只需要判根节点是否一样

指向树的根节点

并查集主要实现的方法:

  • 判断是否连接isConnected
  • 把两个集合并起来

Quick Find

设计思想:定义一个数组,给里面每个值定义一个标识符,标识是否在一个集合中;并操作,如果不在一个集合中,使用for循环让他们的标识符一致,这就形成了并操作

具体实现: image-20210824233819160

Quick Union

改善并操作O(n)的时间复杂度,使用树来实现平均复杂度为O(logn)

设计思想:将每一个元素看作一个节点,判断是不是连接,就判断他们的指向的根节点是否一样;并操作:将这个树的根节点指向另一棵树的根节点即可;

具体实现:初始化数组,使每个元素指向它自己

image-20210824234558192

find方法image-20210824235303840

find方法因为是树形结构所以查找过程中不是相邻的,是索引的查找,需要在不同的地址之间跳转;

union操作image-20210824235737247

缺点:这棵树可能会很大,很深;时间复杂度很高

优化:考虑size;将高度低的那棵树指向高度高的那棵树,这样来控制树的高度;image-20210825001742406

性能提升大概500倍image-20210825001855868

让9指向8而不指向4的原因是:防止成为链表

image-20210824221259227

基于RANK的优化

rank[i]表示根节点为I的树的高度;

image-20210825091001839

路径压缩

1
parent[p] = parent[parent[p]];

设计思想:让该节点指向父亲节点的父亲节点,以降低树的高度;

image-20210825092108468 image-20210825092132678
递归实现:image-20210825091914244

时间复杂度分析

并不是严格意思上的二叉树,所以时间复杂度做了解即可

image-20210825092616066

总结:树结构的变种堆、线段树、trie、并查集;

Others:

  • leetcode
-------------本文结束感谢您的阅读-------------