并查集
【常用操作】
# 合并
# 是否在同一集合
# 所属集合
【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 并查集