一般的并查集都是用递归或者新建一个类来实现,这里介绍一种用Python来实现的非递归非函数并查集,这个方法暂时未在其他地方见过,尤其是中文领域目前还未见过,很可能是搜索引擎无法搜索到正确内容的原因,所以不排除会有撞车的,不过在撞车警告之前,我都视为是我原创,LeetCode中文版上并查集的题目我基本都写了两种解,在那些题的题解里应该可以看到。(20190730)

假设存在n个点存在连通关系connections :

n = 6, connections = [[0, 1], [0, 2], [4, 3], [1, 2], [3, 2]]

求两个点的连通性,就可以使用并查集去检验:

def LsUnionFindSet(self, n: int, connections: List[str], a: int, b: int) -> bool:p = [[i] for i in range(n)]       #并查集初始化for x, y in connections:          #遍历边if p[x] is not p[y]:          #如果两个列表指针不相等p[x].extend(p[y])         #将y列表并进x列表for z in p[y]:            #遍历y列表的元素p[z] = p[x]           #所有y列表的元素都指向x集合return p[a] == p[b]

[a, b] 为[0, 4],返回为True

[a, b] 为[2, 5],返回为False

 

 

时间复杂度应该和常规的并查集一致,每次赋值其实都是指针赋值,相对来说计算量并不大,z层的总循环在我个人多次计数试验应该是在~这样,符合并查集时间复杂度即阿克曼反函数,具体证明应参考并查集的标准证明,空间复杂度,传递过程大多是传递集合的指针地址,并不增加额外空间。

算上临时空间,最大空间为,即所有元素均分成2块,合并过程中会产生的临时空间,但合并结束后,临时空间将会被销毁。

同时,这种方法非常容易进行权重优化:

def LsUnionFindSet(self, n: int, connections: List[str], a: int, b: int) -> bool:p = [[i] for i in range(n)]       #并查集初始化for x, y in connections:          #遍历边if p[x] is not p[y]:          #如果两个列表指针不相等if len(p[x]) < len(p[y])  #如果x所在的集合小于y所在的集合x, y = y, x           #交换x,y使得优先使小集合并入大集合p[x].extend(p[y])         #将y列表并进x列表for z in p[y]:            #遍历y列表的元素p[z] = p[x]           #所有y列表的元素都指向x集合return p[a] == p[b]

只需要一个判断就可以让复杂度稳定在以下了,leetcode上用这种方法可以很轻松拿到95-100%的时间成绩。

此方法除了rust,大多数语言都可以轻松实现,无指针语言如java/javascript的代码结构基本跟python一致,有指针的语言如c++/golang等则需要单独处理指针引用,指针安全语言rust则需要包裹智能指针,相对比较麻烦。

下面是静态语言go的链表版实现样例

// 链表
type ListNode struct {Val intNext *ListNode
}// 并查集结构,只需要记录链表头尾和大小
type UnionFindSet struct {head *ListNodetail *ListNodesize int
}func LsUnionFindSet(n int, connections [][]int) {p := make([]*UnionSet, n)  // 并查集初始化for i := range p {node := &ListNode{i, nil}p[i] = &UnionFindSet {head: node,tail: node,size: 1,}}for _, c := range connections {x, y := c[0], c[1]if p[x] != p[y] {if p[x].size < p[y].size {      // 比较两个并查集尺寸并进行权重优化,O(1)x, y = y, x}p[x].tail.Next = p[y].head      // 大集合的链表尾部连上小集合的链表头部,O(1)p[x].tail = p[y].tail           // 更新大集合的链表尾部,O(1)p[x].size += p[y].size          // 更新大集合的尺寸,O(1)for z := p[y].head; z != nil; z = z.Next {p[z.Val] = p[x]             // 遍历小集合,把小集合里所有坐标的集合指向改成大集合}                               // O(min(p[x].size, p[y].size))} }
}

