一道算法题——合并有交集的集合
2012-02-29 22:46
246 查看
题目如下,
给定一个字符串的集合,格式如:
{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}
要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应
输出
{aaa bbb ccc ddd hhh},{eee fff}, {ggg}
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。
我查了查网上的解法,只看到一个(参见/article/10545025.html),我有一点新想法,说明如下:
1. 首先得到所有元素的集合(aaa, bbb, ccc, ddd, eee, fff, ggg, hhh),复杂度O(N),N是所有元素的个数;
2. 为所有集合标记一个二进制数,来表示包含哪些集合,得到数组int bina[5]复杂度O(N^2);
如题,{aaa, bbb, ccc} = 1 1 1 0 0 0 0 0,
{bbb, ddd} = 0 1 0 1 0 0 0 0,
{eee, fff} = 0 0 0 0 1 1 0 0,
{ggg} = 0 0 0 0 0 0 1 0,
{ddd, hhh} = 0 0 0 1 0 0 0 1,
3. 然后写一个函数,判断int数组中的第一个元素是否与其他元素&操作为空,复杂度为O(M),M是原集合的个数
a. 为空则输出该元素对应的集合,并删除第一个元素,递归调用本方法;
b. 不为空则与那个元素做或操作合并,删除那个元素,递归调用本方法;
c. 如果只剩下一个元素则输出其对应的字符串;
4. 所有的结合已经得到了。
从上面的复杂度看,应该是比原来网上的方法好一些,欢迎大家踊跃拍砖!
给定一个字符串的集合,格式如:
{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}
要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应
输出
{aaa bbb ccc ddd hhh},{eee fff}, {ggg}
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。
我查了查网上的解法,只看到一个(参见/article/10545025.html),我有一点新想法,说明如下:
1. 首先得到所有元素的集合(aaa, bbb, ccc, ddd, eee, fff, ggg, hhh),复杂度O(N),N是所有元素的个数;
2. 为所有集合标记一个二进制数,来表示包含哪些集合,得到数组int bina[5]复杂度O(N^2);
如题,{aaa, bbb, ccc} = 1 1 1 0 0 0 0 0,
{bbb, ddd} = 0 1 0 1 0 0 0 0,
{eee, fff} = 0 0 0 0 1 1 0 0,
{ggg} = 0 0 0 0 0 0 1 0,
{ddd, hhh} = 0 0 0 1 0 0 0 1,
3. 然后写一个函数,判断int数组中的第一个元素是否与其他元素&操作为空,复杂度为O(M),M是原集合的个数
a. 为空则输出该元素对应的集合,并删除第一个元素,递归调用本方法;
b. 不为空则与那个元素做或操作合并,删除那个元素,递归调用本方法;
c. 如果只剩下一个元素则输出其对应的字符串;
4. 所有的结合已经得到了。
从上面的复杂度看,应该是比原来网上的方法好一些,欢迎大家踊跃拍砖!
相关文章推荐
- 一道算法题——合并有交集的集合
- vector set_union() /set_intersection【集合合并/交集】
- 多个集合合并成没有交集的集合-实现
- Lucene 合并倒排表算法之交集
- 数据结构学习笔记<二> 算法2.1的具体实现,合并集合A,B
- 【算法题集锦之二】--多个集合求交集
- 多个集合合并成没有交集的集合
- 合并有交集的集合
- 以单链表存储的两个集合求交集的算法
- A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- 转:A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- 给定一系列字符串集合,合并有交集的集合,合并完后集合之间无交集
- 两集合求交集的算法比较(转)
- STL 算法vector/set集合-交集,并集,差集,对称差
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- A,B两个整数集合,设计一个算法求他们的交集
- 用C++标准库算法求两个集合的交集、并集、差集
- 每日一道算法题:Google 2009年某笔试题:求出元素位于0到9之间的集合A中大于某个给定正整数K的组成的最小正整数。
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。