C中n个数组的交集算法

时间:2016-05-05 10:22:43

标签: c arrays algorithm

我需要编写一个函数,它返回每次迭代中为查询数组生成的所有数组的交集(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*中。这是最佳解决方案还是最佳方法?

3 个答案:

答案 0 :(得分:4)

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

  1. 确定shortest数组。使用C的好处是,如果你不知道它们的长度,你可以使用指向数组的指针来判断它们是否按顺序放在内存中。
  2. <entry,boolean>中的条目设置map哈希shortest。我们知道尺寸,如果有的话,它只会在接下来的步骤中发生。
  3. 遍历数组。首先将整个map启动为false。对于每个条目,请在map
  4. 中查看
  5. 通过map迭代删除所有未经检查的条目。将所有值设置为false。
  6. 如果还有新数组,请返回步骤 3。并使用新数组。
  7. 结果是最终map中的键。
  8. 它看起来很多,但我们不必诉诸任何高度复杂的措施。良好性能的关键是使用哈希映射,因为访问时间不断。

    <强>可替换地:

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

    最后,只需将数组的数量与map中的值进行比较即可。那些匹配的是你的解决方案。

    <强>复杂度:

    好像是O(n)。

答案 1 :(得分:0)

  1. 首先,我会按升序对数组进行排序,以便更轻松地执行任务
  2. 你也可以填零数组,这样所有的数组都应该是相同的大小
  3. [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;
}