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模型也能保证较高的准确率。

高性能的数据压缩库libzling-20160105的更多相关文章

  1. 高性能的数据压缩库libzling

    libzling(https://github.com/richox/libzling)是一款高性能的数据压缩库,在压缩时间和压缩率上都超过了流行的zlib/gzip.libzling使用的是ROLZ ...

  2. 高性能的数据压缩库libzling-20140324

    libzling(https://github.com/richox/libzling,求观看[watch],求星[star],求叉[fork])是一款高性能的数据压缩库,在压缩时间和压缩率上都超过了 ...

  3. 基于async/non-blocking高性能redis组件库BeetleX.Redis

    BeetleX.Redis是基于async/non-blocking模式实现的高性能redis组件库,组件支持redis基础指令集,并封装更简便的List,Hashset和Subscribe操作.除了 ...

  4. 深入 Go 中各个高性能 JSON 解析库

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/535 其实本来我是没打算去看 JSON 库的性能问题的,但是最近我对 ...

  5. 高性能的JavaScript库---Lodash

    上周在仿做Nodejs社区的时候,遇到了lodash这个javascript库,很惭愧,那也是我第一次听说lodash.人嘛,对于新鲜的事物总是会或多或少感到些好奇的,于是就毫不犹豫地去lodash官 ...

  6. 高性能 Java 缓存库 — Caffeine

    http://www.baeldung.com/java-caching-caffeine 作者:baeldung 译者:oopsguy.com 1.介绍 在本文中,我们来看看 Caffeine - ...

  7. 发布一个参考tornado的高性能c++网络库:libtnet

    libtnet是一个用c++编写的高性能网络库,它在设计上面主要参考tornado,为服务端网络编程提供简洁而高效的接口,非常易于使用. Echo Server void onConnEvent(co ...

  8. 【ZeroMQ】2、高性能的通讯库-zeroMQ

    首先,让我来介绍一下什么是ZMQ(全称:ZeroMQ): 官方: “ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加 ...

  9. 超轻量级、高性能C日志库--EasyLogger

    [ 声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:armink.ztl@gmail.com] EasyLogger 1. 介绍 EasyLogger 是一款超轻量级(ROM<1.6K, ...

随机推荐

  1. linux每天一小步---cat命令详解

    1 命令功能 cat命令是linux系统下的一个文本输出命令,通常用于查看文件的内容. 2 命令语法 cat  [选项参数]  文件名 3 命令参数 -n  由1开始对所有输出的内容行数编号 -b   ...

  2. (二分搜索 数论)(求阶乘里零个数对应的阶乘)light oj -- 1138

    链接 Description You task is to find minimal natural number N, so that N! contains exactly Q zeroes on ...

  3. 解决idea gradle构建Received fatal alert: handshake_failure问题

    Gradle是一款强大的构建工具,但是搭建项目运行环境总是非常头痛,各种网络原因会导致项目不能成功的导入. 说一下这个问题的解决办法,折腾了很久终于解决了. javax.net.ssl.SSLHand ...

  4. SQL -- What Tables Queries are Used to Display the Counts in the Inventory Account Periods form (INVTTGPM.fmb) (Doc ID ID 357997.1)

    Applies to: Oracle Inventory Management - Version 11.5.9 to 12.1.3 [Release 11.5 to 12.1] Informatio ...

  5. [C#学习笔记]C#中的decimal类型——《CLR via C#》

    System.Decimal是非常特殊的类型.在CLR中,Decimal类型不是基元类型.这就意味着CLR没有知道如何处理Decimal的IL指令. 在文档中查看Decimal类型,可以看到它提供了一 ...

  6. EF一对多的表,模糊查询2个表的数据!

    如用户表和电话表,要求搜索时可以模糊查询姓名和号码.都可以找到包含该字符的所有用户. /// <summary> /// 模糊查询姓名和电话号码,并按姓名排序返回 /// </sum ...

  7. Java_IO流输入输出

    第三章 输入输出 一.I/O Input/Output 二.File 用途:对文件和目录进行常规操作(除文件读写操作外). 方法:exists():判断文件或目录是否存在 isFile():判断是否是 ...

  8. kali linux之无线渗透

    无线技术变化大,难度大,既新鲜刺激,又压力山大.一半协议  一半理论 无线技术特点: 行业发展迅猛 互联网的重要入口 边界模糊 安全实施缺失而且困难 对技术不了解造成配置不当 企业网络私自接入ap破坏 ...

  9. IIS7的网站通过https访问提示ssl_error_rx_record_too_long

    IIS7的网站通过https访问,提示ssl_error_rx_record_too_long,如下图所示: 解决办法: 一.导入服务器的SSL证书至IIS 1.打开IIS,找到服务器证书 2.导入本 ...

  10. acedSSGet 翻译

    ObjectARX 参考指南 > 全局函数 > AcEd 全局函数 > acedSSGet 函数 acedSSGet 折叠全部 C++ int acedSSGet( const AC ...