首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中合并合并集

在C++中合并合并集
EN

Stack Overflow用户
提问于 2013-07-22 19:31:30
回答 2查看 257关注 0票数 4

unsigned int的向量开始...

代码语言:javascript
复制
vector<vector<unsigned short int> > matrix;
vector<unsigned short int> row;

我想合并联合集合(具有公共元素的向量)。

对于实例,作为输入:

代码语言:javascript
复制
matrix[0] = {0, 1, 2}
matrix[1] = {1, 10}
matrix[3] = {9}
matrix[4] = {2, 8}
matrix[5] = {7}

作为输出:

代码语言:javascript
复制
matrix[0] = {0, 1, 2, 10, 8}  // it doesn't matter the order
matrix[1] = {9}
matrix[2] = {7}

解决此问题的最有效解决方案是什么?致以最好的问候,维。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-22 19:54:50

您可以将此问题简化为查找无向图的所有连通组件。顶点是您的矩阵行,边是非零重叠。Boost.Graph库可以计算O(V+E)复杂度,其中V是顶点数(矩阵行),E是边数(重叠行数)。如果您不喜欢对Boost的依赖,您可以使用任何available algorithms来计算强连接组件。

剩下的就是计算这个图的边列表表示,这取决于您是否能够对矩阵行进行排序。如果不能对矩阵行进行排序,您可以使用std::find_first_of来检测非零重叠(对于NM元素的两个向量,这具有O(N * M)复杂性)。如果可以对它们进行排序(以O(N lg N)复杂度表示),则可以使用std::set_intersection来测试重叠(仅限O(N + M)复杂度)。

Boost.Graph或算法的输出是一组连接的组件,然后循环遍历每个组件,并将矩阵的各个重叠行追加或合并在一起(使用std::copy,如果需要对它们进行排序,则使用std::merge )。

票数 2
EN

Stack Overflow用户

发布于 2013-07-23 01:37:24

我建议您使用disjoint set forest。对于每个集合,迭代地将这些数字添加到该集合的第一个数字所属的集合。这样做之后,只需打印每个集合中的所有数字。事实上,实现并不是那么困难,但性能将比已经提出的解决方案快得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17786480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档