有效地找到产生所需集合的集合的交叉点
-
29-09-2020 - |
题
给定集合 $ \ {s_1,s_2,\ dots,s_n \} $ ,查找产生的集合之间的所有“减少”交叉点所需set $ \ {x \} $ 结果。 “缩小”的交叉点被定义为 $ s_i \ cap s_j \ cap \ dots \ cap s_k={x \} $ 的集合之间的交集,例如删除交叉点中的任何一个集合将所需集合 $ \ {x \} $ 的结果改变了结果。
例如,对于集合 $ \ {a,b,c,d,e,f \} $ ,其中:
$ a={c,d,f,g,x \} $ ,
$ b={c,d,g,p,t,x \} $ ,
$ c={e,i,x,y \} $ ,
$ d={a,i,o,p,q,w,x \} $ ,
$ e={f,t,w,x \} $ ,和
$ f={a,b,c,d,e \} $ ,然后:
- $ a \ cap b \ cap e={x \} $ 是一个减少的十字路口,因为 $ a \帽B. = {c,d,g,x \} $ , $ a \ cap e={f,x \} $ ,和 $ b \ cap e={t,x \} $ 。删除任何集合 $ a $ , $ b $ ,或 $ e $ 从交叉口 $ a \帽B \ CAP E $ 产生的结果与所需的SET $ \ {x \} $ 。
- $ c \ cap d \ cap e={x \} $ 不是一个减少的十字路口,因为 $ c \ cap e={x \} $ 。删除集合 $ d $ 从交叉口 $ c \ cap d \ Cap E $ 仍然会产生所需的SET $ \ {x \} $ 结果。
我的问题是:给定集合,什么是最有效的算法,以找到产生所需集合的那些集合之间的所有减少的交叉点?
请注意,所需集是否只有其在其中的单个元素并不重要。在此示例中,我刚刚使用单个元素 $ x $ 为简单起见。
解决方案
您的问题相当于枚举所有包含最小集合封装,解决问题
假设您正在寻找交叉路口的所有集合集的集合 $ t $ 。所有相关集必须包含 $ t $ ,因此您可以考虑包含 $ t $ 的所有集合,从所有这些中删除 $ t $ 。这减少了案例 $ t=imptyset $ 。
现在让 $ u $ 是所有集合的联合。集合集是空IFF,其补充的结合是 $ u $ 。换句话说,如果您补充所有集合,那么您对包含最小的集合封面感兴趣。
不隶属于 cs.stackexchange