在连接组件标签中使用不连接集时遇到了一些困难。我已经看了很多例子,也看了这个问题,Bo田提供了一个非常好的实现的Disjoint Set作为C++链表。我已经在我的程序中实现了连接组件标记(标签是简单的整数),但我很难解决具有不相交集的标签之间的等价性。
有人能帮我吗?也许用Bo田的方法?我认为,当其他人走到这一步时,这也会有所帮助。
编辑
我的算法遍历图像,当它找到两个标签时,两个连接的像素有不同的标签,它必须在"等价注册表"(这将是Disjoint集合林)中记下。在循环整个图像后,我必须通过(在图像上进行第二次遍历)查看注册表,然后将这些具有等效标签的像素标记为集合中的最小值来解决等效性。
不相交集合林提供两个操作:
- 并集,它接受两个对象并将其链接,以及
- Find,它获取两个对象并返回它们所在组的ID
不相交集合林主要用于将一组对象划分为不同簇的族,每个簇彼此不相交(即,每个对象最多在一个组中)。然后,不相交的集合林允许您有效地判断每个组中的对象,或者(在大约O(n)时间内)确定每个对象的集群ID。
要使用不相交的集合林,首先要将每个对象放入其自己的簇中。从那时起,每次您想标记两个不同的对象在同一集群中时,都会使用联合操作将它们链接在一起。在最后,你会在每个点上调用find来确定它属于哪个集群,然后从那里可以读取所有东西属于哪个组。
希望这能有所帮助!
查看关于DJS的本教程。唯一的修改是,在并集过程中,必须将较大的连接到较小的,所以根总是集合的最小值。
您是对的,标记连接集只完成了一半的工作。使用等价找到不相交集也是同样困难的部分。我面对的正是这种情况。
查找不相交集(标记后)的一种方法是使用联合查找算法。看看下面的文章。您将从头开始了解如何标记和查找不相交集。还提供了示例输入和输出矩阵的说明。
http://www.codeding.com/articles/connected-sets-labeling
有一个关于用不相交集标记连接组件的博客:
http://www.keithlantz.net/2011/04/c-implementation-of-the-connected-component-labeling-method-using-the-disjoint-set-data-structure/