我需要编写一个函数,它返回每次迭代中为查询数组生成的所有数组的交集(AND condition)
。
如果我的查询是:query[] = {"num>20", "avg==5", "deviation != 0.5"}
,则n
从0
运行到length of query
。查询被传递给函数(get_sample_ids
),该函数将条件与拥有某些信息的样本列表进行比较。从get_sample_ids
返回的数组编号是相应样本的索引。
query[] = {"num>20", "avg==5", "deviation != 0.5"}
int intersected_array*;
for n=0:query.length-1
int arr* = get_sample_ids(query[n]);
// n=0: [1, 7, 4, 2, 6]
// n=1: [3, 6, 2]
// n=2: [6, 2]
end;
Expected output: intersected_array* = [6, 2]
我编写了一个包含2个数组(arr*
,temp*
)的实现。对于迭代中返回的每个数组,它首先存储在temp*
数组中,arr*
和temp*
的交集存储在arr*
中。这是最佳解决方案还是最佳方法?
答案 0 :(得分:4)
这非常有效,但实施起来可能很烦人(没有尝试过)。
shortest
数组。使用C的好处是,如果你不知道它们的长度,你可以使用指向数组的指针来判断它们是否按顺序放在内存中。<entry,boolean>
中的条目设置map
哈希shortest
。我们知道尺寸,如果有的话,它只会在接下来的步骤中发生。map
启动为false。对于每个条目,请在map
。map
迭代删除所有未经检查的条目。将所有值设置为false。map
中的键。它看起来很多,但我们不必诉诸任何高度复杂的措施。良好性能的关键是使用哈希映射,因为访问时间不断。
<强>可替换地:强>
让map
成为<entry,int>
。通过这种方式,您可以计算所有重复次数,并且不必在每次迭代时重置它,这会增加复杂性。
最后,只需将数组的数量与map
中的值进行比较即可。那些匹配的是你的解决方案。
<强>复杂度:强>
好像是O(n)。
答案 1 :(得分:0)
[1,2,0,4,0,0,6,7]
[0,2,3,4,0,0,6,7]
[0,2,0,0,0,0,6,0]
像矩阵一样,您可以轻松找到交叉点
这一切都需要大量的PC运行时间 享受
答案 2 :(得分:0)
这是@ZbyszekKr解决方案的Jquery实现 -
我有$indexes
作为英文字母表中所有字符的数组数组,它存储哪些字符存在于哪些行中。 $chars
是我试图在HTML表格行中过滤的char字符串数组。当表中有超过5000行时,下面的方法是用户输入过滤行的较大方案的一部分。
PS - 有一些明显的冗余,但这些是我正在制作的插件所必需的。
function intersection($indexes, $chars){
map = {};
$minLength = Number.MAX_SAFE_INTEGER; $minIdx = 0;
//get shortest array
$.each($chars, function(key, c){
$index = getDiffInNum(c, $initialChar);
$len = $indexes[$index].rows.length;
if($len < $minLength){
$minLength = $len;
$minIdx = $index;
}
});
//put that array values in map
$minCount = 1;
$.each($indexes[$minIdx].rows, function(key, val){
map[val] = $minCount;
});
//iterate through other arrays to figure out count of element
$.each($chars, function(key, c){
$index = getDiffInNum(c, $initialChar);
if($index != $minIdx){
$array = $indexes[$index].rows;
$.each($array, function(key, val){
if(val in map){
map[val] = map[val] + 1;
}
});
$.each(map, function(key, val){
if(val == $minCount){
delete map[key];
}
});
$minCount++;
}
});
//get the elements which belong in intersection
$intersect = new Array();
$.each(map, function(key, val){
if(val == $chars.length){
$intersect.push(parseInt(key));
}
});
return $intersect;
}