Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 子集计数算法_Algorithm_Set_Tuples - Fatal编程技术网

Algorithm 子集计数算法

Algorithm 子集计数算法,algorithm,set,tuples,Algorithm,Set,Tuples,我有一个问题需要有效地解决。我得到了一组布尔值的k元组,其中我预先知道每个k元组中每个值的一部分是真的。例如,我可能有以下4个元组,其中每个元组至少有60%的布尔值设置为true: (1, 0, 1, 0) (1, 1, 0, 1) (0, 0, 1, 0) 我感兴趣的是寻找具有特定属性的索引集:如果我在指定索引处查看元组中的每个值,至少这些元组的给定部分具有相应的位集。例如,在上面的4元组集合中,我可以考虑集合{0 },因为如果你看上面每个元组的零元素,它们中的三分之二是1,而2/3 ~=

我有一个问题需要有效地解决。我得到了一组布尔值的k元组,其中我预先知道每个k元组中每个值的一部分是真的。例如,我可能有以下4个元组,其中每个元组至少有60%的布尔值设置为true:

(1, 0, 1, 0)
(1, 1, 0, 1)
(0, 0, 1, 0)
我感兴趣的是寻找具有特定属性的索引集:如果我在指定索引处查看元组中的每个值,至少这些元组的给定部分具有相应的位集。例如,在上面的4元组集合中,我可以考虑集合{0 },因为如果你看上面每个元组的零元素,它们中的三分之二是1,而2/3 ~= 66%>60%。出于同样的原因,我也可以考虑SET { 2 }。然而,我不能考虑{ 1 },因为在索引1中只有三分之一的元组具有1和1/3小于60%。类似地,我不能使用{0,2}作为一个集合,因为至少60%的元组的位0和位2都是集合,这是不正确的

我的目标是找到此属性适用的所有集合。有人有解决这个问题的好算法吗


谢谢。

制作一个整数的k向量,描述每个索引的传递次数。在集合中循环,每个元素增加传递的k向量


然后计算出集合的基数(在单独的循环中,或在上面的循环中)。然后循环遍历计数向量,并根据您的标准发出一个通过/失败向量。

正如您所写的,可以假设体系结构是x86_64,并且您正在寻找实现性能,导致渐进复杂性(因为它不属于线性-根据问题的定义;),我建议以下算法(类似C++的伪代码):

/*N=16->int16;N=8->int8等。根据输入大小选择N。(可能N=24;)*/
计数发生次数(向量t、向量和结果计数器){
intN计数器[2^N]={};
//首先,计算位组合
每个_(v in t)
++计数器[v];
//其次,使用聚合数据统计位的出现次数

对于(column=0;columntry-No,这是一个非常复杂的问题。然而,它似乎没有经过很好的思考。对于单个{Pass,Fail}值向量,可能更容易求解,然后扩展到这些值集;扩展部分的表述很糟糕。对我来说,问题描述很清楚:).Sergey-对体系结构有什么要求吗?我觉得单cpu解决这个问题可能不同于GPGPU解决方案。@templatetypedef哇!谢谢你重新格式化这个问题。难以置信!!!
/* N=16 -> int16; N=8 -> int8 etc. Select N according to input sizes. (maybe N=24 ;) ) */
count_occurences_intN(vector<intN> t, vector<long> &result_counters){
   intN counters[2^N]={};
   //first, count bit combinations
   for_each(v in t)
       ++counters[v];
   //second, count bit occurrences, using aggregated data 
   for(column=0; column<N; ++column){
      mask = 1 << column;
      long *result_counter_ptr = &(result_counters[column]);
      for(v=0; v<2^16; ++v)
         if( v & mask )
            ++(*result_counter_ptr);
   }
}