zoukankan      html  css  js  c++  java
  • 高性能的数据压缩库libzling-20160105

    libzling(https://github.com/richox/libzling,求观看[watch],求星[star],求叉[fork])是一款高性能的数据压缩库,参见原贴:http://www.cnblogs.com/richselian/p/3626287.html

    本次更新加入了一个简化过的MTF(move-to-front)模块,使得整体压缩比已经接近bzip2,而压缩和解压速度仍大幅领先gzip。

    MTF的一般实现如下:

    def MTF_encode(queue, c):
        p = queue.find(c)
        queue[1 : p+1] = queue[0 : p]
        queue[0] = c
        return p
    
    def MTF_decode(queue, p):
        c = queue[p]
        queue[1 : p+1] = queue[0 : p]
        queue[0] = c
        return c
    

    一般实现的MTF算法在编码、解码时都需要O(n)复杂度,降低了算法速度,特别是对解压速度有严重影响。在libzling的实现中,我们不进行整个队列的移动操作,而是只将当前字符与前方某个字符交换位置,这样在编码时仍需要O(n)复杂度(可通过建索引降至O(1),但对整体性能提升不大),而解码时只需要O(1),使得本次改进大幅提升了压缩率,但并没有降低整体压缩速度。

    改进后的MTF算法实现如下:

    def MTF_encode(queue, c):
        p = queue.find(c)
        swap(queue[p], queue[mtf_next_pos[p]])
        return p
    
    def MTF_decode(queue, p):
        c = queue[p]
        swap(queue[p], queue[mtf_next_pos[p]])
        return c
    

    改进后大幅提升了速度,同时通过定制的mtf_next_pos函数,可以得到比传统MTF更好的压缩比,定制的mtf_next_pos函数如下:

    def MTF_next_pos(p):
        if p < 128:
            return int(p * 0.9)
        return p/2
    

    同时一个对MTF的改进是对队列初值进行定制,传统的MTF队列初始化是简单的queue[i]=i,这使得刚开始编码的时候(特别是高阶)MTF模型准确率较低。libzling中MTF的初值采用统计方法确定,即统计每个字符在输入数据中出现的频率,频率高的在前。这样使得刚开始编码的时候MTF模型也能保证较高的准确率。

  • 相关阅读:
    1301班 github安装及账户注册
    对于软件工程课程的疑问
    LeetCode50:Pow
    LeetCode49:字母异位词分组
    LeetCode46:全排列
    LeetCode38:外观数列
    LeetCode:有效的数独
    LeetCode34:在排序数组中查找元素的第一个位置和最后一个位置
    LeetCode33:搜索旋转排序数组
    LeetCode29:两数相除
  • 原文地址:https://www.cnblogs.com/richselian/p/5106467.html
Copyright © 2011-2022 走看看