【问题标题】:How to use Disjoint Sets in Connected Component labeling?如何在连通分量标注中使用不相交集?
【发布时间】:2012-02-11 02:58:11
【问题描述】:

我在连接组件标签中使用不相交集时遇到了一些困难。我查看了许多示例以及this question,其中Bo Tian 提供了非常好的不相交集实现作为C++ 链表。我已经在我的程序中实现了连接组件标签(标签是简单的整数),但是我很难解决具有不相交集的标签之间的等价性。

任何人都可以帮助我 - 也许使用 Bo Tian 的实现?我认为这也会帮助其他人达到这一点。

编辑

我的算法遍历图像,当它找到两个标签时,两个连接的像素具有不同的标签,它必须在“等价注册表”(这将是不相交集森林)中做一个注释。在循环整个图像之后,我必须通过(对图像进行第二次遍历)查看注册表然后将这些像素标记为集合中的最小值,从而解决等价问题。

【问题讨论】:

    标签: c++ algorithm data-structures linked-list disjoint-sets


    【解决方案1】:

    不相交集森林提供两种操作:

    • Union,它接受两个对象并将它们链接起来,并且
    • 查找,它接受两个对象并返回它们所在组的 ID。

    不相交集森林主要用于将一组对象划分为一组不同的集群,每个集群都不相交(也就是说,每个对象最多属于一个组)。然后,不相交集森林允许您有效地判断每个组中的对象,或者(大约在 O(n) 时间内)确定每个对象的集群 ID。

    要使用不相交的集合森林,您首先要将每个对象放入其自己的集群中。从那时起,每次您想标记两个不同的对象在同一个集群中时,您都将使用 union 操作将它们链接在一起。最后,您将在每个点上调用 find 来确定它属于哪个集群,并从那里读取所有内容属于哪个组。

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回答,但我想在代码中获得类似使用示例的内容,因为我无法弄清楚。
    • @Patryk- 不相交集森林没有标准实现,所以我认为我不能提供示例使用。此外,我并不完全了解您正在使用的算法,因此一个示例将有效地为您完成整个事情。对此感到抱歉。
    • @templateTypedef- 我理解,但对我来说,在这些集合、标签等的链接列表中很难找到自己。
    【解决方案2】:

    检查此tutorial on DJS。唯一的修改是在联合期间你必须连接更大到更小,所以根总是集合的最小值。

    【讨论】:

      【解决方案3】:

      你是对的,标记连接的集合只是完成了一半的工作。使用等价找到不相交的集合也是同样困难的部分。我遇到了确切的情况。

      找到不相交集的一种方法(在标记之后)是使用 Union-Find 算法。看看下面的文章。您将从头开始了解如何实现标记和查找不相交集。还给出了示例输入和输出矩阵的说明。

      http://www.codeding.com/articles/connected-sets-labeling

      【讨论】:

        【解决方案4】:
        猜你喜欢
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 2022-08-15
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        相关资源
        最近更新 更多