第三章 打破香农熵
信息熵仅仅从整个数据集符号的静态频率统计上考虑,把符号看作是孤立的个体,而忽视了符号之间的顺序(普遍联系),这使得将数据压缩到超越信息熵的限制成为可能。(马哲yyds)
第四章 变长编码
- Elias gamma encoding
- 2 N + L 2^N+L 2N+L
- 举例:42
- N = 5 , L = 10 N=5,L=10 N=5,L=10
- 两部分编码:11110,01010
- 最终编码:1111001010
- Elias delta coding
- 举例:12
- 二进制编码为1100,长度 C = 4 C=4 C=4
- C C C编码为100,二进制编码去掉最左边的1得到100
- 拼接:100100
- 确定 C C C的长度减一,用0计数:00
- 最终编码:00100100
- 问题
- 不能对齐到字节或字
- 为了解码,不得不记录额外信息,使得n过大时,编码长度趋于超过 log 2 ( n ) \log_2(n) log2(n)
- 解码慢(一次读一比特)
- varInt
- 小数少字节,大数多字节
- 字节最高位标记是否为该数的最后一个字节,剩余7比特用补码编码
- 小端编码
- 双赢:既有变长编码的灵活性,又有现代体系结构的效率
- 结论
- 选择与数据集符号概率分布的相匹配的变长编码
第五章 统计编码
Gorilla 浮点数异或编码
- 第一个数不压缩
- 如果与前一个数的异或值为0,只存储比特‘0’
- 如果与前一个数的异或值不为0,计算有意义部分的前导零和尾随零的数量,存储比特‘1’,然后根据情况后面跟随:
- a) 比特‘0’:如果有意义部分落在了上一个异或值的有意义部分内(前导零和尾随零的数量大于等于前一个异或值),只记录这部分内容(包括前后的部分0)
- b) 比特‘1’:5个比特记录前导零长度,6个比特记录异或值的有意义部分长度,后面跟随有意义部分
举个例子:
前一个数:12.0,0x4028000000000000
当前的数:24.0,0x4038000000000000
异或值:0x0010000000000000
假设小于前一个编码后的前导零数量,则先输出比特‘11’,然后该异或值有11个前导零,输出‘01011’,然后有意义部分长度为1,输出‘000001’,最后输出有意义的部分‘1’,最终24.0被编码为‘11010110000011’,从64比特压缩到14比特。