[英]Efficient algorithm to produce the n-way intersection of sorted arrays in C
[英]Algorithm for intersection of n arrays in C
我需要编写一个函数,该函数返回在每次迭代中为查询数组生成的所有数组的交集(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*
。 这是最佳解决方案还是最佳方法?
这非常有效,但实施起来可能很烦人(还没有尝试过)。
shortest
数组。 使用 C 的好处是,如果您不知道它们的长度,您可以使用指向数组的指针来确定它们是否按顺序放置在内存中。<entry,boolean>
散map
中的条目shortest
。 我们知道大小,如果有的话,它只会在接下来的步骤中下降。map
初始化为 false。 对于每个条目,请在map
检查它。map
删除所有未检查的条目。 将所有值设置为 false。map
中的键。看起来很多,但我们不必求助于任何高度复杂的措施。 良好性能的关键是使用哈希映射,因为访问时间恒定。
或者:
使map
成为<entry,int>
。 通过这种方式,您可以计算所有重复次数,而不必在每次迭代时重新设置,这会增加复杂性。
最后只需将数组的数量与map
的值进行比较。 那些匹配的就是您的解决方案。
复杂:
看起来像 O(n)。
[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 运行时间来享受
这是@ZbyszekKr 解决方案的 Jquery 实现 -
我有$indexes
作为英文字母中所有字符的数组数组,用于存储哪些字符出现在哪些行中。 $chars
是我试图在 HTML 表格行中过滤的字符字符串数组。 当表中有超过 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.