一、公式介绍
FSE(Finite State Entropy)是ANS(Asymmetric Numeral System)的一个具体实现,被应用在zstd压缩算法中,综合素质非常优异。本质是通过原字符串的信息加上新增字符后,通过新增字符的信息获取新的字符串的整体信息。即:
其中:
表示字符串中的单个字符; 表示字符串 的一个状态信息; 表示一个处理函数,通过原字符串的状态信息及新增的字符获取新字符串的状态信息;
状态信息
这里的状态信息指的是可以唯一表示一个字符串的一个数字。
对于一个二进制字符串
处理函数
对于一个状态信息
对于一个新字符串状态的信息熵,我们可以使用旧字符串状态的信息熵通过以下方式得到:
即:
其中:
表示字符串 的一个状态信息; 表示字符串的信息熵; 表示字符串中的单个字符 的信息熵; 表示单个字符 在字符串中出现的概率;
由于以上的公式是根据新增的字符
其中
二、应用
1. 编码
存在一个长度为
压缩前需要构建一个累计分布统计参数,用该值来唯一区分各个字符,即有:
其中:
假设字符流
则根据编码公式有:
其中:
为方便计算,整个过程中需要保持为整数运算,因此对
修正后的编码公式为:
最终对于字符串
- 字符集
; - 每个字符在字符串中出现的次数为
; - 字符串
的长度 ; - 状态值
。
2. 解码
解码过程就是对编码的公式进行反推,根据上一次的状态值
获取字符前需要先构建累计分布统计参数
其中
然后再根据上次状态值的余数判断一下范围:
其中
就可以确定当前位置的字符为:
获取当前状态值:
3. 量化状态值
实际压缩过程中,字符串的长度总是非常长的,状态值
同理,在解压的时候,当
三、拓展
1. tANS
tANS通过提前构建一个编码表来加速在编码过程中的运算过程。
编码表包含
假设下面是一个编码表A:
1 | 2 | 3 | … | |
---|---|---|---|---|
… | … | … | ||
… | … | … | … | … |
… | … | … | … |
压缩:
压缩字符
解压
通过上一个的状态值