繁体   English   中英

C中n个数组的交集算法

[英]Algorithm for intersection of n arrays in C

我需要编写一个函数,该函数返回在每次迭代中为查询数组生成的所有数组的交集(AND condition)

如果我的查询是通过以下方式给出的: query[] = {"num>20", "avg==5", "deviation != 0.5"}那么, n0运行到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* 这是最佳解决方案还是最佳方法?

这非常有效,但实施起来可能很烦人(还没有尝试过)。

  1. 确定shortest数组。 使用 C 的好处是,如果您不知道它们的长度,您可以使用指向数组的指针来确定它们是否按顺序放置在内存中。
  2. 做一个<entry,boolean>map中的条目shortest 我们知道大小,如果有的话,它只会在接下来的步骤中下降。
  3. 遍历一个数组。 首先将整个map初始化为 false。 对于每个条目,请在map检查它。
  4. 遍历map删除所有未检查的条目。 将所有值设置为 false。
  5. 如果还有任何新数组,请使用新数组返回到步骤3
  6. 结果是最终map中的键。

看起来很多,但我们不必求助于任何高度复杂的措施。 良好性能的关键是使用哈希映射,因为访问时间恒定。

或者:

使map成为<entry,int> 通过这种方式,您可以计算所有重复次数,而不必在每次迭代时重新设置,这会增加复杂性。

最后只需将数组的数量与map的值进行比较。 那些匹配的就是您的解决方案。

复杂:

看起来像 O(n)。

  1. 首先,我会按升序对数组进行排序,更容易执行任务
  2. 您还可以对数组进行零填充,以便所有数组的大小相同

[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM