Huffman 编码的估计
\(\newcommand{\HH}{\operatorname{H}}\)
我们熟知一些说法, 比如一个二叉树如果第 \(i\) 个节点的访问次数是 \(w_i\), 那么最优的建树会使得总共访问节点次数是
量级的, 其中 \(W = \sum w_i\).
那么这个说法到底有多精确呢? 我们不妨考虑最常考虑的 Huffman 树问题, 也不妨把次数转化成频率, 设一个节点被访问的频率是 \(p_i\), 也即 \(\sum p_i = 1\), 那么我们希望一次随机访问期望深度是
这正是信息熵的式子, 写作 \(\HH (p) = \sum p\log(1/p)\).
下界
我们首先证明任何树, 随机访问的深度都至少是 \(\HH_2(p)\).
当合并两个频率分别为 \(x, y\) 的子树时, 我们会支付 \(x+y\) 的代价, 而注意到
我们利用这个裂项, 可以得到期望深度的下界.
上界
为了证明上界, 最好的方法就是直接构造一个.
Kraft 不等式. 如果对于一些非负整数 \(\ell_i\),
\[\sum 2^{-\ell_i} = 1, \]当且仅当存在一个二叉树, 所有叶子节点构成深度的多重集是 \(\ell_i\).
证明. 留作习题. \(\square\)
上面这个不等式看起来很简单, 但有了它之后, 事情就简单很多了.
我们设 \(\ell_i = \lceil \log_2 (1/p_i)\rceil\), 这个时候就有
所以我们稍微调整一下, 把一些 \(\ell_i\) 变小, 使得总和为 \(1\), 此时有 \(\ell_i' \leq \lceil \log_2 (1/p_i)\rceil\), 且根据 Kraft 不等式, 存在这么一颗二叉树实现它.
这个时候, 我们有期望深度
综上, 我们有期望深度一定在 \(\HH_2(p)\) 到 \(\HH_2(p) + 1\) 之间.