在Python中实现不相交集数据结构

时间:2014-12-24 00:10:54

标签: python class methods set disjoint-sets

我正在处理一个涉及集群的小项目,我认为这里给出的代码https://www.ics.uci.edu/~eppstein/PADS/UnionFind.py可能是我工作的一个很好的起点。但是,我在实施工作时遇到了一些困难:

  1. 如果我创建一个包含我所有簇的集合cluster = set([0,1,2,3,4,...,99])(有100个点标有数字),那么我想将数字分组到集群中,我只是编写cluster = UnionFind()吗?现在什么是集群的数据类型?

  2. 如何在群集上执行常规操作?例如,我想在群集中读取所有点(可能已组合在一起),但是键入print cluster会导致< main .UnionFind实例位于0x00000000082F6408>。我还想继续向集群添加新元素,我该怎么做?我是否需要为UnionFind()编写具体的方法?

  3. 我怎么知道一个组成员的所有成员被调用?例如,0,1,3,4组合在一起,如果我调用3,我希望它打印0,1,3,4,我该怎么做?

  4. 感谢

1 个答案:

答案 0 :(得分:1)

以下是有关如何使用提供的UnionFind类的小示例代码。

<强>初始化

使用提供的类创建集合的唯一方法是FIND它,因为只有在找不到它时才为点创建集合。您可能想要创建一个初始化方法。

union_find = UnionFind()
clusters = set([0,1,2,3,4])
for i in clusters:
    union_find[i]

<强>联盟

# Merge clusters 0 and 1
union_find.union(0, 1)
# Add point 2 to the same set
union_find.union(0, 2)

<强>查找

# Get the set for clusters 0 and 1
print union_find[0]
print union_find[1]

获取所有群集

# print all clusters and their sets
for cluster in union_find:
    print cluster, union_find[cluster]



注意:

没有直接的方法可以获得给定簇编号的所有点。您可以遍历所有点并选择具有所需群集号的点。您可能希望修改给定的类以更有效地支持该操作。