Set 两个集合的并集/交集,其中每个集合由它定义';s子集

Set 两个集合的并集/交集,其中每个集合由它定义';s子集,set,Set,我们从其他集合的并集知道每个集合的定义 比如说 A=B并集{1,2} B=C接头D C={5,6} D={5,7} E={4} 然后A={1,2,5,6,7} 并E={1,2,4,5,6,7} 有任何有效的算法可以做到这一点。假设联合的层次结构可以非常深入,并且子集可以经常改变(没有那么多)。 我认为应该有办法尽量减少必须创建的联合的数量。也许您正在寻找某种数据结构?关于此案例的几个问题 第一个问题:这个“脚本”/“程序”必须运行多长时间?如果时间不太长,在执行联合操作之前简单地存储以前的联合并

我们从其他集合的并集知道每个集合的定义

比如说

A=B并集{1,2}

B=C接头D

C={5,6}

D={5,7}

E={4}

然后A={1,2,5,6,7}

并E={1,2,4,5,6,7}

有任何有效的算法可以做到这一点。假设联合的层次结构可以非常深入,并且子集可以经常改变(没有那么多)。
我认为应该有办法尽量减少必须创建的联合的数量。

也许您正在寻找某种数据结构?

关于此案例的几个问题

第一个问题:这个“脚本”/“程序”必须运行多长时间?如果时间不太长,在执行联合操作之前简单地存储以前的联合并检查缓存可能是一个不错的选择。如今内存并没有那么贵:)


你们应该问的第二个问题是:元素在联合之前是按一定顺序排列的吗?如果没有,并且一个列表被多次访问,那么首先对列表进行排序是非常有用的(例如,当您只访问了列表的一半时,您就可以做出决定)。是一种有效连接两个有序列表的强大技术。

那么你有一个不变的变化集并集层次结构?就像你的例子一样,你只对一个集合的值感兴趣

然后将层次结构展平。也就是说,在您的示例中,您将遍历层次结构,找到您的集合是其并集的更改集合集,并存储该集合


为了避免在叶集更改时重新计算联合,可以跟踪每个元素当前包含的集合数。如果某个叶集发生了更改,则可以快速更新,而不需要查看任何未更改的叶集。然后,那些频率计数大于0的元素当前在并集中。

如果B是C并集D,那么它的{5,6,7},A是{1,2,5,6,7},但内存不会以指数方式增长到层次结构的深度?扁平层次结构是叶集的集合。因此,其大小与不同叶组的数量成线性关系。如果集合都是不同的,并且层次结构是一棵平衡树,那么它的高度将是指数级的。