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. Spring 通知

    1. AspectJ 支持 5 种类型的通知注解:  @Before: 前置通知, 在方法执行之前执行 @After: 后置通知, 在方法执行之后执行 @AfterRunning: 返回通知, 在方法 ...

  2. [label][JavaScript][The Defined Guide of JavaScript] 如何声明变量

    因为觉得我自己的JavaScript基础很不扎实,或者可以说根本就没有所谓基础,所以就最近一直在看<The Defined Guide of JavaScript> . 在一边看的同时,我 ...

  3. Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用

    一.gitHub地址及介绍 https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh android-Ultra-Pull-To-Refre ...

  4. delphi FastReport 安装方法

    (最近记忆力真的不行了,装了很多遍,过段时间重装delphi又不记得了,又要折腾,现在先记录下来,留给下次翻) 1.下载安装包,这里提供一个百度云盘共享链接,版本为fastreport5: https ...

  5. MYC编译器源码分析之程序入口

    前文.NET框架源码解读之MYC编译器讲了MyC编译器的架构,整个编译器是用C#语言写的,上图列出了MyC编译器编译一个C源文件的过程,编译主路径如下: 首先是入口Main函数用来解析命令行参数,读取 ...

  6. pipeline构建时报错问题解决

    问题: 1.No such field found: field java.lang.String sh. Administrators can decide whether to approve o ...

  7. C++并发多线程(一)

    并发:两个或者更多的任务同时发生,一个程序同时执行多个独立的任务. 以往计算机 单核CPU 某一个时刻只能执行一个任务 由操作系统调度 每秒钟进行多次所谓的任务切换并发的假象(不是真正的并发),这种切 ...

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

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

  9. My Site Cleanup Job

    解决办法: The My Site of Linda Wang ??? is scheduled for deletion in 3 days. As their manager you are no ...

  10. mysql--MySQL数据库的简单认识

    一.MySQL介绍 1.mysql版本 双授权版本:社区版(完全免费,功能也够nb了)和商业版(更好,功能更多更强大一些,但是收费,VIP,有售后服务,也会参考和吸收社区版的一些nb的功能,安全性和稳 ...