规则匹配引擎——思路2

上篇分析到想通过运用规则间关系来尽量减少比较次数,然后初步得出的结果是比较乱,然后呢?

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

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

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条规则明显是不相异的。

但是,肯定是不可能的么?我们能不能让不可能变可能呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值