改进匹配算法

时间:2014-07-19 14:08:23

标签: algorithm math logic

给出结果,我需要与表格进行匹配,考虑优先级,假设如下表:

+---+---+
| A | B |
+---+---+
|  1|  1|
+---+---+
|  1|  0|
+---+---+
|  0|  1|
+---+---+

给两行结果集合:

[[A => 1, B => 1], [A => 0, B => 1]]

[[A => 0, B => 1], [A => 1, B => 1]]

匹配的结果是[A => 1, B => 1],因为它是与表的第一项匹配的结果。

我找到的唯一方法是:

getMatchingResult (result) {
    first = null;
    second = null;
    third = null;

    //fill each case if exists
    foreach (result as r) {

       if (r.A && r.B) {
            first = r;
       }

       if (r.A && !r.B) {
            second = r;
       }

       if (!r.A && r.B) {
            third = r;
       }

    }

    //handle priority
    if (first)
        return first;
    else if (second)
        return second
    else if (third)
        return third;

    return false; 
}

getMatchingResult([[A => 0, B => 1], [A => 1, B => 1]]);
// [A => 1, B => 1]

getMatchingResult([[A => 1, B => 1], [A => 0, B => 1]]);
// [A => 1, B => 1]

有没有更好的方法呢?或者是否有一些算法可以解决这些类型的问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果r.A和r.B的值是布尔值,那么你可以改善逻辑。但是,如果r.A和r.B的域具有更多值并且表可以增长,则对具有最小索引(=最高优先级)的对的顺序搜索需要许多比较。确实有办法改善这一点。

考虑

class Pair { int a; int b; ... }
Map<Pair,Integer> pair2rank;

这里,地图提供了一对返回表中排名的值的查找。该地图最初是从该表格准备的。然后循环变为

int rank = pair2rank.size(); // bigger than any rank 0, 1,...
foreach (Pair p: results) {
    int rp = pair2rank.get( p );
    if( rp < rank ) rank = rp;
}
// rank contains the smallest table index