【发布时间】:2018-09-30 04:33:55
【问题描述】:
给定集合N = {1,...,n},考虑P 的不同预先存在的N 子集。子集S_p 的特征在于 0-1 n 向量 x_p 其中 ith 元素是 0 或 1,具体取决于 ith(n)项是否属于子集与否。让我们称之为x_ps 指标向量。
例如,如果N={1,2,3,4,5},则子集{1,2,5}由向量(1,0,0,1,1)表示。
现在,给定 P 预先存在的子集及其关联向量 x_ps。
计算由向量y表示的候选子集。
检查y 是否已经是P 预先存在的子集的一部分或者y 是否确实是一个新的子集而不是P 子集的一部分的最有效方法是什么?
以下是我能想到的方法:
(方法1)基本上,我们必须对所有预先存在的集合进行逐个元素的检查。伪代码如下:
for(int p = 0; p < P; p++){
//(check if x_p == y by doing an element by element comparison)
int i;
for(i = 0; i < n; i++){
if(x_pi != y_i){
i = 999999;
}
}
if(i < 999999)
return that y is pre-existing
}
return that y is new
(方法 2)想到的另一个想法是存储指标向量 x_ps 的十进制等效值(其中指标向量被视为二进制表示)并将其与 y 的十进制等效值进行比较.也就是说,如果一组P 预先存在的集合是:{ (0,1,0,0,1), (1,0,1,1,0) },则该集合的存储小数将为{9, 22}。如果y 是(0,1,1,0,0),我们计算12 并对照集合{9, 22} 进行检查。这种方法的好处是,对于每个新的y,我们不必检查每个预先存在的集合的n 元素。我们可以只比较十进制数。
问题1。在我看来(方法2)应该比(方法1)更有效。对于(方法2),是否有一种有效的方法(C/C++ 中的内置库函数)将x_ps 和y 从二进制转换为十进制?这些指标变量的数据类型应该是什么?例如,bool y[5]; 或 char y[5];?
问题2.有没有比(方法2)更有效的方法?
【问题讨论】:
-
n的最大值是多少? -
看看Bloom filter 是否有帮助。
-
@user3386109 高达 1000
-
如果
n是 1000,那么十进制等价物是 1000 位数字。所以是一个由 16 个 64 位数字或 32 个 32 位数字组成的数组。 -
哦,还不错。在 C++ 中,您可以将
x_p向量转换为strings 并将字符串存储在std::set中。