// Tunstall 编码——变长到定长的最优压缩
将变长符号序列映射为定长二进制码字。
根据符号概率分布构建最优字典。
定长码字使解码逻辑简单、实现高效。
Tunstall 编码首先从单字符开始构建字典,将变长符号序列映射到定长二进制码字。算法每一步选出当前概率最高的序列,用在其末尾拼接字符集中的所有符号来扩展字典,从而得到一个变长到定长的最优码,其中更高概率的序列拥有独立的码字。
文本:"aabaa",其中 P(a)=0.8,P(b)=0.2 构建字典(3 比特码): 初始:a, b 展开 "a":aa, ab 展开 "aa":aaa, aab 展开 "ab":aba, abb 最终字典(8 个码): aaa → 000 aab → 001 aba → 010 abb → 011 aa → 100 ab → 101 a → 110 b → 111 编码:"aabaa" → 001 100(aab + aa)
Tunstall 编码是一种“变长输入、定长输出”的熵编码方法。与 Huffman(定长输入、变长输出)不同,Tunstall 将变长源序列映射为定长码字,非常适合需要固定比特率的通信与存储系统。
Huffman:固定长度输入 → 变长输出(例如 “a” → “0”,“b” → “10”);Tunstall:变长输入 → 固定长度输出(例如 “aa” → “000”,“ab” → “001”)。Tunstall 更利于硬件实现和时钟同步,但压缩率通常略低于 Huffman。
从单个符号开始,反复执行:1)找到当前概率最高的序列;2)将其从字典中移除;3)把该序列与所有可能的单符号拼接得到的新序列加入字典;4)直到字典大小达到目标(n 比特码对应 2^n 个条目)。
Tunstall 编码常用于语音压缩、图像编码以及需要固定输出速率的自适应系统。对需要硬实时和流水线处理的硬件实现尤其友好。