这是一个实现并查集/不交集数据结构的微型库,具有以下功能:
UFDisjointSetNode
。一个UFDisjointSetNode
是某个隐式节点集合的成员。在任何给定时间,集合由其成员中的一些单个特定节点表示。集合永远不会部分重叠;要么是相同的集合,要么没有节点重叠。unionWith:
将两个UFDisjointSetNode
成员所在的集合合并为一个集合。isInSameSetAs:
确定两个UFDisjointSetNode
是否在同一集合中。使用currentRepresentative
获取当前代表该接收节点所在集合的节点。节点属于同一集合当且仅当它们具有相同的代表。方法 #1: CocoaPods
pod 'UnionFind'
pod 'UnionFind', '~> 1.0'
pod install
#import "UnionFind.h"
以便在任何地方访问库的类型或方法方法 #2: 手动
src/
文件夹复制到您的项目中#import "UnionFind.h"
以便在任何地方访问库的类型或方法该算法来源于维基百科中的不交集数据结构文章。操作时间几乎为常数时间的摊销时间。
在您希望进行并查集操作的类中,添加一个类型为UFDisjointSetNode
的字段。初始化节点,要么在类构造时懒惰地初始化,然后在需要时使用它,然后对该节点执行操作。
例如,假设我们有一个FancyGraphNode
,可以向其中添加边但不能删除。我们希望跟踪节点是否在同一连通分量中。我们可以
@private UFDisjointSetNode* _ccNode
添加到FancyGraphNode
init
函数中初始化该字段:_ccNode = [UFDisjointSetNode new]
。[edge.Node1._ccNode unionWith:edge.Node2._ccNode]
。[node1._ccNode isInSameSetAs:node2._ccNode]
。在这篇关于增量循环检测的博客文章中讨论了应用示例。