有序表并查集
来源 左神 有序表并查集
并查集
岛问题
【题目】leetcode 200
一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个矩阵中有多少个岛?
1 | 【举例】 |
遍历二维数组每一位, 如果这一位为1,就调用感染函数进行感染(周围的岛屿都变为2),记录了调用几次感染函数,就有几个岛屿。
1 | public class CountIslands { |
时间复杂度:在遍历阶段,每个位置遍历一次,感染阶段,每个位置只遍历4次(上下左右调用),O(n*m)
。
如何设计一个并行算法解决这个问题?
并查集介绍
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。
并查集通常包含两种操作
init(s)
:建立一个新的并查集,其中包含s个单元素集合union(x, y)
:把元素x和元素y所在的集合合并,要求x和y所在的集合不相交,如果相交则不合并find(x)
:找到元素x所在的集合的代表,该操作也可以用于判断两个元素是否位于同一个集合,只要将它们各自的代表比较一下就可以了
find(D)和find(F)分别返回元素D和元素F所属集合的代表A和H:

union(D, F)将元素D和元素F所在的集合合并:
1 | public class UnionFind { |
单次时间复杂度可以是O(1)
并查集解决岛问题
1 | class Solution { |
当使用并查集在多个cpu上计算岛屿,将矩阵拆分为多块,每块各自使用感染算法计算各自的的岛屿,并记录各自块的边界上的岛屿的联通情况(land[i][j] = a
),当所有块的岛屿计算完成后,在根据边界上的岛屿如果联通,就合并为一个集合。