含可替换符号E的三面骰子序列的最优有损熵编码技术问询
我们知道,用算术编码可以给独立的偏置硬币翻转序列编码,做到每翻转不到1比特的效率。比如一个正面概率$p=0.8$的硬币,我们可以用熵值$H_b(p)=-p\log_2\left(p\right)-(1-p)\log_2\left(1-p\right)\approx 0.7$比特来编码每一次翻转,这是理论最小值。
现在考虑一个有三个面的骰子,面分别是$H$(正面)、$T$(反面)、$E$(任意)。这里的核心是,编码的时候我们可以选择把$E$替换成$H$或者$T$——这属于有损压缩,因为我们会丢失原始序列中哪些位置是$E$的信息。
举个具体例子:
假设$p_H=p_T=p_E=\frac{1}{3}$,待编码序列是$S=EHTETHETET...$
第一种基础编码方法:
- 直接把所有$E$替换成$H$,得到序列$S'=HHTHTHHTHT...$,然后用算术编码处理,此时$H$的有效概率$p_H'=\frac{2}{3}$,这种方法大概需要0.92比特/次骰子投掷。
第二种更优的分组编码方法:
更好的策略是把连续的投掷两两分组,然后按照如下规则替换:
| 原始分组 | 替换结果 |
|---|---|
| HE | HH |
| EH | HH |
| TE | TT |
| ET | TT |
| EE | TT |
处理后得到$S'=HHTTTHTTTT...$,再对分组后的结果用算术编码。此时分组的概率分布为$p_{TT}'=\frac{4}{9}$,$p_{HH}'=\frac{3}{9}$,$p_{HT}'=p_{TH}'=\frac{1}{9}$,计算下来大概需要0.88比特/次骰子投掷,比第一种方法更高效。
我现在有两个核心问题想请教:
- 给定概率$p_H,p_T,p_E$(满足$p_H+p_T+p_E=1$),编码这样的骰子序列,每一次投掷最少需要多少比特?
- 是否存在(实用的)编码和解码算法,能够(接近)达到这个最优效率?
我自己尝试过用谷歌和ChatGPT查找这个问题的名称,也查看了一些标记为「压缩」的相关问题,但除了考虑分块编码的思路之外,不知道该怎么进一步入手。另外我推导了一个比特数的平凡下界:$(1-p_E)H_b(\frac{p_H}{p_H+p_T})$,这个下界的推导思路是假设解码器拥有额外信息——知道原始序列中所有$E$的位置。
备注:内容来源于stack exchange,提问作者AnttiP

