压缩算法之Elias Gamma Coding & Elias Delta Coding
Posted by Andrew(justAStriver@gmail.com)
2013-02-24
基本概念
压缩算法一般根据应用场景不同可分为文本压缩和索引压缩,后者是搜索引擎的核心技术之一。压缩的本质是对数据进行重新编码,编码依据是数据的分布特性,一般是概率分布情况,比如对于倒排索引中的数字编号。数值分布一般符合指数分布,均匀分布,Elias Gamma/Delta主要是基于这两种分布的。
压缩模型可分为全局模型,局部模型,局部模型参数可动态调整,算法复杂度高,压缩解压缩速度慢,但压缩率高。在编码方式上可分为定长和变长编码。
Elias Gamma/Elias Delta算法适合小整数使用频率较高的场景。它们都是基于数字分解的算法,都需要使用到下面两种基本的编码方式:
1.一元编码-Unary
主要适合于指数分布的数值分布,对于数字N,一元编码的编码长度为N,使用N-1个二进制1和末尾一个0表示,如数字3的一元编码为:110
2.二进制编码-Binary
主要适合于均匀分布的数值分布,对于数字N的二进制编码,其实就是它在计算机中的实际存储格式。也就是十进制对应的二进制,如3的二进制为11。在二进制编码中,比特宽度会在具体的压缩算法中不一样,比如数字3如果用5个比特宽度则为:00011
Elias Gamma Coding算法过程
1.对于数字x分解成 x=2N + M
2.对于N+1使用一元编码
3.对于M使用比特宽度为N的二进制编码
举例:比如对于数字13,可分解成:13 =23 + 5,即N=3,M=5,则N+1的一元编码为:1110;M的比特宽为3的二进制编码为:101,最后的Elias Gamma Coding为:1110:101.
Elias Delta Coding算法过程
该算法是在Gamma算法基础上的改进,目的是为了对N进一步压缩,可以处理更大的数值。算法过程如下:
1.对于数字x分解成 x=2N + M
2.对于N+1使用进一步分解成N+1=2N1