【问题标题】:Improving Matching Algorithm改进匹配算法
【发布时间】:2025-12-10 02:40:01
【问题描述】:

给出一个结果,我需要和表做一个匹配,考虑优先级,假设如下表:

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

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

谢谢!

【问题讨论】:

  • 在第一次迭代期间,如果匹配或不匹配,该算法将终止。我看不到“优先级”是如何处理的。 - 此外,不清楚什么应该与结果集合行中的那么多 A 和 B 匹配。请澄清一下。
  • 感谢@laune 的帮助,我修正了我的错误逻辑
  • [[A => 1, B => 1], [A => 0], [B => 1]] - 这对于 r.A 和 r.B 意味着什么?我不明白最后 4 行应该是什么意思。
  • @laune 我更新了代码 [[A => 0, B => 1], [A => 1, B => 1]] 我们可以将其视为一个对象数组,所以第一个是 r1.A = 0,r1.B = 0,第二个是 r2.A = 1 和 r2.B = 1,所以我们有一个对象数组 [r1, r2] 现在可以了吗?谢谢!

标签: algorithm math logic


【解决方案1】:

如果 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

【讨论】: