2014-04-16 22 views
1

我想找出匹配3個屬性的匹配算法,我想不出有效的解決方案。這裏是我的算法如何在多個值上進行有效匹配

的僞代碼算法執行以下操作:

  • 檢查是否有第一標準相匹配。
  • 如果第一條標準匹配,我嘗試根據其他標準縮小匹配範圍。
  • 如果第一個標準沒有匹配,則嘗試 在第二個標準上進行匹配。
  • 如果 第二條標準匹配,那麼我會嘗試根據最後一條標準 縮小匹配範圍。
  • 等...

看起來這只是算法重演,如果我添加另一個值相匹配,那麼該算法快速增長非常大的現實。

//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 
} 

有沒有更好的方法來做到這一點?看起來好像

+0

@MitchWheat如果我合併結果,那麼我就不會得到最收窄的結果可能。我會得到一個大的結果集,其中包含近距離和窄距的匹配。該算法試圖獲得最接近的匹配。 – user2158382

+0

如果列表具有驗證標準X的值,向列表添加新值會使標準X失效? –

回答

1

這是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; 
} 

例子

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 
+0

大小爲n的輸入列表的時間複雜度是多少? –

+0

'O(n * c^2)',其中'n'是數組的長度,'c'是條件的長度。你不能做得更好,因爲你必須在最壞的情況下至少應用'n * c(c-1)/ 2'次。 –