Algorithm 如何有效匹配多个值

Algorithm 如何有效匹配多个值,algorithm,search,pattern-matching,computer-science,Algorithm,Search,Pattern Matching,Computer Science,我正试图想出一个匹配3个属性的匹配算法,但我想不出一个有效的解决方案。这是我的算法的伪代码 该算法执行以下操作: 检查第一个条件是否匹配 如果在第一个标准上有匹配,那么我尝试根据其他2个标准缩小匹配范围 标准 如果第一个条件不匹配,则尝试 在第二个条件上进行匹配 如果街上有火柴 第二个标准,然后我尝试根据 最后一个标准 等等 看起来这个算法只是重复它自己,如果我添加另一个值来匹配,那么这个算法会快速增长 //try to match on criteria 1 if results exis

我正试图想出一个匹配3个属性的匹配算法,但我想不出一个有效的解决方案。这是我的算法的伪代码

该算法执行以下操作:

  • 检查第一个条件是否匹配
  • 如果在第一个标准上有匹配,那么我尝试根据其他2个标准缩小匹配范围 标准
  • 如果第一个条件不匹配,则尝试 在第二个条件上进行匹配
  • 如果街上有火柴 第二个标准,然后我尝试根据 最后一个标准
  • 等等
看起来这个算法只是重复它自己,如果我添加另一个值来匹配,那么这个算法会快速增长

//try to match on criteria 1
if results exist for match on criteria 1 {
    //try to match on criteria 1 & 2
    if results exist for match on criteria 1 & 2 {
        //try to match on criteria 3
        if result exist for match on criteria 1,2,3 {
            return results for match on 1,2,3
        }
        else
            return results for match on 1,2
    }
    else
        return results for match on 1
}
//try to match on criteria 2
else if results exist for match on criteria 2 {
    //try to match on criteria 2 & 3
    if result exist for match on criteria 2,3 {
        return results for match on 2,3
    }
    else
        return results for match on 2
}
//try to match on criteria 3
else if results exist for match on criteria 3 {
    return results for match on 3
}
else {
    no match
}

有没有更好的办法?如果我理解正确的话,这里有一个Javascript实现

function filter(arr, condition) {
  var retval = [];
  for (i in arr) if (condition(arr[i])) retval.push(arr[i]);
  return retval;
}

function first_match(arr, conditions) {
  if (conditions.length == 0) return("No match");
  var initial_arr = Array.prototype.slice.call(arr);
  var prev_arr;
  var i = 0;
  for (; i < conditions.length && arr.length != 0; i++) {
    prev_arr = Array.prototype.slice.call(arr);
    arr = filter(arr, conditions[i]);
  }
  if (i <= 1 && arr.length == 0) return first_match(initial_arr, Array.prototype.slice.call(conditions, 1));
  else if (i == conditions.length && arr.length != 0) return arr;
  else return prev_arr;
}

@如果我把结果结合起来,那么我就不会得到尽可能小的结果。我将得到一个大的结果集,其中包含紧密匹配和狭义匹配。此算法尝试获得尽可能最接近的匹配。如果列表具有验证条件X的值,则向列表添加新值是否会使条件X无效?大小为n的输入列表的时间复杂度是多少?
O(n*c^2)
,其中
n
是数组的长度,
c
是条件的长度。在最坏的情况下,您必须至少应用
n*c(c-1)/2次
过滤器,因此不能做得更好。
var conditions = [function(x) { return x > 3; },
                  function(x) { return x % 2 == 0; },
                  function(x) { return Math.sqrt(x) % 1 == 0; }];

var example1 = [1,2,3,4,5,6,7,8,9,10];
console.log(first_match(example1, conditions)); // [4] - all three hold
var example2 = [1,2,3,5,6,7,8,9,10];
console.log(first_match(example2, conditions)); // [6, 8, 10] - First two hold
var example3 = [5, 7, 9];
console.log(first_match(example3, conditions)); // [5, 7, 9] - First one holds
var example4 = [-2, 0, 2];
console.log(first_match(example4, conditions)); // [0] - 2 & 3 hold
var example5 = [-2, 2];
console.log(first_match(example5, conditions)); // [-2, 2] - Only 2 holds
var example6 = [1];
console.log(first_match(example6, conditions)); // [1] - Last one holds
var example7 = [-1];
console.log(first_match(example7, conditions)); // "No match" - None hold