您的位置:首页 > 其它

规则匹配引擎——思路2

2011-11-26 22:58 169 查看
上篇分析到想通过运用规则间关系来尽量减少比较次数,然后初步得出的结果是比较乱,然后呢?

不能因为乱,这条路就不走了,规则间的关系是很好的信息可供利用,那问题就是,为什么运用这关系会比较乱?有没有不乱的情况?

我们可以很容易的想到如下两条规则,保证不乱:

1, {'price': '0<x<50'}
2, {'price': '50<x<150'}


对于这两条规则,当满足任何一个,另一个肯定不满足,原因是因为这两条规则的范围是相异的。想到这里,那之前规则乱的原因也找出来了:规则范围有重叠!

我们把之前的三条规则,连同上述两个规则的2作为规则4,放在同一个数轴上来看他们的范围:

-------50----75----------------150------
1.         --------------------------------
2.                                 --------
3. --------------
4.         ------------------------



从这个数轴可以直观的看出规则间的重合的范围,凡是落在两个规则重合范围内的数据,在匹配到1条规则的一个边界的时候,总是需要去判断是否满足另一条规则的另一个边界(包含关系中只要能匹配较小的范围规则,较大的范围规则一定能满足,但是由于不好确定哪个较小的范围需要被先匹配,因此若先匹配大的范围,被包含的小范围仍需被匹配两个端点,因此计算量扯平了)。

由此我们得出一个最简单的认识:相异好,重叠坏!

假定在一个没有重合范围的规则集合,规则范围会是这样的:

---10---20---30---40---50---60------>
1.  -----
2.        -----
3.                --------------


当一个规则被匹配到,其他的规则都是不能被匹配的,忠诚的都让我感动了。

而且而且,对于放在数轴上的这些范围段,难道我们还需要一个一个的匹配么?难道我们还想不到一种方法叫做2分查找么!这个如此简单而又强大的算法,蕴含的是信息论世界的基石,用抽象而又具体的话来说,就是一个蛋糕一切两份,要想自己不吃亏,那就切均匀。至此,规则匹配的问题,我们可以变成了通过二分查找数据所属的范围问题,O(N)和O(Log2N)的差异我不用解释了。

但是,我们还有个问题遗留着没有解决。我们上述的乐观,来源于我们的假定“在一个没有重合范围的规则集合中”,可这明显又是不可能的,我们的4条规则明显是不相异的。

但是,肯定是不可能的么?我们能不能让不可能变可能呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: