Huffman 编码的估计

发布时间 2023-12-12 11:54:41作者: EntropyIncreaser

\(\newcommand{\HH}{\operatorname{H}}\)

我们熟知一些说法, 比如一个二叉树如果第 \(i\) 个节点的访问次数是 \(w_i\), 那么最优的建树会使得总共访问节点次数是

\[O\left(\sum w_i \log \frac{W}{w_i}\right ) \]

量级的, 其中 \(W = \sum w_i\).

那么这个说法到底有多精确呢? 我们不妨考虑最常考虑的 Huffman 树问题, 也不妨把次数转化成频率, 设一个节点被访问的频率是 \(p_i\), 也即 \(\sum p_i = 1\), 那么我们希望一次随机访问期望深度是

\[O\left( \sum p_i \log \frac 1{p_i} \right), \]

这正是信息熵的式子, 写作 \(\HH (p) = \sum p\log(1/p)\).

下界

我们首先证明任何树, 随机访问的深度都至少是 \(\HH_2(p)\).

当合并两个频率分别为 \(x, y\) 的子树时, 我们会支付 \(x+y\) 的代价, 而注意到

\[ \begin{align*} &\quad (x+y)\log_2(x+y) - x\log_2 x - y\log_2 y\\ &= x\log_2 \left(1 + \frac y x \right) + y\log_2 \left(1 + \frac x y\right)\\ &= x\left[\log_2 \left(1 + \frac y x \right) + \frac y x\log_2 \left(1 + \frac x y\right)\right]\\ &\leq x \left[1 + \frac y x\right]\\ &= x + y, \end{align*} \]

我们利用这个裂项, 可以得到期望深度的下界.

上界

为了证明上界, 最好的方法就是直接构造一个.

Kraft 不等式. 如果对于一些非负整数 \(\ell_i\),

\[\sum 2^{-\ell_i} = 1, \]

当且仅当存在一个二叉树, 所有叶子节点构成深度的多重集是 \(\ell_i\).

证明. 留作习题. \(\square\)

上面这个不等式看起来很简单, 但有了它之后, 事情就简单很多了.

我们设 \(\ell_i = \lceil \log_2 (1/p_i)\rceil\), 这个时候就有

\[\sum 2^{-\ell_i} \leq \sum 2^{-\log_2(1/p_i)} = \sum p_i = 1, \]

所以我们稍微调整一下, 把一些 \(\ell_i\) 变小, 使得总和为 \(1\), 此时有 \(\ell_i' \leq \lceil \log_2 (1/p_i)\rceil\), 且根据 Kraft 不等式, 存在这么一颗二叉树实现它.

这个时候, 我们有期望深度

\[= \sum p_i \ell'_i \leq \sum p_i(\log_2 (1/p_i) + 1) = \HH_2(p) + 1. \]

综上, 我们有期望深度一定在 \(\HH_2(p)\)\(\HH_2(p) + 1\) 之间.