最优二叉树(赫夫曼树)
路 径:由一结点到另一结点间的分支所构成。
路径长度:路径上的分支数目。a→e的路径长度=2
树的路径长度:从树根到每一结点的路径长度之和。树长度=10
结点的权:一些应用中,赋予树中结点的一个有某种意义的实数。
带权路径长度:结点到根的路径长度与结点上权的乘积。
树的带权路径长度:树中所有叶子结点的带权路径长度之和。
赫 夫 曼 树:带权路径长度最小的树。
Huffman树的构造
构造赫夫曼树的基本思想:
权值大的结点用短路径,权值小的结点用长路径。
构造Huffman树的步骤(即Huffman算法):
(1) 由给定的 n 个权值{w1, w2,
…, wn},构造具有 n 棵二叉树的集合F =
{ T1, T2,
…, Tn},其中每棵二叉树 Ti中只有一个带权为 wi的根结点,其左、右子树均为空。
(2) 在 F 中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
(3) 在 F 中删除这两棵树,同时将新得到的二叉树加入F中。
(4) 重复(2)和(3), 直到 F 只含一棵树为止。这棵树便是赫夫曼树。
构造Huffman树的步骤:
操作要点1:对权值的合并、删除与替换 ——在权值集合{7,5,2,4}中,总是合并当前值最小的两个权
操作要点2:按左0右1对Huffman树的所有分支编号!
特点:每一码都不是另一码的前缀,绝不会错译! 称为前缀码
前缀编码:指的是,任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。
前缀编码保证了在解码时不会有多种可能。
Huffman编码:
利用赫夫曼树可以构造一种不等长的二进制编码,并且构造所得的赫夫曼编码是一种最优前缀编码,即使所传电文的总长度最短。
赫夫曼编码的基本思想是:
概率大的字符用短码,概率小的用长码。由于赫夫曼树的WPL最小,说明编码所需要的比特数最少。这种编码已广泛应用于网络通信中。
例如:
假设用于通信的电文仅由8个字母{ a, b, c, d, e, f, g, h } 构成,它们在电文中出现的概率分别为{ 0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10 },试为这8个字母设计哈夫曼编码。如果用0~7的二进制编码方案又如何?
解:
先将概率放大100倍,以方便构造哈夫曼树。权值集合 w={ 7, 19, 2, 6, 32, 3, 21, 10 }, 按哈夫曼树构造规则(合并、删除、替换),可得到哈夫曼树。