2022-04-26 洗澡随笔:把信息论中的Run Length 编码应用到报文匹配算法中

纪第一次自己抢到了麦当劳!

​2022-04-26 洗澡随笔:把信息论中的Run Length 编码应用到报文匹配算法中。

77f92739a32ec2e22c65b719dd09f214.jpg

现有9个位集,所谓位集就是一连串0和1组成的数组,这里是用64位无符号long数组模拟的,目前实现的算法需要做很多次64位与运算,直到找到9个位集上某一位都是1,就停下来做一次更精确的检验,如果确实是匹配的,就可以说完成任务了,否则继续往下做与运算找下一个9个位集都为1的位又做精确检验。

考虑通过聚合位来减少或运算:如果原来(一级)位集上有64个连续位都是0,就在二级位集上用一个0来代替那一级位集上的64个0,但只要一级位集的64位上有一个或多个1,就在二级位集上编码为1。

匹配时先对9个二级位集做或运算,如果9个位不都是1,那么这8次与运算就代替了原来8*64次与运算,但是如果每个二级位集上的位都是1,那么仍要再检查一级位集,需要定位到对应的那64位,按原来的方法进行与运算看有没有都是1的位,如果有就进行精确检查。

那么,如果连续有很多位都是0,就可以大大提高二级位集带来的性能提升。如何量化?在一级位集上求连续有多少个0,然后遇到一串连续1,求接下来有多少个连续1,又求接下来有多少个连续0,… 最后可以得到连续1数和连续0数构成的数组,看这里面的数有多少个是大于等于64的,这样的数越多越好,越大越好,不管对1还是0(不过最好是0)。

其实大于64不一定带来性能提升,因为可能有100个连续0横跨了两个64位,一边是48位,另一边是52位,这样的100位仍然需要检查两次一级位集。所以统计时应该按64位来统计,判断有多少个64位是全0。这才是比较好的可视化统计。

下面才是今天的洗澡随笔本笔:
如果确实有很多连续0,连续1,那么可以用RLE编码这9个位集,每个位集对应一个int数组,假设位集第一位都是0,那么int数组的偶数下标上记录的是连续有多少个0,奇数下标上记录有多少个连续1。
匹配时对9个int数组进行“归并”,这样几乎可以在O(1)内确定下一个需要精确检查的位了!没逻辑与、逻辑或什么事情了!还需要前缀和来辅助,规则插入和删除会很麻烦。

​Dinner time.

5902cc4f97470b628ec1d3570cb584bf.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bugs清道夫

来自清道夫的谢意,susga

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值