哈夫曼(Huffman)树
引入:带权路径长度wpl
树 T 有 n 个叶子结点,若结点 k 的权值为wk ,到根结点的路径长为 lk ,那么结点 k 的值为 wk×lk,树 T 所有叶子结点的值之和记作 wpl(T)。
问题
给定实数 p1,p2,⋯,pn ,找一组由“0”或“1”组成的字符串 S1,S2,⋯,Sn 使得:
- 这 n 个字符串彼此不为前缀,
- 使 ∑i=1npn∣Sn∣ 最小。
例题:P1090合并果子
描述
给定 n 个实数 w1,w2,⋯,wn ,构造一棵有 n 个叶子结点的二叉树 T ,使得所有叶子结点的权值分别为 w1,w2,⋯,wn ,那么wpl最小的那些树称为Huffman树。
我们定义 W={w1,w2,⋯,wn} , wpl(W)=minwpl(T) , 其中树 T 有 n 个叶子结点,所有叶子结点的权值分别为 w1,w2,...,wn 。
当 ∣W∣>1 时,定义 W′=(W−{wi,wj})∪{wi+wj} ,那么 wpl(W)=wpl(W′)+wi+wj 。其中 wi,wj 为 W 中最小的两个数。
应用:Huffman编码
发电报:
将明文编码为01串,根据字符出现的频率编码,使电文总长最短。
思路1:等长编码
思路2:根据Huffman树编码