【发布时间】:2015-09-09 08:57:20
【问题描述】:
我的问题如下
我有一组K元素
该集合的每个子集都由 std::bitset 的一个实例表示(位 i 为真 = 子集中有元素 i)
我有一个输入子集 I,以及一个子集列表 S1...Sn
我想从 S1...Sn 中返回项目,使得 Si 包含在 I 中。(也就是说,每次 Si 有一点为真,它也必须在 I 中为真)
显然这可以在 K*n 中完成,方法是独立地对每个 S 子集进行相同的检查。
但是,有没有一种通用的方法可以做得更好?我很确定这是可能的,因为在我的情况下,子集列表 S1...Sn 总是相同的并且可以进行预处理。 我确信可以将子集存储在特定的数据结构(树?trie?)中,这样我就可以一次性丢弃很多相同的东西,等等
example :
K = 5
I = [1,1,0,1,0]
S1 = [1,0,0,0,0]
S2 = [1,1,0,1,0]
S3 = [1,1,1,0,0]
the ouput should return S1,S2 (not S3!)
我有一个常量集 S1,S2,...,Sn,并在同一集上运行 I 的不同查询。
编辑: 我在说什么的例子: 例如,如果 S1 包含在 S2 中:检查 S1 是否包含在 I 中:如果没有,则 S2 不能包含在 I 中(无需检查) 如果 S3 是 S1 和 S2 的并集:如果 S1 和 S2 包含在 I 中,那么 S3 也是如此
【问题讨论】:
-
不确定我是否关注
I want to return the items from S1...Sn, such that Si is included in I.,如果它与我有任何共同点,你想返回 Si 吗?正式地,您在寻找{S_i | S_i [intersection] I != {} }吗?也许添加一个例子会澄清你到底在追求什么。 -
知道了,还有关于集合
S1,..,Sn任何排序顺序的知识吗?否则,您的O(K*n)基本上是线性时间,我认为如果不实际读取所有输入就不可能做到这一点,除非您可以使用一些命令。 (如果你有常量集 S1,...,Sn 和I不断变化,你也许可以改进它) -
子集是否有序?
S2, S3是否会被视为您的示例的有效输出? -
子集 S1...Sn 没有特定的顺序。当我谈论比线性时间更好时,我排除了处理初始集合和构建数据结构(一劳永逸)所需的时间,我正在考虑运行算法时的复杂性和不同的 I,和相同的 S1...Sn
-
所以你正在寻找
{S_i with (S_i & (~I)) == 0}。 (&位与和~位非)。
标签: c++ algorithm stl complexity-theory