How to get list of all elements from a 'Disjoint Sets'

时光总嘲笑我的痴心妄想 提交于 2019-12-25 07:06:02

问题


In my problem, I have a bunch of Elements (Class Element). Say I have 1000 Elements. These Elements are initially un-associated which means they are in their own sets.

Later I need to use the union operation to merge some of these sets based of my program flow. I plan to use the boost library's disjoint_set (http://www.boost.org/doc/libs/1_57_0/libs/disjoint_sets/disjoint_sets.html)

My question is how is it possible to list the Elements in a set given the representative of the set.

Is disjoint_set the best data structure for such a task. So should I look into using something else?


回答1:


From your prose description, I get no information that the sets would actually form any graphs.

If all you want to do is associate Elements with a set, I'd suggest

std::map<ElementId, SetId>

(where ElementId could simply be Element* if you know the pointers stay valid).

If you also want to be able to query the inverse efficiently

bimap<Element, bimaps::multiset_of<SetId> >

would be a candidate. See a demonstration Live On Coliru¹

#include <boost/range/iterator_range.hpp>
#include <boost/bimap/multiset_of.hpp>
#include <boost/bimap.hpp>
#include <iostream>

using namespace boost;

int main() {
    using Element = int; // for simplicity :)
    using SetId   = int;
    using Sets = bimap<Element, bimaps::multiset_of<SetId> >;

    Sets sets;
    sets.insert({ Element(1), 300 });
    sets.insert({ Element(2), 300 });
    sets.insert({ Element(3), 400 });
    sets.insert({ Element(4), 300 });

    // give us set #300
    for (auto& e : make_iterator_range(sets.right.equal_range(300)))
        std::cout << e.first << " - Element(" << e.second << ")\n";
}

Prints

300 - Element(1)
300 - Element(2)
300 - Element(4)

¹ Coliru seems down. Will add later



来源:https://stackoverflow.com/questions/26814381/how-to-get-list-of-all-elements-from-a-disjoint-sets

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!