并查集

 【常用操作】

# 合并

# 是否在同一集合

# 所属集合

 

【lua实现】

 1 local UnionFind = {}
 2 UnionFind.__index = UnionFind
 3 
 4 function UnionFind.new()
 5     local obj = {}
 6     setmetatable(obj, UnionFind)
 7 
 8     obj:ctor()
 9     return obj
10 end
11 
12 function UnionFind:ctor()
13     self.elementGroupMap = {} --key:element, value:group
14 end
15 
16 ---设置元素所属分组
17 function UnionFind:SetElement(e)
18     self.elementGroupMap[e] = e
19 end
20 
21 function UnionFind:Union(e1, e2)
22     local e1Group = self.elementGroupMap[e1]
23     local e2Group = self.elementGroupMap[e2]
24     for k_element, v_group in pairs(self.elementGroupMap) do
25         if v_group == e1Group then
26             self.elementGroupMap[k_element] = e2Group
27         end
28     end
29 end
30 
31 function UnionFind:IsConnected(e1, e2)
32     return self.elementGroupMap[e1] == self.elementGroupMap[e2]
33 end

 

测试代码:

 1 function CreateUF()
 2     local uf = UnionFind.new()
 3     uf:SetElement("0")
 4     uf:SetElement("1")
 5     uf:SetElement("2")
 6     uf:SetElement("3")
 7     uf:SetElement("4")
 8     uf:SetElement("5")
 9     uf:SetElement("6")
10     uf:SetElement("7")
11     uf:SetElement("8")
12     uf:SetElement("9")
13 
14     uf:Union("0", "5")
15     uf:Union("5", "6")
16 
17     uf:Union("1", "2")
18     uf:Union("2", "7")
19 
20     uf:Union("8", "3")
21     uf:Union("3", "4")
22     uf:Union("4", "9")
23 
24     return uf
25 end
26 
27 
28 function Test1()
29     local uf = CreateUF()
30 
31     print(uf:IsConnected("0", "5"))
32     print(uf:IsConnected("0", "1"))
33     print(uf:IsConnected("1", "2"))
34     print(uf:IsConnected("2", "3"))
35     print(uf:IsConnected("3", "8"))
36 end
37 Test1()

 

【参考】

并查集_likesomething的博客-CSDN博客_并查集

算法学习笔记(1) : 并查集 - 知乎 (zhihu.com)

并查集Java实现_日积月累,天道酬勤-CSDN博客_java 并查集

 并查集 - 简书 (jianshu.com)

 

posted @ 2022-03-08 22:46  yanghui01  阅读(33)  评论(0编辑  收藏  举报