[L氏并查集] Python 列表法实现非递归并查集,轻松权重优化。相关推荐

  1. bzoj2054疯狂的馒头(巧用非递归并查集)

    www.cnblogs.com/shaokele/ bzoj2054:疯狂的馒头 Time Limit: 10 Sec Memory Limit: 162 MB Description Input 第 ...

  2. 递归函数就兔子数C语言,【C语言】求斐波那契(Fibonacci)数列通项(递归法、非递归法)...

    意大利的数学家列昂那多·斐波那契在1202年研究兔子产崽问题时发现了此数列.设一对大兔子每月生一对小兔子,每对新生兔在出生一个月后又下崽,假若兔子都不死亡.问:一对兔子,一年能繁殖成多少对兔子?题中本 ...

  3. java 生成组织列表树(非递归)

    在展示菜单列表或组织架构等列表时经常会通过树型结构,以树型结构展示更加直观. 实现树最简单的方式就是递归,该方式随着树的深度加深,时间复杂度o(n^m)也会指数型上升,轻则影响用户体验,重则导致系统崩 ...

  4. list 去重_测试面试题集Python列表去重

    ------·今天距2020年21天·------ 这是ITester软件测试小栈第86次推文 请定义函数,将列表[10, 1, 2, 20, 10, 3, 2, 1, 15, 20, 44, 56, ...

  5. 测试面试题集-Python列表去重

    ------·今天距2020年21天·------ 这是ITester软件测试小栈第86次推文 请定义函数,将列表[10, 1, 2, 20, 10, 3, 2, 1, 15, 20, 44, 56, ...

  6. 全面讲解Python列表数组(一)创建,增删改查,萌新版,

    一. 创建列表 创建一个普通列表: member = [1,2,3,4,5] 混合列表 mix = [1,2,'哈',[3,4]] 这个特性很重要哦,是python特点之一; 空列表 empty = ...

  7. Python实现二叉树的非递归先序遍历

    思路: 1. 使用列表保存结果: 2. 使用栈(列表实现)存储结点: 3. 当根结点存在,保存结果,根结点入栈: 4. 将根结点指向左子树: 5. 根结点不存在,栈顶元素出栈,并将根结点指向栈顶元素的 ...

  8. 【编译原理笔记05】语法分析:FIRST集和FOLLOW集的计算,[非]递归的预测分析法,预测分析中的错误处理

    本次笔记内容: 4-4 FIRST集和FOLLOW集 4-5 递归的预测分析法 4-6 非递归的预测分析法 4-7 预测分析法中的错误处理 本节课幻灯片,见于我的 GitHub 仓库:第5讲 语法分析 ...

  9. 递归折半查找法 c语言程序,折半查找法的递归和非递归形式

    /* 1.折半查找的查找过程是:先确定待查记录所在区间,然后逐步缩小范围至到找到或者找不到该记录为止. 2.折半查找的性能分析可以由判定树得出,折半查找在查找成功时给定值进行比较的关键字个数至多为⌊l ...

最新文章

  1. mysql在线教程嵌套_MySQL update嵌套
  2. 结合JDK源码看设计模式——策略模式
  3. 获取的官方例程后怎么开发_开发商败诉后拒不赔偿怎么办,房地产纠纷处理方式有哪些?...
  4. 深度学习模型大合集:GitHub 趋势榜第一,已斩获 8000+ 星
  5. JAVA中常用的逻辑运算符_Java中常用的运算符
  6. 《小学生C++趣味编程》 第23课 打车费用
  7. 初识爬虫的那天,我选择了Java!
  8. Eclipse快捷键大全(转贴)
  9. Spring Data JPA 常用 CRUD 操作汇总 及 关联关系( 操作 h2 内存数据)
  10. 双系统在linux中修复引导文件,windows ubuntu双系统重装后修复grub引导
  11. 【Android】科大讯飞——语音识别
  12. slk文件转换器安卓版_【更新】手机QQ、微信语音读取转换工具【sik\amr格式转mp3】...
  13. 云架构师进阶攻略(3)
  14. android 2.2 sdk 下载地址,Android SDK 2.2 离线安装
  15. valgrind内存泄漏检测
  16. SitePoint播客#26:力量在于您
  17. 耗时8个小时用纯HTML和CSS写成的学成在线
  18. 调起APP功能的实现
  19. 力扣(LeetCode)236. 二叉树的最近公共祖先(C语言)
  20. 集合--Set集合--HashSet类、LinkedHashSet类、TreeSet类及其自然排序

热门文章

  1. 全民wa矿小程序源码
  2. 天辰的救赎(JS)第四章(组合元素)
  3. 成都榆熙电子商务有限公司:拼多多商家如何剖析用户数据?
  4. 车载通信与导航(七):D2D通信详解
  5. 更多数学趣题:求对数
  6. Matlab中的persistent变量
  7. Windows10 无法正常搜狗和搜狗输入法
  8. 中央大学计算机学什么,中央大学讲解
  9. 40岁开始学编程,现在成了一名技术主管
  10. 视频会议室预定小程序_6个最佳免费视频会议应用程序