Scala中的联合查找(或不相交集)数据结构

Scala中的联合查找(或不相交集)数据结构,scala,data-structures,union-find,Scala,Data Structures,Union Find,我正在寻找Scala中联合查找或不相交集数据结构的现有实现,因为优化看起来有些复杂 我指的是这样一种情况,即union和find这两个操作都得到了优化 有人知道有什么存在吗?很明显,我已经尝试过在谷歌上搜索了。我曾经为自己写过一篇文章,我相信这篇文章的表现不错。与其他实现不同,find是O(1),union是O(log(n))。如果您的union操作比find多得多,那么这可能不是很有用。我希望你觉得它有用: 套餐周2 导入scala.collection.immutable.HashSet 导

我正在寻找Scala中联合查找或不相交集数据结构的现有实现,因为优化看起来有些复杂

我指的是这样一种情况,即
union
find
这两个操作都得到了优化


有人知道有什么存在吗?很明显,我已经尝试过在谷歌上搜索了。

我曾经为自己写过一篇文章,我相信这篇文章的表现不错。与其他实现不同,
find
O(1)
union
O(log(n))
。如果您的
union
操作比
find
多得多,那么这可能不是很有用。我希望你觉得它有用:

套餐周2
导入scala.collection.immutable.HashSet
导入scala.collection.immutable.HashMap
/**
*联合会找到了执行机构。
*查找是O(1)
*联轴节为O(对数(n))
*实现是使用哈希表。每个包裹都有一个集合,用于维护包裹中的元素。
*当两个包裹并拢时,两个包裹集都会被棍住。O(log(n))操作
*还维护一个HashMap来查找与每个节点关联的包装。O(log(n))在维护它时的操作。
* 
*如果输入数组在任何索引处为空,则忽略它
*/
类UnionFind[T](全部:数组[T]){
private var dataStruc=新HashMap[T,Wrap]
用于(新包装(a))
var timeU=0升
var时间=0L
/**
*工会的数目
*/
私有变量大小=dataStruc.size
/**
*包含a和b的集合的并集
*/
def接头(a:T,b:T):缠绕={
val st=System.currentTimeMillis()
val first:Wrap=dataStruc.get(a).get
val second:Wrap=dataStruc.get(b).get
if(第一个包含(b)| |第二个包含(a))
第一
否则{
//下面是将较小的合并为较大的,而不是相反的方式
val firstIsBig=(first.set.size>second.set.size)
val ans=if(firstIsBig){
first.set=first.set++second.set
second.set.foreach(a=>{
dataStruc=dataStruc-a
dataStruc=dataStruc+(a->first)
})
第一
}否则{
second.set=second.set++first.set
first.set.foreach(a=>{
dataStruc=dataStruc-a
数据结构=数据结构+(a->秒)
})
第二
}
timeU=timeU+(System.currentTimeMillis()-st)
尺寸=尺寸-1
ans
}
}
/**
*如果它们在同一组中,则为true。如果不是,则为false
*/
def find(a:T,b:T):布尔={
val st=System.currentTimeMillis()
val ans=dataStruc.get(a).get.contains(b)
timeF=timeF+(System.currentTimeMillis()-st)
ans
}
def sizeUnion:Int=size
类包装(e:T){
变量集=新哈希集[T]
set=set+e
def添加(要素:T){
集合=集合+元素
}
def contains(elem:T):布尔值=set.contains(elem)
}
}

有点复杂?排名联合优化只添加了一些简单直观的条件,路径压缩只添加了一个赋值(维基百科上的伪代码掩盖了这一点,请尝试重写它——但它不像维基百科的版本更难理解)。实现它是微不足道的(与提出它并分析其渐进复杂性形成鲜明对比)。